【问题标题】:SQL Geography Latitude/Longitude distance calcSQL 地理纬度/经度距离计算器
【发布时间】:2015-08-14 09:18:34
【问题描述】:

我无法使用我的表格格式使用地理来计算距离(以英里为单位)。

两个位置的纬度和经度并排:

id | A_Latitude | A_Longitude | B_Latitude | B_Longitude

我正在尝试获取A 的点以及B 的点,并返回AB 之间的距离(以英里为单位)。

我尝试了一些方法,包括类似于:

DECLARE @orig geography 
DECLARE @end geography
SELECT
@orig = geography::Point(A_LATITUDE, A_LONGITUDE, 4326) 
,@end = geography::Point(B_LATITUDE, B_LONGITUDE, 4326) 
FROM table1
SELECT 
    ROUND(@END.STDistance(@ORIG)/1609.344,2) AS MILES
    ,@END.STDistance(@ORIG) AS METERS
    ,table1.*
FROM table1;

我在所有行中获得英里和米的重复值。谁能建议我应该如何构建这个查询来得到我正在寻找的东西?

编辑:感谢 SQL Surfer!

WITH X AS 
(SELECT 
 geography::Point(A_LATITUDE, A_LONGITUDE, 4326) A
,geography::Point(B_LATITUDE, B_LONGITUDE, 4326) B
,ID
FROM TABLE1)

SELECT 
ROUND(X.B.STDistance(X.A)/1609.344,2) AS MILES
,X.B.STDistance(X.A) AS METERS
,T.*
FROM TABLE1 T
LEFT JOIN X ON T.ID = X.ID

【问题讨论】:

  • 两种选择。 1:放置 where 子句以在原始第一个查询中仅选择一条记录。或2:不要使用@vars,而是使用临时表将所有记录从第一部分带到查询的第二部分。如果您愿意,您实际上可以将它们组合成一个查询。
  • 完美,谢谢@Sql Surfer!我不确定这是如何工作的,您可以发布一个答案以便我将其标记为那个吗?

标签: sql sql-server sqlgeography


【解决方案1】:

这是我要做的:

WITH X AS 
(
   SELECT 
      geography::Point(A_LATITUDE, A_LONGITUDE, 4326) A
     ,geography::Point(B_LATITUDE, B_LONGITUDE, 4326) B
     ,*
   FROM TABLE1
)

SELECT 
   ROUND(B.STDistance(A)/1609.344, 2) AS MILES
   ,B.STDistance(X.A) AS METERS
   ,*
FROM X

如果您经常(并且在运行中)考虑这样做,请考虑将计算列添加到您的表中,不仅包括地理类型,还包括它们之间的距离。那时,它只是从表中进行的简单查询!

【讨论】:

  • 谢谢,它对我有用。
猜你喜欢
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2013-04-16
  • 2012-10-13
相关资源
最近更新 更多