我正在尝试根据给定的邮政编码计算最近的气象站。我有气象站的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 ???
有没有办法做到这一点,还是我需要手工写出数学?
答案 0 :(得分:2)
使用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字段。这将消除冗余的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