2008-09-22 16 views
12

मैं किसी दिए गए पते से निकटता के अनुसार क्रमबद्ध संग्रहीत पते की एक सूची प्रदर्शित करने के लिए एक तरीका लागू करना चाहता हूं।दो पते के बीच दूरी की गणना के लिए कौन सी पूर्व-मौजूदा सेवाएं मौजूद हैं?

सूची में पते डेटाबेस तालिका में संग्रहीत किए जाएंगे। अलग-अलग हिस्सों में अलग-अलग फ़ील्ड होते हैं (हमारे पास डाक कोड, शहर का नाम इत्यादि के लिए फ़ील्ड हैं) इसलिए यह केवल एक विशाल varchar नहीं है। ये उपयोगकर्ता द्वारा दर्ज किए गए हैं और सिस्टम की प्रकृति के कारण हमेशा पूरा नहीं हो सकता है (कुछ डाक कोड गायब हो सकते हैं और अन्य शहर और राज्य से थोड़ा अधिक हो सकते हैं)।

हालांकि यह एक इंट्रानेट एप्लिकेशन के लिए है, मुझे इंटरनेट संसाधनों और इस तरह के बाहरी संसाधनों का उपयोग करने में कोई समस्या नहीं है। मैं वास्तव में अपने आप को रोलिंग करने के लिए पसंद करता हूं जब तक कि यह खुद को करने के लिए तुच्छ नहीं होगा। अगर Google या याहू! पहले से ही एक मुफ्त सेवा प्रदान करता है, मैं इसे जांचने के लिए तैयार हूं। कीवर्ड यह मुफ़्त होना चाहिए, क्योंकि इस सुविधा के लिए इस परियोजना पर कोई अतिरिक्त लागत शुरू करने की स्वतंत्रता नहीं है क्योंकि यह पहले से ही बोनस "पेर्क" बोलने के लिए है।

मैं इस बारे में सोच रहा हूं कि कई ईंट & मोर्टार की दुकानें "एक स्थान खोजें" सुविधा करें। इसे उचित रूप से क्रमबद्ध एक साधारण तालिका में दिखा रहा है और दूरी (में, कहें, मील) प्रदर्शित करना बहुत अच्छा है। नक्शा मैश-अप दिखाना भी कूलर है, लेकिन मैं निश्चित रूप से दूरी को वापस पाने के साथ ही रह सकता हूं और मुझे बाद के सभी प्रदर्शन और सॉर्टिंग को संभालने में सक्षम रहता है।

सरल दूरी एल्गोरिदम के साथ समस्या डेटा की प्रकृति है। चूंकि पते के सभी या हिस्से को अपरिभाषित किया जा सकता है, मेरे पास लेट/लांग कॉर्ड जैसे सुविधाजनक कुछ भी नहीं है। इसके अलावा, अगर मैं पोस्टल कोड आवश्यक करता हूं, तो 9 0% पते में शायद पांच डाक कोड होंगे।

हालांकि इसे तेजी से तेज होने की आवश्यकता नहीं है, लेकिन विलंबता के कारण पृष्ठ पर दिखाई देने वाली सात सेकंड से अधिक समय तक औसत उपयोगकर्ता के इंतजार के लिए बहुत लंबा समय हो सकता है, जैसा कि हम जानते हैं। यदि ऐसी एक काल्पनिक सेवा एक समय में एक से पूछताछ के बजाय पते पर एक बैच भेजने का समर्थन करती है, तो यह बहुत अच्छा होगा। फिर भी, मुझे नहीं लगता कि पते की सूची 50 कुल से अधिक हो जाएगी, अगर वह बहुत से हैं।

उत्तर

10

Google और Yahoo! दोनों geocoding सेवाएं मुफ्त में प्रदान करते हैं। आप Haversine formula (implemented in .NET or SQL) का उपयोग कर दूरी की गणना कर सकते हैं।दोनों सेवाएं आपको आंशिक खोज (केवल ज़िप कोड, केवल शहर) करने देगी और आपको बताएगी कि उनके परिणामों की सटीकता क्या है (ताकि आप सार्थक जानकारी के बिना स्थानों को बहिष्कृत कर सकें, हालांकि याहू! Google की तुलना में अधिक सटीक जानकारी प्रदान करता है)।

+0

मैं निश्चित रूप से इसमें देख लूंगा। हम पहले से ही, इस प्रणाली के दूसरे हिस्से के भीतर, याहू से लिंक! मनमाने ढंग से दर्ज पते के लिए स्थान जानकारी देने के लिए मानचित्र। लेकिन उस मामले में मुझे किसी भी तरह की निकटता की आवश्यकता नहीं थी ... –

+0

कृपया बताएं कि आपने किस समाधान का उपयोग किया है ... ताकि अन्य इससे भी लाभ उठा सकें ... मुझे भी एक ही समस्या है ... http:/Google के कठोर नियमों और शर्तों का जिक्र करने के लिए /stackoverflow.com/questions/7426710/how-to-find-the-distance-between-two-zipcodes-using-java-code – aProgrammer

1

क्या आप दूरी प्राप्त करने और उन्हें अपनी तरफ क्रमबद्ध करने के लिए Google मानचित्र API का उपयोग नहीं कर सकते हैं?

http://code.google.com/apis/maps/

+0

