2012-08-07 13 views
6

मैं जानना चाहता हूं कि लोग अमेज़ॅन वेब सर्विसेज SimpleDB में स्थानिक क्वेरी करने के कुशल तरीके के रूप में क्या सुझाव देते हैं?एडब्लूएस पर स्थानिक प्रश्न SimpleDB

स्थानिक क्वेरी से मेरा मतलब अक्षांश और देशांतर के दिए गए त्रिज्या में वस्तुओं को ढूंढना है।

उत्तर

14

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

+0

बहुत बढ़िया जवाब, Geohashes पर चर्चा के लिए धन्यवाद:

यहाँ PHP में एक सरल उदाहरण और एक बहुत जटिल लग रही है, लेकिन बहुत आसान एक बार आप इसे SQL क्वेरी को समझते हैं – user293895

0

मैं इसे यहां छोड़ने जा रहा हूं क्योंकि यह आपकी मदद कर सकता है!

14 साल पहले हमने त्रिज्या के भीतर स्थानों की भू-लुकअप तालिका करने की कोशिश की थी। स्पष्ट रूप से कोई भू-स्थानिक सूचकांक या ऐसा कुछ भी नहीं था। सचमुच केवल मानक एसक्यूएल और ओरेकल था ... वैसे भी, हमने सभी लेट/एलएनजी को एक निश्चित विमान क्षेत्र से किलोमीटर में परिवर्तित कर दिया। अनिवार्य रूप से भू-स्थानिक सूचकांक इन दिनों क्या करते हैं।

यह समझाने के लिए कि यह वास्तव में क्या करता है, यह दुनिया को एक सपाट सतह में बदल देता है और कुछ एसक्यूएल चालबाजी के साथ आप त्रिज्या द्वारा भी चयन कर सकते हैं, आप भी दो बिंदुओं से दूरी प्राप्त कर सकते हैं। चूंकि यह कच्चे पूर्ण पूर्णांक भी है, प्रश्न तेजी से चमक रहे हैं।

https://gist.github.com/tobsn/899413

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