2010-12-01 10 views
9

लेट/लॉन/एलिवेशन जोड़े से युक्त एक ऊंचाई मानचित्र को देखते हुए, दिए गए ऊंचाई स्तर के ऊपर सभी बिंदुओं को खोजने का सबसे तेज़ तरीका क्या है (या बेहतर अभी तक, केवल 2 डी अवतल हल)?किसी दिए गए ऊंचाई से ऊपर के इलाके को तुरंत ढूंढें और प्रस्तुत करें

मैं एक जीआईएस ऐप पर काम कर रहा हूं जहां मुझे मानचित्र के शीर्ष पर एक ओवरले प्रस्तुत करने की आवश्यकता है ताकि उच्च ऊंचाई वाले क्षेत्रों को स्पष्ट रूप से इंगित किया जा सके; यह इस बहुभुज/क्षेत्र को निर्धारित कर रहा है जिसने मुझे स्टंप किया है (अभी के लिए)। मेरे पास लेट/लॉन/एलिवेशन जोड़े (अधिक विशेष रूप से, GTOPO30 डीईएम फाइलों) की एक सरल सरणी है, लेकिन मैं इसे किसी भी डेटा संरचना में बदलने के लिए स्वतंत्र हूं जिसे आप सुझाव देंगे।

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

उत्तर

0

मान लें कि आपके पास सरणी (या तीन अलग सरणी) में संग्रहीत अक्षांश/लोन/एलिवेशन डेटा है, तो आप उन सभी बिंदुओं का चयन करने के लिए सरणी पूछताछ तकनीकों का उपयोग करने में सक्षम होना चाहिए जहां ऊंचाई एक निश्चित दहलीज से ऊपर है। उदाहरण के लिए, numpy साथ अजगर में आप कर सकते हैं:

indices = where(array > value) 

और indices चर सीमा value से अधिक array के सभी तत्वों का सूचकांक शामिल होंगे। इसी प्रकार के आदेश कई अन्य भाषाओं में उपलब्ध हैं (उदाहरण के लिए आईडीएल में WHERE() कमांड है, और इसी तरह की चीजें मैटलैब में भी की जा सकती हैं)।

एक बार जब आप सूचकांक की इस सूची में आप एक नया बाइनरी सरणी जहां प्रत्येक जगह है जहाँ सीमा संतुष्ट था 1 पर सेट है बना सकते हैं मिल गया है:

binary_array[indices] = 1 

