SQL服务器计算2组纬度/经度列之间的距离

SQL Server calculate distances between 2 sets of columns of latitude / longitude

我正在尝试计算距离给定邮政编码最近的气象站。我有气象站和邮政编码的 lat/lon 数据。我还有一种方法可以计算 2 个点的距离 (here)。我正在寻找的是一种创建具有多个实例距离的列的方法。

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 类型

您有重复的字段名称,所以我将它们重命名为 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

Returns

Edit - For your consideration

考虑向您的来源添加地理字段 table(s)。这将消除多余的 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