गणना की जटिलता के कारण मैं यूडीएफ का उपयोग करता हूं।
यहां आप परीक्षण के लिए लेट/लैंग के साथ आधार लेट/लैंग पास करते हैं
स्पष्ट होना: दूरी "जैसे कौवा उड़ता है" और ड्राइविंग दूरी नहीं है।
उदाहरण के लिए:
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
रिटर्न
यूडीएफ अगर दिलचस्पी है
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
आप कुछ दोहराव/समान मील देख सकते हैं। जैसा कि आप जानते हैं, शहरों के वैकल्पिक नाम हो सकते हैं, उदाहरण के लिए ब्राउन यूनिवर्सिटी और ब्राउन स्टेशन प्रोविडेंस, आरआई में है लेकिन संगठन का अपना ज़िप कोड भी हो सकता है।