在SQL SERVER中使用经纬度计算点之间的距离

4
我正在使用以下目的地。
[BMAnalytics].[dbo].[EUACTIVESTORES]

它有列

[Store No]
[Lat]
[Long]

我可以使用这些列进行自身连接[Store No],以便在两个列中列出每个商店之间的所有组合,并称为“源”和“目标”

然后,在第三列中,是否可以计算两者之间的距离?

我以前使用过以下内容,但这仅适用于一个单一的点对点:

DECLARE @source geography = 'POINT(0 51.5)'
DECLARE @target geography = 'POINT(-3 56)'

SELECT (@source.STDistance(@target))/1000

理想情况下,我希望能够得到每个分支之间的距离等信息。欢迎提供任何指导。
2个回答

3

这里是使用自连接的快速示例。

如果可以的话,建议向源表添加包含地理点的字段,从而消除每次运行查询时计算此值的需要。

示例

Declare @YourTable table ([Store No] int,Lat float,Lng float)
Insert Into @YourTable values
 (1,-8.157908, -34.931675)
,(2,-8.164891, -34.919033)  
,(3,-8.159999, -34.939999)  

Select [From Store] = A.[Store No]
      ,[To Store]   = B.[Store No]
      ,Meters       = GEOGRAPHY::Point(A.[Lat], A.[Lng], 4326).STDistance(GEOGRAPHY::Point(B.[Lat], B.[Lng], 4326))
 From  @YourTable A
 Join @YourTable B on A.[Store No]<>B.[Store No]

返回值

enter image description here

如果您可以添加地理字段,请进行编辑。


(注意:此处保留了HTML标签)
Update YourTable Set GeoPoint = GEOGRAPHY::Point([Lat], [Lng], 4326)

然后计算将会是:
,Meters = A.GeoPoint.STDistance(B.GeoPoint)

这很有帮助,但我需要声明每个商店的经纬度吗? - PeterH
@user91504 不需要。(at)YourTable只是用于演示的表变量。您可以删除SELECT语句上面的所有内容,并提供实际的表名。 - John Cappelletti

3

最终查询如下:

SELECT
      A.[STORE NO] AS 'SOURCE'
      ,B.[STORE NO] AS 'TARGET'
      ,CONVERT(DECIMAL(6,2),(((GEOGRAPHY::Point(A.[Lat], A.[Long], 4326).STDistance(GEOGRAPHY::Point(B.[Lat], B.[Long], 4326)))/1000)/8)*5) AS 'MILES'

FROM
      [bhxsql2014-dev].[BMAnalytics].[dbo].[EUACTIVESTORES] A
JOIN
      [bhxsql2014-dev].[BMAnalytics].[dbo].[EUACTIVESTORES] B on A.[Store No]<>B.[Store No]

WHERE 
         A.LAT        IS NOT NULL
     AND A.[STORE NO] IS NOT NULL
     AND B.LAT        IS NOT NULL
     AND B.[STORE NO] IS NOT NULL

干得好。FYI,要将米转换为英里,您可以使用 {meters}/1609.344。 - John Cappelletti

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