2010-04-16 16 views
10

मैं डंडस मैप्स का उपयोग कर रहा हूं और दुनिया का नक्शा आकर्षित करने का प्रयास कर रहा हूं जहां देशों को उन क्षेत्रों में बांटा गया है जो व्यवसाय कार्यान्वयन के लिए विशिष्ट हैं।भौगोलिक आकार समूह

मेरे पास दुनिया के प्रत्येक देश के लिए आकार डेटा (अंक और सेगमेंट) है। मैं एक क्षेत्र के देशों के लिए एक नए क्षेत्र के आकार के लिए सभी बिंदुओं और खंडों को जोड़कर देशों को क्षेत्रों में जोड़ सकता हूं।

foreach(var region in GetAllRegions()){ 
    var regionShape = new Shape { Name = region.Name }; 
    foreach(var country in GetCountriesInRegion(region.Id)){ 
     var countryShape = GetCountryShape(country.Id); 
     regionShape.AddSegments(countryShape.ShapeData.Points, countryShape.ShapeData.Segments); 
    } 
    map.Shapes.Add(regionShape); 
} 

समस्या यह है कि देश सीमा रेखाएं अभी भी एक क्षेत्र के भीतर दिखाई देती हैं और मैं उन्हें हटाना चाहता हूं ताकि केवल क्षेत्रीय सीमाएं दिखाई दें।

डुंडस बहुभुज एक ही बिंदु पर शुरू और समाप्त होना चाहिए। यह देश के सभी आकारों के लिए मामला है।

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

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

मुझे क्षेत्रीय सीमा को बनाए रखने की आवश्यकता यह है कि क्षेत्र के रंग सूचनाओं को संदेश देने में महत्वपूर्ण होंगे लेकिन निकटवर्ती क्षेत्र एक ही रंग हो सकते हैं। क्षेत्र देशों को शामिल या बहिष्कृत करने के लिए बदल सकते हैं और यही कारण है कि क्षेत्रीय आकार गतिशील होना चाहिए।

संपादित करें: अब मुझे पता है कि मैं जो देख रहा हूं वह बहुभुज का यूनियन है। एसक्यूएल सर्वर 2008 में स्थानिक कार्यों का उपयोग करके डेविड लीन explains how to do it जो एक विकल्प हो सकता है लेकिन मेरे प्रयासों को रोक दिया गया है क्योंकि परिणामस्वरूप बहुभुज संघ इतना जटिल है कि एसक्यूएल 43,680 अक्षरों पर इसे छोटा कर देता है। अब मैं इसके लिए एक समाधान खोजने की कोशिश कर रहा हूं या कोड में संघ करने का एक तरीका ढूंढ रहा हूं।

Regional Map

उत्तर

5

जब देशों समूहीकरण, मैं वहाँ आशा करता हूँ कोई ओवरलैप हो - आप एक काफी अनुभवहीन एल्गोरिथ्म है कि साझा कोने के लिए लग रहा है ले सकता है - एक साधारण दृश्य एक बहुभुज पर बिंदुओं के माध्यम से पुनरावृति करने के लिए हो सकता है, देखें कि यह आपके किसी भी अन्य बहुभुज पर है, और यह देखने के लिए कि कोई मैच है या नहीं, उसी अगली या पिछली बिंदु को साझा करता है। फिर बस अपने संघ

+0

दरअसल। अब मुझे बस एक एल्गोरिदम चाहिए। – grenade

+0

बस अपना जवाब कुछ बार पढ़ें और मुझे लगता है कि मैं समझता हूं कि आप क्या कह रहे हैं। अब इसे जाने वाला है। – grenade

+0

मुझे यह समझने के लिए मिल गया है कि कौन से शिखर साझा किए जाते हैं। बस एल्गोरिदम के माध्यम से काम करना जो यूनियन पॉलीगॉन को सही क्रम में unshared शीर्षकों को जोड़ता है ... – grenade

1

मानने के लिए साझा वर्टेक्स को हटाएं मान लें कि पड़ोसी देश सामान्य शिरोबिंदु और किनारों को साझा करते हैं (यदि नहीं, समस्या अधिक कठिन हो जाती है)।

प्रत्येक क्षेत्र के लिए, क्षेत्र के देशों से संबंधित पोयलों ​​के माध्यम से जाएं और शिखर और किनारों की एक सूची बनाएं। प्रत्येक किनारे में दो शीर्षकों के पॉइंटर्स होना चाहिए जो इसके अंत बिंदु हैं, और प्रत्येक चरम पर किनारों के पॉइंटर्स होना चाहिए, जिनके अंत में यह एक अंतराल है।

जैसे ही आप सूची में शिखर जोड़ते हैं, सुनिश्चित करें कि वे अद्वितीय शिखर हैं। दूसरे शब्दों में, यदि आप (x,y) निर्देशांक के साथ एक कशेरुक जोड़ रहे हैं, तो सूची में पहले से ही इस तरह के एक कशेरुक एक नया जोड़ा नहीं है। इसका मतलब है कि आपको संभावित रूप से सूची में पहले से मौजूद प्रत्येक नए कशेरुक को जांचना होगा।आप इस क्षेत्र के बाध्यकारी बॉक्स को तोड़कर, n x n डिब्बे को तोड़कर इसे तेज कर सकते हैं जिसमें आप कोष्ठक स्टोर कर सकते हैं। जब कोई नया चरम आता है, तो उसकी बिन देखें और उस बिन में अन्य शीर्षकों के विरुद्ध जांचें।

जैसे ही आप एज सूची में किनारों को जोड़ते हैं, वही काम करें - यदि कोई किनारा (v0, v1) जोड़ा जा रहा है, तो यह देखने के लिए जांचें कि कोई मौजूदा किनारा है (v0, v1) या (v1, v0) । इस मामले को छोड़कर, सूची से मौजूदा किनारे को खत्म करें, और नया किनारा न जोड़ें। ऐसा इसलिए है क्योंकि ये दो किनारे एक दूसरे को रद्द करते हैं - वे पड़ोसी देशों से आते हैं। और हटाए गए किनारे के अनुरूप वर्टेक्स सूची में एज पॉइंटर्स को खत्म करना न भूलें।

जब आप कर रहे हैं, तो आपके पास दो देशों द्वारा साझा किए गए किनारों की एक सूची होनी चाहिए। ये किनारों हैं जो इस क्षेत्र की सीमा बनाते हैं। आपको शीर्षकों की एक सूची भी होनी चाहिए, कुछ किनारों पर इशारा करते हैं, और अन्य किनारों पर इशारा करते हैं। पूर्व शिखर क्षेत्र सीमा पर हैं।

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

यदि एडजलिस्ट में कोई किनार शेष है, तो प्रक्रिया को फिर से शुरू करें ताकि एक और सीमा लूप निकालने के लिए प्रक्रिया शुरू हो जाए, और तब तक चलते रहें जब तक कि सभी सीमाओं को निकाला नहीं जाता है और edgelist खाली होता है।

मैंने एक अनुकूलन का उल्लेख किया है, जो कि शिखर को स्थानिक रूप से डिब्बे में व्यवस्थित करना है ताकि आप उन्हें अधिक समानता का परीक्षण कर सकें। एक और अनुकूलन सूचियों से भौतिक रूप से किनारों को हटाने से बचने के लिए है, लेकिन बस उन्हें 'हटाए गए' के ​​रूप में चिह्नित करने के लिए है।

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