(आप की एक खाली सरणी बना लिया है मान लें आपके मूल अक्षांश/लंबे/ऊंचाई के समान आकार और इसे binary_array कहा जाता है।

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

+0

है कि निश्चित रूप से काम करेगा, लेकिन मुझे डर है कि यह बहुत अक्षम हो जाएगा हूँ - मैं प्रति वर्ग 1/2 मील 1 ऊंचाई बिंदु के पैमाने पर कुछ के साथ काम कर रहा हूँ, पूरे अमेरिका के लिए (हालांकि मैं केवल देखभाल करेंगे वर्तमान में स्क्रीन पर 100 या इतने वर्ग मील के बारे में)। मुझे स्क्रीन को बहुत तेज़ी से अपडेट करने की आवश्यकता होगी, क्योंकि हम आगामी बाधाओं के पायलटों को नजरअंदाज करने की इच्छा रखते हैं। – Charles

+1

गूंगा क्यू के लिए खेद है प्रश्न: क्या आप विमान यात्रा वेक्टर जानते हैं? यह शिल्प आगे बढ़ने वाले स्थान के लिए लेट/लम्बाई के खिलाफ फ़िल्टर करके डेटा प्रोसेसिंग को अनुकूलित करने के लिए शुरू करने के लिए एक अच्छी जगह होगी? – Aidanapword

0

मैं एक नेस्टेड C-squares व्यवस्था का उपयोग करता हूं, प्रत्येक वर्ग में पूर्व-गणना की अधिकतम जमीन ऊंचाई होती है। यह मुझे उच्च स्तर पर स्कैन करने की अनुमति देगा, किसी भी वर्ग को छोड़कर जहां अधिकतम ऊंचाई खोज ऊंचाई से ऊपर नहीं है, और उन वर्गों में आगे ड्रिलिंग करें जहां जमीन के कुछ हिस्सों की खोज ऊंचाई से ऊपर थी।

आप खोज ऊंचाई के विभिन्न सेट के स्तर के लिए काम कर रहे हैं, तो आप छोटी से छोटी वर्गों के लिए विभिन्न पूर्वनिर्धारित स्तरों के लिए उत्तल पतवार precalculate सकता है कि आप प्रयोग करने का फैसला (उस बात के लिए या सभी वर्गों,।)

+1

लेट/लांग/alt ट्रिपलेट्स को स्कोर करने पर विचार करें जैसे निकटतम लोग उच्चतम स्कोर करते हैं। फिर उन्हें सापेक्ष दूरी के बैचों में संभालें (10 मील, 20 मील, 50 मील ...? शिल्प कितनी तेजी से यात्रा करने जा रहा है ...? यह कोई जवाब नहीं है, लेकिन शायद एक नई दिशा में एक सूचक – Aidanapword

0

मुझे यकीन नहीं है कि आपका लैट/लॉन/alt अंक नियमित ग्रिड पर हैं या नहीं, लेकिन यदि नहीं, तो शायद उन्हें 100 'फीट ऊंचाई वृद्धि, और वर्दी लैट/लॉन डिवीजनों (असर) का प्रतिनिधित्व करने के लिए इंटरपोलेट किया जा सकता है ध्यान में रखते हैं कि यह एक समान दूरी विभाजन नहीं देता है)। लेकिन अगर यह काम करेगा, तो एक त्रि-आयामी सरणी का प्रीकंपूट क्यों नहीं करें, जहां सूचकांक क्रमशः ऊंचाई, अक्षांश और देशांतर का प्रतिनिधित्व करते हैं। फिर जब विमान को इलाके के ऊपर या ऊपर बिंदुओं के बारे में डेटा की आवश्यकता होती है, तो इलाके के एक विशिष्ट टुकड़े के लिए, कोड को केवल इस सरणी में डेटा के एक छोटे से हिस्से को पढ़ने की आवश्यकता होती है, जिसे संगत "वोक्सल्स" को संगत करने के लिए अनुक्रमित किया जाता है अनुक्रमण योजना।

बेशक, रेखांश में वृद्धि समान नहीं होनी चाहिए: यदि समान दूरी की आवश्यकता होती है, तो एक ही योजना काम करेगी, लेकिन देशांतर के लिए सूचकांक लंबे समय तक एक गैर-समान दूरी के सेट को इंगित करेंगे।

मुझे नहीं लगता कि इस डेटा को खोजने का कोई तेज़ तरीका होगा।

0

यदि आपके अंक से सेट स्थिर है तो आपको अपने प्रश्न से स्पष्ट नहीं है और आपको यह पता लगाना होगा कि कौन से बिंदु किसी दिए गए ऊंचाई से ऊपर हैं, या यदि आपको केवल एक बार क्वेरी करने की आवश्यकता है।

सबसे आसान समाधान केवल ऊंचाई को क्रमबद्ध करके सरणी में क्रमबद्ध करने के लिए है। एक निश्चित ऊंचाई सीमा में सभी बिंदुओं को ढूंढना सिर्फ बाइनरी खोज है, और आपको केवल एक बार क्रमबद्ध करने की आवश्यकता है।

यदि आपको केवल एक बार क्वेरी करने की आवश्यकता है, तो आपको प्राप्त करने के क्रम में सरणी के माध्यम से केवल एक रैखिक खोज करें। सरणी से एक फैनसीयर डेटा संरचना बनाना किसी भी तरह ओ (एन) होने वाला है, इसलिए आपको चीजों को जटिल बनाकर बेहतर परिणाम नहीं मिलेंगे।

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

यदि आप सभी की देखभाल करने की परवाह है, तो आप ग्राफिक्स हार्डवेयर का उपयोग करके इसे बहुत कुशलतापूर्वक कर सकते हैं, और फैंसी डेटा संरचना का उपयोग करने की कोई आवश्यकता नहीं है, आप केवल GPU को त्रिकोण भेज सकते हैं और इसे ऊपर के टुकड़े मार सकते हैं या एक निश्चित ऊंचाई के नीचे।

1

ऐसा लगता है कि आप उच्च भूमि की सीमा का बहुभुज प्रतिनिधित्व करने का प्रयास कर रहे हैं।

यदि आप रास्टर डेटा (आयताकार ग्रिड पर नमूना) के साथ काम कर रहे हैं, तो इसे आजमाएं।

सही ग्रिडलों की असेंबली के रूप में अपने ग्रिड के बारे में सोचें।

मान लीजिए कि आप अंक

  • एबीसी
  • की एक 3x3 ग्रिड करते डीईएफ़
  • ghk

आपका त्रिकोण हैं:

    आयत शय्या पर की
  • अब्द हिस्सा
  • bde आयत शय्या पर
  • आयत bcfe की
  • bef हिस्सा
  • के अन्य भाग आयत bcfe
  • dge के अन्य भाग CEF ... और इसलिए आपका एल्गोरिथ्म इन है

पर कदम।

  1. एलिवेशन थ्रेसहोल्ड से ऊपर त्रिकोणों की एक सूची बनाएं।

  2. पॉलीगोनल क्षेत्र बनाने के लिए इन त्रिकोणों का संघ लें।

  3. बहुभुज की सीमा निर्धारित करें।

  4. यदि आवश्यक हो, जब प्रदर्शित अपने परत ठीक लग रही बनाने के लिए बहुभुज सीमा चिकनी।

यदि आप अच्छी लग रही समोच्च रेखाएं उत्पन्न करने की कोशिश कर रहे हैं, तो चरण 4 को सही करना बहुत मुश्किल है।

चरण 1 इस समस्या की कुंजी है।

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

चरणों आप एक सभ्य 2 डी ज्यामिति प्रसंस्करण पुस्तकालय की आवश्यकता होगी के बाकी समय में

अपने अंक एक नियमित ग्रिड पर नहीं हैं, तो डेलॉनाय एल्गोरिथ्म (जो आप देख सकते हैं) का उपयोग कर त्रिकोण में अपने pointss को व्यवस्थित करने के द्वारा शुरू करते हैं। फिर ऊपर वर्णित उसी एल्गोरिथ का पालन करें। चेतावनी। यदि आपके पास कई अंक नहीं हैं तो यह स्केची की तरह दिखने जा रहा है।

+0

सिविल इंजीनियरिंग प्रयोजनों के लिए इस एल्गोरिदम का उपयोग न करें! जब तक आप राजमार्ग में बड़े पैमाने पर पडल नहीं चाहते हैं, तो आप उस उद्देश्य के लिए एक प्रशिक्षित कार्टोग्राफर और उच्च-रिज़ॉल्यूशन सर्वेक्षण प्राप्त करें। –

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