Aufgrund der Komplexität der Berechnung verwende ich eine UDF.
Hier übergeben Sie den Basislat/Lng zusammen mit dem zu testenden Lat/Lng
Um es klar zu sagen: Die Entfernung ist "Luftlinie" und NICHT Fahrstrecke.
Zum Beispiel:
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
Rückgabe
Die UDF bei Interesse
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
Möglicherweise bemerken Sie einige sich wiederholende/identische Meilen. Wie Sie vielleicht wissen, können Städte alternative Namen haben, z. B. Brown University und Brown Station befinden sich in Providence, RI, aber Organisationen können auch ihre eigene Postleitzahl haben.