सरल डीबी वर्तमान में किसी भी अंतर्निहित स्थानिक खोज संचालन की पेशकश नहीं करता है लेकिन इसका मतलब यह नहीं है कि यह नहीं किया जा सकता है। गैर-भू-स्थानिक रूप से जागरूक डेटाबेसों में भू-स्थानिक खोजों को कार्यान्वित करने के कई तरीके हैं जैसे कि सरल डीबी और उनमें से सभी डेटाबेस का उपयोग करने के विचार के आस-पास केंद्र को भू-स्थानिक सीमाबद्ध बॉक्स के आधार पर किसी न किसी पहले चयन को पुनर्प्राप्त करने के लिए और फिर अपने एप्लिकेशन में लौटाए गए डेटा को फ़िल्टर करके Haversine formula जैसे अधिक सटीक एल्गोरिदम।
आप सकता है दुकान अक्षांश और के रूप में (शून्य गद्देदार और सामान्यीकृत) संख्यात्मक विशेषताओं और उसके बाद एक डबल रेंज क्वेरी (lat >= minLat and lat <= maxLat and lon >= minLat and lon <= maxLat
) प्रदर्शन लेकिन जब से इन विधेय के न चयनात्मक हैं (प्रत्येक विधेय बहुत से आइटम से मेल खाता है) देशांतर यह आदर्श नहीं है (Tuning Queries देखें)।
GeoHashes का उपयोग करने का एक बेहतर तरीका होगा।
Geohashes मनमाना परिशुद्धता की तरह गुण, पास पदों के लिए इसी तरह की उपसर्गों , और धीरे धीरे कोड के अंत से वर्ण हटाने इसका आकार कम करने के लिए (और धीरे-धीरे परिशुद्धता खो) की संभावना प्रदान करते हैं।
एक व्यावहारिक उदाहरण के रूप में, Geohash 6gkzwgjzn820 डीकोड करने के लिए निर्देशांक -२५.३८२७०८ और -४९.२,६५,५०६, जबकि Geohash 6gkzwgjz होगा -25.383 और -49.266 को डिकोड, और हम एक ही क्षेत्र में एक ऐसी ही स्थिति ले अगर, जैसे -25.427 और -49.315, हम इसे 6gkzmg1w के रूप में एन्कोड किए गए देख सकते हैं (समान उपसर्ग को नोट करें)।
से http://geohash.org/site/tips.html
GeoHashes के रूप में अपने आइटम पदों के साथ
आप बाउंडिंग बॉक्स (where GeoHash like '6gkzmg1w%'
) के लिए खोज करने के लिए like
ऑपरेटर इस्तेमाल कर सकते हैं लेकिन जब से like
ऑपरेटर महंगा है (Comparison Operators) एक बेहतर तरीका denormalize होगा एक अलग विशेषता (GeoHash6 GeoHash8 आदि) के रूप में प्रत्येक जियोहाश उपसर्ग स्तर (आपके आवश्यक खोज परिशुद्धता पर कितने निर्भर करता है) को संग्रहीत करके डेटा और फिर एक साधारण समानता अनुमान (where Geohash8 = '6gkzmg1w'
) का उपयोग करें।
अब GeoHashes के नकारात्मक भाग पर। चूंकि आप अपने खोज बॉक्स में एक जियोहाश केंद्रित होने की कोई धारणा नहीं बना सकते हैं, इसलिए आपको सभी पड़ोसी उपसर्गों को भी खोजना होगा। प्रक्रिया उत्कृष्ट geohash-js
द्वारा वर्णित है Geohash भी संपत्ति के रूप में अंकों की संख्या कम हो जाती है कि (दाएं से) है, सटीकता साबित होता है। इस संपत्ति का उपयोग बाध्यकारी बॉक्स खोजों के लिए किया जा सकता है, क्योंकि एक दूसरे के नजदीक बिंदु समान भूहाश उपसर्ग साझा करेंगे।
हालांकि, क्योंकि एक भी बिंदु एक दिया Geohash बाउंडिंग बॉक्स के किनारे पर दिखाई दे सकते हैं, यह आवश्यक है ताकि एक बिंदु के आसपास एक सच्चे निकटता खोज करने के लिए में Geohash मानों की सूची उत्पन्न करने के लिए है। चूंकि जियोहाश एल्गोरिदम बेस -32 नंबरिंग सिस्टम का उपयोग करता है, इसलिए किसी अन्य दिए गए एक सरल लुकअप तालिका का उपयोग करके जियोहाश मान के आसपास भूहाश मान प्राप्त करने के लिए संभव है।
तो, उदाहरण के लिए, 1600 पेनसिल्वेनिया एवेन्यू, वाशिंगटन डीसी निराकरण करने के लिए: 38.897, -77,036
geohash एल्गोरिथ्म का उपयोग करना, यह अक्षांश और देशांतर के लिए बदल जाती है: dqcjqcp84c6e
एक साधारण सीमांकन बॉक्स चारों ओर इस बात द्वारा वर्णित किया जा सकता करने के लिए इस geohash छोटा:
हालांकि dqcjqc, 'dqcjqcp84c6e' 'dqcjqc' अंदर केंद्रित नहीं है, और खोज 'dqcjqc' भीतर कुछ वांछित targe वंचित हो सकते हैं ts।
तो इसके बजाय, हम जियोश के गणितीय गुणों का उपयोग पर जल्दी से 'dqcjqc' के पड़ोसियों की गणना कर सकते हैं; हम पाते हैं वे कर रहे हैं कि: 'dqcjqf', 'dqcjqb', 'dqcjr1', 'dqcjq9', 'dqcjqd', 'dqcjr4', 'dqcjr0', 'dqcjq8'
यह हमें बाउंडिंग बॉक्स के आसपास देता है ' dqcjqcp84c6e 'लगभग 2 किमी x 1.5km और केवल 9 कुंजी पर डेटाबेस खोज की अनुमति देता है: चयन करें * तालिका से जहां बाएं (geohash, 6) IN (' dqcjqc ', ' dqcjqf ',' dqcjqb ',' dqcjr1 ', 'dqcjq9', 'dqcjqd', 'dqcjr4', 'dqcjr0', 'dqcjq8');
एक SimpleDB क्वेरी कि where GeoHash6 in('dqcjqc', 'dqcjqf', 'dqcjqb', 'dqcjr1', 'dqcjq9', 'dqcjqd', 'dqcjr4', 'dqcjr0', 'dqcjq8')
होगा और फिर आप के लिए परिणामों पर अपने Haversine छानने करूँगा केवल आइटम अपनी खोज के दायरे में है कि प्राप्त करने के लिए अनुवादित।
बहुत बढ़िया जवाब, Geohashes पर चर्चा के लिए धन्यवाद:
यहाँ PHP में एक सरल उदाहरण और एक बहुत जटिल लग रही है, लेकिन बहुत आसान एक बार आप इसे SQL क्वेरी को समझते हैं – user293895