2008-11-03 27 views
21

कोई एप्लिकेशन निकटता खोज कैसे करता है? उदाहरण के लिए, कोई उपयोगकर्ता डाक कोड में टाइप करता है, तो एप्लिकेशन निकटता से आदेशित 20 मील के भीतर सभी व्यवसायों को सूचीबद्ध करता है।निकटता खोज

मैं PHP और MySQL में ऐसा कुछ बनाना चाहता हूं। क्या यह दृष्टिकोण सही है?

  1. गूगल के जियोकोडिंग सेवा
  2. साथ
  3. जियोकोड सभी पते मेरी डेटाबेस में मुझे जिन स्थानों में दिलचस्पी रखता हूँ और दुकान के लिए पते प्राप्त एक डेटाबेस क्वेरी कि Haversine सूत्र निकटता खोज और आदेश करने के लिए शामिल हैं लिखें

क्या यह ठीक है? चरण 3 में, मैं प्रत्येक क्वेरी के लिए निकटता की गणना करने जा रहा हूं। क्या यह एक प्रोपेसिटी टेबल होना बेहतर है जो प्रत्येक व्यवसाय और कुछ संदर्भ स्थानों के बीच की दूरी सूचीबद्ध करता है?

+1

यह भी देखें http://www.movable-type.co.uk/scripts/latlong.html#cosine-law – Arjan

उत्तर

9

यदि गति के लिए पर्याप्त रिकॉर्ड हैं, तो समय से पहले उन्हें अनुक्रमणित करने का एक तरीका यहां दिया गया है।

एक तरफ 20 मील की दूरी पर डिब्बे की ग्रिड परिभाषित करें। प्रत्येक स्टोर के रिकॉर्ड के साथ बिन संख्या स्टोर करें। खोज समय पर, अपने खोज बिंदु से 20-मील त्रिज्या को छेड़छाड़ करने वाले सभी डिब्बे की संख्याओं की गणना करें। फिर उन सभी डिब्बे में सभी स्टोर पुनर्प्राप्त करें, और पहले की तरह आगे बढ़ें।

2

हम इसे लगभग 1200 स्थानों के लिए करते हैं। मैं फ्लाई पर हावरसिन फॉर्मूला का उपयोग करता हूं हालांकि आपके आवेदन के आधार पर, एसक्यूएल के बजाय इसे PHP में स्टोर करना बेहतर हो सकता है। (हमारा कार्यान्वयन .NET में है इसलिए आपका मिलेज भिन्न हो सकता है)।

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

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

हम वास्तव में हमारे डेटाबेस में सभी संभावित संयोजनों को संग्रहीत करने पर विचार करते थे। हकीकत में ऐसा लगता है कि यह एक बड़ा डेटा स्टोर हो सकता है, लेकिन यह वास्तव में चीजों के बड़े दायरे में नहीं है। इंडेक्स के साथ यह काफी तेज़ हो सकता है, और आपको एल्गोरिदम ऑप्टिमाइज़ेशन इत्यादि के बारे में चिंता करने की ज़रूरत नहीं है। हमने इसके खिलाफ फैसला किया, क्योंकि हमारे पास सी # में समीकरण था, और इसने हमें सभी गणनाओं को करने के लिए आवश्यक जानकारी को कैश करने की अनुमति दी व्यापार स्तर या तो ठीक काम करेगा, यह सिर्फ आपकी बात है कि आपकी वरीयता क्या है।

11

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

Haversine forumla शुरू करने के लिए एक अच्छी जगह है।

हमारे पास फ्लाई पर दूरी की गणना करने में प्रदर्शन की समस्याएं नहीं हैं, हम कुछ अनुप्रयोगों के लिए समय से पहले इसकी गणना करते हैं जहां हम समय से पहले अंक जानते हैं और लाखों रिकॉर्ड होने जा रहे हैं।

SELECT 
     [DistanceRadius]= 
     69.09 * 
     DEGREES(
      ACOS(
      SIN(RADIANS(latitude))*SIN(RADIANS(@ziplat)) 
      + 
      COS(RADIANS(latitude))*COS(RADIANS(@ziplat)) 
      * 
      COS(RADIANS(longitude - (@ziplon))) 
     ) 
     ) 
     ,* 
     FROM 
      table 

    ) sub 
WHERE 
    sub.DistanceRadius < @radius 
संबंधित मुद्दे