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

Posted

技术标签:

【中文标题】SQL Server 计算 2 组纬度/经度列之间的距离【英文标题】:SQL Server calculate distances between 2 sets of columns of latitude / longitude 【发布时间】:2017-09-13 18:28:36 【问题描述】:

我正在尝试计算距给定邮政编码最近的气象站。我有气象站和邮政编码的纬度/经度数据。我还有一种方法可以计算 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 CLR 类型,我相信有一些内置的距离函数可以考虑到地球的曲率。如果您只需要欧几里得距离,我相信它也可以做到这一点。见:docs.microsoft.com/en-us/sql/t-sql/spatial-geography/… 【参考方案1】:

使用 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

【讨论】:

以上是关于SQL Server 计算 2 组纬度/经度列之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 从导入的 csv 计算纬度/经度点之间的距离?

sql server2008根据经纬度计算两点之间的距离

一组经度/纬度点之间的最大距离

使用纬度和经度返回 SQL Server 2008 中两个位置之间的距离

在 SQL Server 中使用纬度和经度查找两点之间的距离

在 SQL Server 中查找多边形内/最近的纬度/经度