2012-07-12 14 views
6

मेरे पास कुछ ऑब्जेक्ट्स हैं जो भू-स्थानीयकृत हैं (मेरे पास अक्षांश + देशांतर प्रत्येक वस्तु के लिए है)। मेरी ऐप को उन वस्तुओं को प्रदर्शित करने की आवश्यकता है जो मोबाइल डिवाइस की जीपीएस स्थिति के आसपास 3 किलोमीटर हैं। मेरे पास कई हजार वस्तुएं हैं और वे बड़े क्षेत्र में स्थानांतरित हैं (उदाहरण के लिए, कई अमेरिकी राज्य, कई छोटे देश), जिसका अर्थ है मेरी वस्तुओं की सूची में, मैं एनवाईसी में स्थित एक और मियामी में एक और हो सकता हूं लेकिन मैं भी वस्तुओं जो बहुत करीब हैं (कुछ मीटर)।त्वरित खोज के लिए भौगोलिक डेटा को क्रमबद्ध करने के लिए कैसे करें

वर्तमान में, मेरी ऐप एक पुनरावृत्ति खोज करता है। प्रत्येक ऑब्जेक्ट्स के लिए मैं जीपीएस स्थिति के साथ दूरी की गणना करता हूं और यदि दूरी < = 3 केएम है तो मैं ऑब्जेक्ट रखता हूं और मैं इसे अनदेखा करता हूं। यह एल्गोरिदम बहुत कुशल नहीं है और मैं एक एल्गोरिदम की तलाश में हूं जो बेहतर प्रदर्शन प्रदान करेगा।

मुझे लगता है कि भौगोलिक समन्वय का उपयोग करके मेरी वस्तुओं को सॉर्ट करने का एक तरीका है और जीपीएस स्थिति के आस-पास स्थित वस्तुओं को और तेज़ी से ढूंढने के लिए अगला तरीका है।

मेरा वर्तमान विचार खोज क्षेत्र को सीमित करने के लिए "चरम बिंदु", उत्तर/दक्षिण/पूर्व/पश्चिम (जीपीएस स्थिति के 3 किमी से) के साथ आयत की गणना करना है। इसके बाद मैं केवल इस बॉक्स के अंदर वस्तुओं के लिए दूरी की गणना करूंगा। मैं कुछ बेहतर किया जा सकता है, लेकिन मैं विचार नहीं है ...

किसी भी प्रस्ताव की सराहना की होगी ;-) धन्यवाद,

Séb लगता है।

उत्तर

4

एक nearest neighbor search की तरह लगता है, लेकिन पड़ोसियों की एक अधिकतम संख्या (KNN के रूप में) के साथ नहीं है, लेकिन एक अधिकतम दूरी सीमा के साथ।

एक सामान्य दृष्टिकोण वस्तुओं को एक विशेष डेटा संरचना में रखना है ताकि खोज स्थान के बड़े हिस्सों को तेजी से बाहर निकालने की अनुमति मिल सके। हालांकि, इन्हें आमतौर पर यूक्लिडियन रिक्त स्थान के साथ दिमाग में बनाया जाता है, न कि गोलाकार (लेट/लॉन-) विमान (लपेटने के आसपास के मुद्दों) के लिए। इसलिए, आप शायद गोले के केंद्र के लिए एक कार्तीय प्रणाली रिश्तेदार में 3 डी निर्देशांक को अपने निर्देशांक परिवर्तित करने के लिए इससे पहले कि आप अपने वस्तुओं के लिए कुशलता से खोज करने के लिए निम्न डेटा संरचनाओं में से एक आवेदन कर सकते हैं आवश्यकता होगी:

+1

मुझे लगता है कि लैट/लॉन में सीधे क्वाड्री लगभग सभी परिदृश्यों के लिए काम करता है। यदि देशांतर 0-360 है तो मैं इसे बदल दूंगा ताकि डेटा में "सीम" शून्य की बजाय दिनांक रेखा पर हो (इसलिए सभी मुद्दे केवल उत्तरी ध्रुव, दक्षिण ध्रुव और प्रशांत में होंगे) । –

+0

वास्तव में धन्यवाद, मैं ऑक्ट्री और केडी-पेड़ का अध्ययन करूंगा। यदि मेरे छोटे दिमाग के लिए बहुत जटिल नहीं है, तो शायद यह इसके साथ कुछ कर सकता है! – sebastien

1

स्थानिक अनुक्रमित उल्लेख अन्य उत्तर सही हैं, लेकिन जरूरी नहीं कि आप के लिए सबसे आसान समाधान।

मैं कुछ आसान मानता हूं: घने शहरों में कुछ स्थलों द्वारा (जहां आपके पास बहुत ऑब्जेक्ट्स हैं) देश द्वारा आइटम, फिर क्षेत्र, शहर, और अंत में वस्तुओं को समूहित करें।

फिर आपको अपने मोबाइल ऐप में उन्नत डेटा संरचनाओं को लागू किए बिना, केवल कुछ प्रश्नों को जांचने की आवश्यकता होगी (जांचें कि मैं कौन सा देश हूं, कौन सा राज्य, क्षेत्र इत्यादि) ।

+0

और यदि मैं एक क्षेत्र सीमा के पास हूं तो क्या होगा? – smocking

+0

@smocking: उन सभी में खोजें। यह शायद दुर्लभ होगा, और आपको बहुत ज्यादा धीमा नहीं करेगा। –

0

एक विशेष डेटास्ट्रक्चर के बिना ऐसा करने का एक तरीका आपके डेटा की दो प्रतियों को सॉर्ट करना प्रतीत होता है - एक बार अक्षांश द्वारा, एक बार अक्षांश द्वारा। कुछ भी जो बाइनरी दोनों लेट और लम्बे समय पर बंद करने के लिए खोज करता है, करीब है।

इसी तरह, आप अपने सामान्य ट्रेप (तेज) या लाल-काले पेड़ (कम परिवर्तनशीलता) का उपयोग कर सकते हैं।

लेकिन शायद आर-पेड़ या केडी-पेड़ का उपयोग करने के फायदे हैं। मैंने जो वर्णन किया है वह शायद नई निर्भरताओं को लेने से बचने के लिए है या स्क्रैच से एक नया डेटास्ट्रक्चर कोडिंग से बचने के लिए है।

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

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