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

标签 sql sql-server tsql geolocation geography

我正在尝试计算距给定邮政编码最近的气象站。我有气象站的经纬度数据和邮政编码。我也有一种方法来计算 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

返回

enter image description here

Edit - For your consideration



考虑向源表添加地理字段。这将消除多余的 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 计算两组纬度/经度列之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46204513/

相关文章:

mysql - 如何避免MySQL更新中相关子查询分配中的多列

python - sqlalchemy 过滤多列

sql - 转义 JSON 输出的特殊字符

sql-server - 如何解析字符串并从中创建多个列?

mysql - sql server 中 where 子句中的 case 语句与 else 始终为真

php - 我可以使用复选框消除数据库中的最后一行

sql-server - 另一个多对多关系问题

sql-server - 什么会导致同一物理服务器上的两个 VM 之间出现延迟?

sql - 如何在sql server中创建依赖于其他列的默认约束

tsql - Service Broker 一次只接收一条消息