【问题标题】:How to calculate distance in "km" using a points geometry column to the nearest linestring geometry column in SQL Server spatial如何使用点几何列到 SQL Server 空间中最近的线串几何列计算“公里”距离
【发布时间】:2019-11-12 08:26:59
【问题描述】:

我希望创建一个字段,告诉我 2 个几何列之间的最近邻距离(以 km 为单位)。

我有一个带有几何场的点数据集和多线数据集。

我尝试了以下方法:

SELECT 
    p.GEOM.STDistance(l.GEOM) AS distance
FROM 
    [points] p, [dbo].[lines] l 

运行此查询后,我收到以下消息

消息 6522,第 16 级,状态 1,第 2 行
在执行用户定义的例程或聚合“几何”期间发生 .NET Framework 错误:
System.ArgumentException:24144:此操作无法完成,因为实例无效。使用 MakeValid 将实例转换为有效实例。请注意,MakeValid 可能会导致几何实例的点稍微移动。 System.ArgumentException:

你能帮我解决这个问题吗?

非常感谢!

谢谢!

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它
  • STDistance 特别适用于地理类型。您的几何列中可能有多种类型,例如:点、多边形和线串。
  • 正确,所以我不能在线上做点?

标签: sql-server spatial


【解决方案1】:

该错误似乎表明您在其中一个表中有错误的空间数据,但您使用的查询也存在问题。运行这个

select ID, geom.STisValid() from lines
and 
SELECT ID, geom.STisValid() from points

查看您是否有任何不良几何记录。如果你真的跑了

update table 'with bad spatial datatype'
set geom = geom.MakeValid()

确定空间数据有效后,重新编写查询以使用交叉连接(将每一行与每个点进行比较(并获取距离)并将结果存储在临时表中。
在临时表中查询每个点或线的最小(距离)。只要您只需要知道最近的特征而不是距离,您就可以使用几何数据完成所有这些操作。如果您需要以英尺或米为单位进行测量,则需要将数据从几何转换为地理。

如果您在任一表中都有大量特征,则交叉连接可能需要很长时间。尝试在一个子集上解决。

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 2020-09-25
    • 2015-12-03
    • 1970-01-01
    • 2018-03-14
    • 2018-08-26
    • 2010-11-26
    • 2021-10-16
    相关资源
    最近更新 更多