SQL Server计算两组纬度/经度列之间的距离。

4

我正试图计算与给定邮政编码最接近的气象站。我拥有天气站和邮政编码的经纬度数据,同时我也有一种计算两点之间距离的方法(此处)。我正在寻找的是创建一个包含多个实例的距离的列的方法。

StationNum  lat     lon     Zip     lat      lon   distance
123         34.66   98.32   12345   33.78   91.91   ???
456         33.03   96.8    23456   35.23   92.23   ???
789         32.29   96.85   34567   33.09   92.68   ???

有没有一种方法可以做到这一点,还是我需要手写数学公式?

如果您将其转换为“GEOGRAPHY”CLR类型,则有一些内置的距离函数,我相信可以考虑到地球曲率等因素。如果您只需要欧几里得距离,我相信它也可以做到。请参见:https://learn.microsoft.com/en-us/sql/t-sql/spatial-geography/stdistance-geography-data-type - Xedni
1个回答

4

使用GEOGRAPHY类型

您有重复的字段名称,所以我将它们重命名为Lat1/Lon1和Lat2/Lon2。如果这是一个连接操作,请添加别名a.lat/a.lon b.lat/b.lon。

示例

Declare @YourTable Table ([StationNum] varchar(50),[lat1] float,[lon1] float,[Zip] varchar(50),[lat2] float,[lon2] float)
Insert Into @YourTable Values 
 (123,34.66,98.32,12345,33.78,91.91)
,(456,33.03,96.8,23456,35.23,92.23)
,(789,32.29,96.85,34567,33.09,92.68)

Select * 
      ,InMeters = GEOGRAPHY::Point([Lat1], [Lon1], 4326).STDistance(GEOGRAPHY::Point([Lat2], [Lon2], 4326))
      ,InMiles  = GEOGRAPHY::Point([Lat1], [Lon1], 4326).STDistance(GEOGRAPHY::Point([Lat2], [Lon2], 4326)) / 1609.344
 from @YourTable

返回

在此输入图片描述

编辑 - 供参考

考虑向您的源表添加一个地理字段。这将消除冗余的GEOGRAPHY::Point()函数调用。

Update YourTable Set GeoPoint = GEOGRAPHY::Point([Lat], [Lon], 4326)

那么距离的计算公式就是:

  ,InMeters  = A.GeoPoint.STDistance(B.GeoPoint) 
  ,InMiles   = A.GeoPoint.STDistance(B.GeoPoint) / 1609.344

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