【问题标题】:How to calculate distance of two points along line in TSQL如何在SQL中计算沿线两点的距离
【发布时间】:2015-11-29 06:57:40
【问题描述】:

我在 MSSQL 数据库中添加了代表 map.As 中路线的行,

update route
  set locationArray=geography::STGeomFromText('LINESTRING(7.068419558716859 80.140939950943,7.070868430303301 80.14106869697571,7.072976578922316 80.14136910438538,7.074339417352194 80.14203429222107,7.07631978477513 80.14278531074524,7.078491790888004 80.14435172080994,7.078300143701023 80.14649748802185,7.078449202631107 80.14877200126648,7.076617903866453 80.15068173408508,7.074978246481405 80.15248417854309,7.074105179783337 80.15490889549255,7.0723803358444135 80.15643239021301)', 4326)
  where routeID=45;

现在我选择了线上的两个点,我想计算这两条线之间的距离(不是直接距离或位移),类似于图像。

我尝试了 STLength() 函数和 STDistance() 函数。但它们都提供直接距离。有人可以帮我用 TSQL 计算沿线的距离吗?

【问题讨论】:

  • 你的意思是计算连续点的距离并相加吗?

标签: sql-server distance geography


【解决方案1】:

STLength (geometry Data Type)

返回 geometry 实例中元素的总长度。

STLength (geography Data Type)

返回 geography 实例中元素的总长度或 GeometryCollection 中的地理实例。

我在 Excel 中计算了每个段 SQRT(X*X + Y*Y) 的简单长度总和,并将其与 SQL Server 进行了比较。对于geometry 类型,Excel 给出了与STLength 相同的结果。 STLength计算从起点到终点的距离,它计算每个段的长度,然后按预期将它们相加。

DECLARE @G1 geometry  = geometry::STGeomFromText ('LINESTRING(7.068419558716859 80.140939950943,7.070868430303301 80.14106869697571,7.072976578922316 80.14136910438538,7.074339417352194 80.14203429222107,7.07631978477513 80.14278531074524,7.078491790888004 80.14435172080994,7.078300143701023 80.14649748802185,7.078449202631107 80.14877200126648,7.076617903866453 80.15068173408508,7.074978246481405 80.15248417854309,7.074105179783337 80.15490889549255,7.0723803358444135 80.15643239021301)', 4326);
DECLARE @G2 geography = geography::STGeomFromText('LINESTRING(7.068419558716859 80.140939950943,7.070868430303301 80.14106869697571,7.072976578922316 80.14136910438538,7.074339417352194 80.14203429222107,7.07631978477513 80.14278531074524,7.078491790888004 80.14435172080994,7.078300143701023 80.14649748802185,7.078449202631107 80.14877200126648,7.076617903866453 80.15068173408508,7.074978246481405 80.15248417854309,7.074105179783337 80.15490889549255,7.0723803358444135 80.15643239021301)', 4326);

SELECT @G1.STLength() AS LGeometry, @G2.STLength() AS LGeography;

结果

LGeometry             LGeography
0.0252888043080671    1809.85271737151

所以,STLength 工作正常,请检查您的代码。检查您使用的类型是否正确(geometrygeography)。

【讨论】:

  • 你说得对,弗拉基米尔。但我使用了地理数据类型。由于我检查 STLenth() 方法的方式而出现了问题。我选择了一条长度为 7.4 公里的路线,并得到了它的坐标非常接近(50m-150m)。但即使是那个近点也会产生巨大的误差并产生 6.873 公里的长度距离。当我使用 STStartPoint() 和 STEndPoint() 计算同一路线的起点和终点的位移时,我得到了 6.833 公里。所以我被自己的结果欺骗了。
猜你喜欢
  • 2018-07-14
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2021-05-01
  • 1970-01-01
  • 2020-12-08
  • 2019-12-09
相关资源
最近更新 更多