बहुभुज का एक आकार दूसरे के बहुभुज के भीतर का प्रतिशत


13

मैं एक नौसिखिया हूँ, अगर यह स्पष्ट है तो माफी माँगता हूँ / पहले से ही पूछा और उत्तर दिया गया है लेकिन मुझे कुछ भी नहीं मिला।

मेरे पास दो आकार-प्रकार हैं: 1. यूके में एक काउंटी के लिए एक प्रशासनिक सीमा परत जिसे एलएसओए सीमा के रूप में जाना जाता है, जिसमें 500 छोटे क्षेत्र हैं एक बाढ़ क्षेत्र।

आदर्श रूप से मैं यह जानना चाहता हूं कि कौन से छोटे एलएसओए क्षेत्र बाढ़ क्षेत्र के भीतर within50% हैं और 500 एलएसओए क्षेत्रों में से प्रत्येक के लिए हां / नहीं या 1/0 के साथ समाप्त होते हैं।

लेकिन मुझे नहीं पता कि यह कैसे करना है। मुझे लगा कि मैं दो शेपफाइल्स में शामिल हो सकता हूं, लेकिन उनके बीच कोई सामान्य विशेषता नहीं है। तब मुझे लगा कि मैं जॉइन एट्रीब्यूट बाय लोकेशन फंक्शन का उपयोग कर सकता हूं, जो काम करता है और मुझे दिखाता है कि कौन से एलएसओए बाढ़ क्षेत्र में हैं, लेकिन उनमें से लगभग सभी हैं (चित्र 2 देखें)।

मुझे लगता है कि यह एक SQL समस्या है, लेकिन मुझे नहीं पता। मैं QGIS में नया हूँ और कभी भी PostgreSQL का उपयोग नहीं किया है।

किसी भी तरह की सहायता का स्वागत किया जाएगा। मैं आपकी प्यारी लोगों की जो भी जानकारी उपलब्ध करा सकता हूं, वह मेरी मदद कर सकती है।

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

जवाबों:


12

