2013-09-25 5 views
11

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

enter image description here

मैं $near ऑपरेटर का उपयोग के बारे में सोचा लेकिन यह केवल एक इनपुट के रूप Point, नहीं LineString स्वीकार करता है।

कैसे mongodb इस प्रकार के प्रश्नों को संभाल सकता है?

+0

मुझे नहीं लगता कि संभव है है के लिए जाँच की जरूरत की सूची को कम करने के कर सकते हैं की जाँच करने के है। हालांकि, आप सड़क को 'बड़ा' कर सकते हैं और '$ बहुभुज' का उपयोग कर सकते हैं या 'पास के पास' का उपयोग कर सकते हैं और बाकी क्लाइंट-साइड कर सकते हैं या ओवरलैपिंग गोलाकारों के साथ '$ के पास 'श्रृंखला का उपयोग कर सकते हैं। – mnemosyn

+0

क्या आप सड़क को बढ़ाते हैं और $ बहुभुज का उपयोग करते हैं? – icaro56

+0

हाय, क्या आपको समाधान मिला? –

उत्तर

7

जैसा कि आपने बताया है, मोंगो वर्तमान में Point के अलावा कुछ भी समर्थन नहीं करता है। क्या आप एक रूट बॉक्सर की अवधारणा में आ गए हैं? 1 यह Google मानचित्र पर कुछ साल पहले बहुत लोकप्रिय था। आपके द्वारा खींची गई रेखा को देखते हुए, dist(x) के भीतर स्थित स्टॉप ढूंढें। यह लाइन में प्रत्येक बिंदु के चारों ओर बाध्यकारी बक्से की श्रृंखला बनाकर और बाल्टी के भीतर आने वाले बिंदुओं की खोज करके किया गया था।

मैंने आपके प्रश्न पर ठोकर खाई जब मुझे एहसास हुआ कि मोंगो केवल अंक के साथ काम करता है, जो मुझे लगता है कि उचित है।

मेरे पास पहले से ही कुछ विकल्प हैं कि यह कैसे करें (वे टिप्पणी में क्या कहते हैं @mnemosyn कहते हैं)। जिस डेटासेट पर मैं काम कर रहा हूं, उसके साथ यह क्लाइंट-साइड पर है, इसलिए मैं रूटबॉक्सर का उपयोग कर सकता हूं, लेकिन मैं प्रदर्शन कारणों से इसे सर्वर-साइड लागू करना चाहता हूं। यहाँ मेरी सुझाव हैं:

  1. तोड़ LineString अपने व्यक्तिगत में नीचे सेट समन्वय, और $near उन में से प्रत्येक के प्रयोग करने के लिए क्वेरी, परिणामों को जोड़ सकते हैं और एक अद्वितीय सेट निकालें। अंक की संख्या को कम करके, जटिल रेखा को सरल बनाने के लिए वहां एल्गोरिदम हैं, लेकिन एक साधारण लिखना आसान है।

  2. उपर्युक्त जैसा ही है, लेकिन संग्रहीत प्रक्रिया/फ़ंक्शन के रूप में। मैंने मोंगो के संग्रहीत कार्यों के साथ नहीं खेला है, और मुझे नहीं पता कि वे ड्राइवरों के साथ कितनी अच्छी तरह से काम करते हैं, लेकिन यह उपरोक्त पहले विकल्प से तेज़ हो सकता है क्योंकि आपको राउंडट्रिप्स नहीं करना होगा, और मशीन के आधार पर मोंगो का आपका उदाहरण (हैं) होस्ट किया गया है, गणना microseconds द्वारा तेजी से हो सकती है।

  3. रूटबॉक्सर दृष्टिकोण सर्वर-साइड को कार्यान्वित करें (PHP में किया गया है), और उसके बाद परिणामी बाउंडिंग बॉक्स $within स्टॉप खोजने के लिए उपर्युक्त 2 में से किसी एक का उपयोग करें। रूटबॉक्सर विधि आयताकार लौटने के बाद से हेक, इन सभी आयतों को अपने मार्ग को कवर करने वाले एक बहुभुज में विलय करना संभव होगा, और उस पर केवल $within करें। (क्या @mnemosyn सुझाव दिया)।

  4. संपादित करें: मैं इस के बारे में सोचा, लेकिन इसके बारे में भूल है, लेकिन यह एकत्रीकरण ढांचे का उपयोग करके उपरोक्त में से कुछ प्राप्त करने के लिए संभव हो सकता है।

यह कुछ है कि मैं जल्द ही (उम्मीद) पर काम करने जा रहा हूँ, मैं खुले स्रोत मेरी परिणाम (रों) आधारित है जिस पर मैं अंत के साथ जा रहा होगा।

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

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

[1]google maps utils routeboxer

0

जैसा कि आपने कहा मोंगो के $ के पास केवल अंक पर काम करता है नहीं केंद्र बिंदु लेकिन यदि आप लाइन के पास खोजने के अंक से अपने आधार फ्लिप तो बिंदु के पास लाइन लगाने के लिए के रूप में लाइनों आप केंद्र और लक्ष्य के रूप में रेखा के रूप में अपने अंक का उपयोग कर सकते हैं

इस

foreach line find points near it 

और

बीच का अंतर है
foreach point find line near it 

आप अंक की एक बड़ी संख्या nevi_me के जवाब के साथ इस गठबंधन अंक कि एक बहुत छोटे सबसेट

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