2017-09-13 164 views
1

我正试图计算给定邮政编码的最近气象站。我有气象站和邮政编码的经纬度数据。我也有一种方法来计算距离2分(here)。我正在寻找的是创建具有多个实例距离的列的方法。SQL Server计算2组经度/纬度列之间的距离

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

如果转换到'GEOGRAPHY' CLR类型,还有一些建在距离其功能我相信可以考虑诸如地球之类的东西。如果你只需要欧几里德距离,我相信它也可以做到这一点。请参阅:https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/stdistance-geography-data-type – Xedni

回答

1

随着地理类型

所以他们改名为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

编辑 - 为您考虑

考虑在源表中添加一个地理区域。这将消除冗余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 
相关问题