यह QGIS में शामिल जियोप्रोसेसिंग टूल का उपयोग करते हुए एक अपेक्षाकृत सरल कार्य है।

  1. अपने एलएसओए क्षेत्रों के क्षेत्र की गणना करें।

    • LSOA परत विशेषता तालिका खोलें।
    • संपादन मोड सक्षम करें।
    • फ़ील्ड कैलकुलेटर खोलें।
    • अभिव्यक्ति "$ क्षेत्र" के साथ "दशमलव संख्या (वास्तविक)" प्रकार का एक नया क्षेत्र बनाएं।
    • संपादन मोड अक्षम करें (संपादन संपादन)
  2. बाढ़ क्षेत्र की परत को एक एकल बहु-भाग विशेषता में मिलाएं।

    • Vector > Geometry Tools > Singleparts to Multipart
    • विशिष्ट ID फ़ील्ड के लिए "--- सभी मर्ज करें" का चयन करें।
  3. एलएसओए ज़ोन परत को मल्टीपार्ट फ्लड ज़ोन लेयर से जोड़ दें।

    • Vector > Geoprocessing Tools > Intersect
    • इनपुट परत LSOA क्षेत्र है, प्रतिच्छेदन परत बाढ़ क्षेत्र है।
  4. परिणामी परत एलएसओए ज़ोन के हिस्से होंगे (एलएसओए ज़ोन परत की विशेषताओं के साथ) जो बाढ़ ज़ोन परत के साथ ओवरलैप किए गए हैं। बाढ़ क्षेत्र के भीतर प्रत्येक एलएसओए क्षेत्र के अनुपात की गणना करने के लिए:

    • अंतरित सुविधाओं के क्षेत्र की गणना करें (जैसा कि चरण # 1 में है), फिर
    • मूल क्षेत्र (कुल) क्षेत्र को विभाजित क्षेत्र से विभाजित करते हुए एक और फ़ील्ड जोड़ें। परिणाम 0 और 1. के बीच एक दशमलव है जो प्रतिशत देने के लिए 100 से गुणा करता है।
  5. दोनों परतों द्वारा साझा की गई अद्वितीय आईडी का उपयोग करके, मूल एलएसओए परत को इंटरसेक्टेड लेयर में शामिल करें।

  6. एक नई आकृति के रूप में शामिल परत का निर्यात करें।

  7. डुप्लिकेट विशेषताओं को हटाएं।

Et voilà!

चरण # 2 के बिना, प्रत्येक एलएसओए सुविधा के लिए प्रत्येक अलग बाढ़ क्षेत्र सुविधा के लिए एक व्यक्तिगत सुविधा बनाई जाएगी। यदि आप केवल प्रत्येक एलएसओए क्षेत्र के लिए कुल कवरेज में रुचि रखते हैं तो यह संभवत: ऐसा नहीं है। यदि आप फ़्लूवियल / टाइडल / प्लवियल फ्लडिंग (और फ्लड ज़ोन डेटा इसे सपोर्ट करते हैं) के बीच अंतर करना चाहते हैं, तो आप "TYPE" फ़ील्ड को विशिष्ट ID फ़ील्ड के रूप में निर्दिष्ट करने के लिए एकलपार्ट s को परिवर्तित कर सकते हैं।


आपके सहयोग के लिए धन्यवाद! बहुत सराहना की। हालांकि, मुझे थोड़ी परेशानी हो रही है। मैंने चरणों का पालन किया है। चरण 3, इंटरसेक्ट, को पूरा करने में 10 घंटे लगे और जब यह सब हो गया तो मुझे एक खाली शेपफाइल मिला: i.imgur.com/QIM6Gtg.png क्या कोई ऐसी चीज है जो मैंने मिस कर दी है? मैंने प्रक्रिया को पूरा करने की कोशिश की और चरण 4 किया, लेकिन अंतरक्षेत्र की गणना के लिए कोई डेटा नहीं है।
KJGarbutt

मुझे पहले बाढ़ की परतों के साथ चौराहों को करने में समस्याएं हुई हैं। सुविधाएँ बड़ी और जटिल हैं। जिस तरह से मैंने अतीत में इसके चारों ओर काम किया है, उन्हें छोटी सुविधाओं में विभाजित करना है, इसलिए स्थानिक सूचकांक अधिक काम कर सकता है। ऐसा करने के लिए, बाढ़ परत ( Vector > Research Tools > Vector Grid... Output grid as polygons) के समान सीमा का एक वेक्टर ग्रिड बनाएं , फिर बाढ़ की परत के साथ ग्रिड को काटें। फिर चरण 3 में बाढ़ परत के बजाय आउटपुट का उपयोग करें। मुझे लगता है कि यह कारण है कि परत खाली थी क्योंकि यह दुर्घटनाग्रस्त हो गई थी।
स्नोरफॉर्पलागस

एक बार फिर धन्यवाद। अब केवल समस्या यह है कि क्यूजीआईएस हर बार जब मैं वेक्टर ग्रिड बनाने की कोशिश करता है तो दुर्घटनाग्रस्त हो जाता है। मैंने यहाँ से सलाह का पालन किया है लेकिन यह हर बार दुर्घटनाग्रस्त हो जाता है। मैंने कई बार मापदंडों को बदल दिया है और केवल बाढ़ क्षेत्र आकृति का उपयोग करने की कोशिश की है, इसके बजाय मेरी पूरी परियोजना फ़ाइल खुली है और यह हर बार विफल हो जाती है। कोई विचार? ! यहाँ स्क्रीनशॉट
KJGarbutt

आपके द्वारा निर्दिष्ट X और Y पैरामीटर बहुत छोटे हैं। 1000 x 1000 की तरह कुछ आज़माएं। आप इसे कई बार भी कर सकते हैं, अर्थात 5000 x 5000 पहले करें, 500 x 500 बनाने के लिए आउटपुट का उपयोग करें। संबंधित उत्तर यहां देखें: gis.stackexchange.com/a/66319/12420
Snalalorpagus

मैं आपकी मदद से लगभग टूट गया हूँ! हालाँकि, जब मैं मूल एलएसओए परत को इंटरसेक्टेड लेयर के साथ जुड़ने के लिए जाता हूं, तो मैं बहुत अधिक डेटा खो देता हूं। मुझे लगता है कि यह इसलिए है क्योंकि वेक्टर ग्रिड के कुछ वर्ग एक ही एलएसओए क्षेत्र में आते हैं और इसलिए प्रत्येक के लिए एक ही एलएसओए कोड होता है। इस प्रकार, मैं प्रत्येक एलएसओए क्षेत्र के लिए 2+ प्रतिशत आंकड़े के साथ समाप्त करता हूं जब मैं जॉइन करता हूं और मुझे केवल उनमें से एक मिलता है। क्या प्रत्येक एलएसओए के साथ प्रत्येक वेक्टर ग्रिड वर्ग के लिए प्रत्येक प्रतिशत को योग करने का एक तरीका है?
KJGarbutt

6

आप स्थानिक और कुछ स्थानिक एसक्यूएल कार्यों का उपयोग कर सकते हैं।

Select t1.geometry, t1.ID, area(t1.geometry), area(t2.geometry) ...... (anything you need to have in the table results)

(area(intersection(t1.geometry,t2.geometry))) as "Commun_AREA"

, ("Commun_AREA"*100/(area(t1.geometry))) as "Percent_AREA"

From lsoa as t1, flood_zone as t2

Where Intersects( t1.geometry,t2.geometry ) = 1

3

यह कुछ ऐसा लगता है जो प्रस्तुत किए गए उत्तरों की तुलना में बहुत आसान हो सकता है। मैं व्यक्तिगत रूप से एक साधारण अजगर लिपि का उपयोग करूंगा:

floodName = "the layer name here"
boundryName = "the layer name here"
fieldName = "the name of the field to contain the output 1/0"
minCoverage = 0.5 # the minimum amount of area covered to write 1
updateMap = [] # this will store values to be written    

# get layers
floodLayer = QgsMapLayerRegistry.instance().mapLayersByName(floodName)[0]
boundryLayer = QgsMapLayerRegistry.instance().mapLayersByName(boundryName)[0]
fieldIndex = boundryLayer.dataProvider().fieldNameIndex(fieldName)    

# iterate through boundries
for b in boundryLayer.getFeatures():
    # get only flood features that intersect with this feature's bounding box
    # this will make the script go way faster than it would otherwise
    request = QgsFeatureRequest().setFilterRect(b.geometry().boundingBox())
    floodGeom = geometry()
    floodFeat = QgsFeature()
    iter = floodLayer.getFeatures(request)
    iter.nextFeature(feat)
    while iter.nextFeature(feat):
        floodGeom = floodGeom.combine(feat.geometry())
    intersectGeom = b.geometry().intersection(feat.geometry())
    if intersectGeom.area() > minCoverage * b.geometry().area():
        updateMap[b.id()] = {fieldIndex : 1}
    else:
        updateMap[b.id()] = {fieldIndex : 0}

boundryLayer.dataProvider().changeAttributeValues(updateMap)

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


2

मुझे केआरजे के समान ही समस्या थी क्योंकि चरण 3 में "इंटर्सेक्ट" विधि का उपयोग करते हुए स्नोरफॉर्पलगस के निर्देशों के बाद केजे को गणना करने में काफी समय लग गया और मेरे पास जो कुछ बचा था वह खाली था।

मैंने Intgect के बजाय QGIS में "क्लिप" पद्धति का उपयोग करने के अलावा समान चरणों का पालन करने की कोशिश की - इसलिए, आपके उदाहरण में, जो कुछ बचा होगा वह उन क्षेत्रों के हिस्से होंगे जो बाढ़ क्षेत्र द्वारा कवर नहीं किए गए हैं। यह किसी कारण से काम करने लगता था और मैं पिछले चरण से "क्षेत्र" फ़ील्ड गणना का उपयोग करने में सक्षम था, साथ ही प्रत्येक बहुभुज के शेष हिस्सों पर एक नया "क्षेत्र" गणना, प्रत्येक क्षेत्र का% जानने के लिए जो कि नहीं था अन्य बहुभुज परत द्वारा कवर किया गया।

यह तकनीकी रूप से आपने जो मांगा था उसका उल्टा है। लेकिन वहाँ से 1 से प्रत्येक मान को घटाकर क्या प्राप्त करने के लिए की बस एक बात है है बाढ़ क्षेत्र के अंतर्गत आने वाले।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.