Tôi sử dụng UDF do tính phức tạp của phép tính.
Tại đây bạn vượt qua Lat / Lng cơ sở cùng với Lat / Lng để được kiểm tra
Để rõ ràng: Khoảng cách là "như con quạ bay" chứ KHÔNG phải khoảng cách lái xe.
Ví dụ:
Declare @BaseZip varchar(10) = '02806'
Declare @Within int = 20
Select Distinct
BaseZip = A.ZipCode
,B.ZipCode
,B.CityName
,B.StateCode
,Miles = [dbo].[udf-Geo-Calc-Miles] (A.Lat,A.Lng,B.Lat,B.Lng)
From (Select Distinct ZipCode,Lat,Lng From [dbo].[ZipCodes] where [email protected]) A
Join [dbo].[ZipCodes] B
on [dbo].[udf-Geo-Calc-Miles] (A.Lat,A.Lng,B.Lat,B.Lng) <= @Within
Order By 5
Trả lại
UDF nếu quan tâm
CREATE Function [dbo].[udf-geo-Calc-Miles] (@Lat1 float,@Lng1 float,@Lat2 Float,@Lng2 float)
Returns Float as
Begin
Declare @Miles Float = (Sin(Radians(@Lat1)) * Sin(Radians(@Lat2))) + (Cos(Radians(@Lat1)) * Cos(Radians(@Lat2)) * Cos(Radians(@Lng2) - Radians(@Lng1)))
Return Case When @Miles is null then 0 else abs((3958.75 * Atan(Sqrt(1 - power(@Miles, 2)) / @Miles))) end
End
Bạn có thể nhận thấy một số dặm lặp lại / giống hệt nhau. Như bạn có thể biết, các Thành phố có thể có tên thay thế, ví dụ như Đại học Brown và Nhà ga Brown ở Providence, RI nhưng tổ chức cũng có thể có mã zip của riêng họ.