के बिना एक सदस्यता सेवा है सार्वजनिक/इंट्रानेट, मुझे Google मानचित्र API प्रीमियर का उपयोग करने की आवश्यकता होगी, जो गैर-मुक्त है। –

0

मैं गूगल मैप्स एपीआई की जांच कर रही सुझाव देना चाहेंगे।

यह एक बाहरी कनेक्शन होना (और यह एक वेब सेवा करने के लिए इस पर डेटा अलग धकेलना को ठीक होने के लिए) आप की आवश्यकता होगी, लेकिन यह 2 अंक और जो मार्ग के लिए पूछ रहा से आप क्या आवश्यकता होती है, अर्थात् दूरी प्रदान करता है इससे दूरी प्राप्त करना

API reference of the directions API

0

एक बात हम अपनी कंपनी में किया है धोखा और ज़िप कोड (मोटे तौर पर जिप कोड क्षेत्र के बीच में) के अक्षांश/देशांतर उपयोग करने के लिए है। यह सही नहीं है, लेकिन यह उन लोगों के लिए काफी करीब है जो मुझे वाई प्रकार की खोजों के एन मील के भीतर एक्स पाते हैं। यह विशेष रूप से सहायक होता है जब पता सफाई सेवाओं द्वारा पते को पहचाना नहीं जा सकता है।

कुछ बिंदु मैं एक नि: शुल्क जिप कोड में आए पर इस सन्निकटन में उपयोग करने के लिए उसे अक्षांश/देशांतर लुकअप तालिका। मुझे खेद है कि मेरे पास अब इसके लिए लिंक नहीं है।

+0

यह एक अच्छा विचार होगा अगर यह इस तथ्य के लिए नहीं था कि उनकी सूची में लगभग सभी स्थान ज़िप कोडों (यानी सभी एक ही मेट्रो क्षेत्र में) के भीतर रहेंगे और इसलिए यह सटीक नहीं होगा पर्याप्त मुझे नहीं लगता। लेकिन अभी भी देखने लायक हो सकता है ... –

4

Google मानचित्र API आपके उपयोग की शर्तों के कारण आपके लिए अच्छा नहीं है। हालांकि, याहू लंबे/लेट निर्देशांक में पते को बदलने के लिए एक आरईएसटी सेवा प्रदान करते हैं, जिसे आप दूरी की गणना करने के लिए उपयोग कर सकते हैं। इसका here है।

+0

+1 ..... – aProgrammer

0

किसी और ने इसे पहले से ही Daft Logic (संपादित करें: टाइपो) पर किया है। वे Great-circle formula के साथ Google मानचित्र API का उपयोग करते हैं। मुझे नहीं लगता कि इसे लागू करना मुश्किल है।

अद्यतन: व्यावहारिक रूप से, आपको केवल अपने पसंदीदा प्रदाता से निर्देशांक प्राप्त करने की आवश्यकता है, फिर अपने कोड के साथ गणना करें। जब आप अपना स्थान प्रदान करते हैं, तो आप दुकानों के निर्देशांक को प्रीलोड कर सकते हैं - आप इसे सत्यापन के लिए भी उपयोग कर सकते हैं। फिर, जब अनुरोध किया जाता है, तो आप केवल ग्राहक के स्थान को देख सकते हैं।

+0

नहीं आप DaftLogic मतलब है? ;) यह वास्तव में अच्छा है, यद्यपि। मैं उत्सुक हूं कि मैं इसे अपने डीबी से अंक के साथ कैसे लोड कर सकता हूं। वास्तव में, मुझे कुछ ऐसी चीज चाहिए जो बहुत तेज़ और "हाथ में" हो। हमारे उपयोगकर्ता इस सुविधा की सहायता के अनुरोधों के प्रकारों का जवाब देते समय सीमित समय के साथ काम करते हैं। –

2

उन्हें ज़िप कोड दर्ज करने की आवश्यकता है, फिर अक्षांश/देशांतर जोड़े (या एक ऑनलाइन ढूंढें) में डेटाबेस कोड मैपिंग ज़िप कोड बनाएं। मुझे नहीं पता कि यह कहां है जहां आप काम करते हैं लेकिन यहां पर, ज़िप कोड कई मीटर के लिए विशिष्ट हो सकता है, ताकि यह सटीक होना चाहिए। फिर दो ज़िप कोड के बीच की दूरी की गणना करने के लिए इस विधि का उपयोग करें:

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit) 
{ 
    double theta = lon1 - lon2; 
    double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + 
    Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta)); 
    dist = Math.Acos(dist); 
    dist = rad2deg(dist); 
    dist = dist * 60 * 1.1515; 
    if (unit == 'K') 
    { 
    dist = dist * 1.609344; 
    } 
    else if (unit == 'N') 
    { 
    dist = dist * 0.8684; 
    } 
    return (dist); 
} 

private static double deg2rad(double deg) 
{ 
    return (deg * Math.PI/180.0); 
} 

private static double rad2deg(double rad) 
{ 
    return (rad/Math.PI * 180.0); 
} 

एक जियोकोडिंग सेवा पर अपने स्वयं के कोड का उपयोग कर के लाभ है कि आप तो एक गुच्छा अधिक दिलचस्प गणना डेटा के विरुद्ध भी भंडारण के सामान के रूप में कर सकते हैं अपने डीबी में इसके साथ।

संबंधित मुद्दे