SQL 地理位置纬度/经度距离计算

4

我在使用地理位置计算两个地点之间的英里数时遇到了麻烦,这是我的表格格式。

两个地点的纬度和经度并排显示:

id | A_Latitude | A_Longitude | B_Latitude | B_Longitude

我想要获取点A和点B,并返回它们之间的距离(单位为英里)。

我尝试过几种方法,包括类似以下代码:

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 Surfer!我不确定这是如何工作的,您能发表一个答案,以便我可以将其标记为正确答案吗? - Onohalp
1个回答

6

以下是我会做的:

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

如果您经常需要进行这种操作(并且随时需要),考虑在表中添加计算列,不仅包括地理类型,还包括它们之间的距离。到那时,从表中查询就非常简单了!


谢谢,这对我有效。 - Hardeep Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接