2009-12-14 10 views
6

क्या किसी को किसी बिंदु से दी गई दूरी के भीतर एक MySQL डीबी में सभी बहुभुज लाने का तरीका पता है? वास्तविक दूरी यह महत्वपूर्ण नहीं है क्योंकि यह बाद में प्रत्येक मिले बहुभुज के लिए गणना की जाती है, लेकिन यह "बंद" वाले बहुभुजों की गणना करने के लिए एक विशाल अनुकूलन होगी।एक लेट के करीब बहुभुज प्राप्त करें, लंबे समय तक MySQL

मैंने एमबीआर देखा है और इसमें फ़ंक्शंस हैं लेकिन समस्या यह है कि कुछ बहुभुज बिंदु के चारों ओर खींचे गए बाउंडिंग बॉक्स में निहित नहीं हैं क्योंकि वे बहुत बड़े हैं, लेकिन उनके कुछ शिखर अभी भी करीब हैं।

कोई सुझाव?

उत्तर

3

एक धीमी संस्करण (स्थानिक अनुक्रमित के बिना):

SELECT * 
FROM mytable 
WHERE MBRIntersects(mypolygon, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance)) 

स्थानिक अनुक्रमित का उपयोग करने के लिए, आपको इतना है कि प्रत्येक बहुभुज शिखर का अपना रिकॉर्ड में संग्रहित है अपनी मेज denormalize की जरूरत है।

SELECT DISTINCT polygon_id 
FROM vertices 
WHERE MBRContains(vertex, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance)) 

बातें और अधिक आसान है अगर आप की दुकान UTM अक्षांश के बजाय अपना डेटाबेस में निर्देशांक हो सकता है और होगा:

फिर क्षेत्र है जो कोने के निर्देशांक शामिल है और सिर्फ इस क्वेरी मुद्दे पर SPATIAL INDEX बनाने देशांतर।

+0

धन्यवाद एक गुच्छा! इसी तरह की समस्याओं वाले लोगों के लिए: मैंने रुचि के बिंदु के चारों ओर खींचे गए मंडल के एमबीआर का उपयोग करके समाप्त किया और उन सभी बहुभुजों को लाया जिनके एमबीआर ने सर्किल एमबीआर को छेड़छाड़ की। – Gren

+0

क्या आप मुझे बता सकते हैं कि 'दूरी' का अर्थ क्या है? क्या यह मील, किमी या मीटर में है? –

+1

@Sishavavogani: '@ distance' एक चर है जो उस दूरी को रखता है जिसमें आप खोज रहे हैं। यह मील या किमी या मीटर, या किसी अन्य दूरी इकाई में हो सकता है, बशर्ते आप एक ही इकाइयों में निर्देशांक स्टोर करें। – Quassnoi

1

मुझे नहीं लगता कि इसका एक जवाब है। यह आम तौर पर आपके डेटा को व्यवस्थित करने का सवाल है ताकि यह आपकी समस्या के निहित विशाल क्षेत्र का उपयोग कर सके।

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

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

0

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

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