यहां कुछ ऐसा है जो मैंने कुछ समय पहले लिखा था जो आपको सही दिशा में शुरू कर सकता है।
जब आपने VB.Net के लिए कहा था, तो आपको वास्तव में एक ऐसी क्वेरी की आवश्यकता है जो "ग्रेट सर्कल दूरी "अक्षांश और देशांतर द्वारा पहचाने गए दो बिंदुओं के बीच की दूरी निर्धारित करने के लिए गणना।
तो, निम्नलिखित धारणाएँ बनाते हुए:
- आपका ज़िप कोड डेटा एक ही तालिका में है।
- कहा गया तालिका में lat और lon के लिए विशेषताएँ हैं जो ज़िप कोड के अनुमानित केन्द्रक हैं
आप LINQ से SQL क्वेरी का उपयोग कर सकते हैं जो कुछ इस तरह का उपयोग करके वांछित परिणाम सेट करता है
Const EARTH_RADIUS As Single = 3956.0883313286095
Dim radCvtFactor As Single = Math.PI / 180
Dim zipCodeRadius As Integer = <Your Radius Value>
Dim zipQry = From zc In db.ZipCodes
Where zc.Zip = "<Your Zip Code>" _
Select zc.Latitude,
zc.Longitude,
ZipLatRads = RadCvtFactor * zc.Latitude,
ZipLonRads = RadCvtFactor * zc.Longitude
Dim zipRslt = zipQry.SingleOrDefault()
If zipRslt IsNot Nothing Then
Dim zcQry = From zc In db.ZipCodes _
Where zc.Latitude >= (zipRslt.Latitude - 0.5) And zc.Latitude <= (zipRslt.Latitude + 0.5) _
And zc.Longitude >= (zipRslt.Longitude - 0.5) And (zc.Longitude <= zipRslt.Longitude + 0.5) _
And Math.Abs(EARTH_RADIUS * (2 * Math.Atan2(Math.Sqrt(Math.Pow(Math.Sin(((RadCvtFactor * zc.Latitude) - zipRslt.ZipLatRads) / 2), 2) + _
Math.Cos(zipRslt.ZipLatRads) * Math.Cos(RadCvtFactor * zc.Latitude) * _
Math.Pow(Math.Sin(((RadCvtFactor * zc.Longitude) - zipRslt.ZipLonRads) / 2), 2)), _
Math.Sqrt(1 - Math.Pow(Math.Sin(((RadCvtFactor * zc.Latitude) - zipRslt.ZipLatRads) / 2), 2) + _
Math.Cos(zipRslt.ZipLatRads) * Math.Cos(RadCvtFactor * zc.Latitude) * _
Math.Pow(Math.Sin((RadCvtFactor * zc.Longitude) / 2), 2))))) <= zipCodeRadius _
Select zc
End If
यह जटिल लगता है, क्योंकि यह है। यहां SO पर कहीं अधिक चतुर लोग हैं जो एल्गोरिथम की व्याख्या कर सकते हैं। मैंने इसे केवल इंटरनेट पर मिले कुछ SQL कोड से लागू किया - मुझे याद नहीं है कि मैं कहाँ से हूँ। एक Google खोज आपको वहां पहुंचा देगी।
पहली क्वेरी (zipQry) डिग्री और रेडियन दोनों में शुरुआती ज़िप कोड का अक्षांश और देशांतर लौटाती है। फिर इन परिणामों का उपयोग दूसरी क्वेरी को निष्पादित करने के लिए किया जाता है।
दूसरी क्वेरी में WHERE क्लॉज का पहला भाग:
Where zc.Latitude >= (zipRslt.Latitude - 0.5) And zc.Latitude <= (zipRslt.Latitude + 0.5) _
And zc.Longitude >= (zipRslt.Longitude - 0.5) And (zc.Longitude <= zipRslt.Longitude + 0.5) _
जांच किए जाने वाले ज़िप कोड की सूची को बस संकुचित कर दिया, जिससे क्वेरी बहुत तेजी से चलती है। यह अक्षांश और देशांतर में एक मनमाना राशि जोड़ता है ताकि आप कैलिफोर्निया में त्रिज्या की खोज करते समय ओहियो में सभी ज़िप कोड की जांच न करें। बाकी सभी उपरोक्त ग्रेट सर्कल डिस्टेंस एल्गोरिथम का हिस्सा हैं।
यह शायद अधिक दक्षता के लिए एक प्रश्न में किया जा सकता था, लेकिन मुझे उस समय इस तरह से इसकी आवश्यकता थी, जो अब मेरे लिए खो गए हैं।