प्रोग्रामेटिक रूप से बहुभुज ढूंढ रहे हैं>> QGIS का उपयोग करके एक और वेक्टर बहुभुज परत द्वारा 90% ओवरलैप किया गया है?


9

उदाहरण परतें

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

मुझे अजगर (या इसी तरह स्वचालित तरीकों) के माध्यम से यह सब करने की आवश्यकता है। मेरे पास उसी तरह से संसाधित करने के लिए ~ 1000 नक्शे हैं।


आप एक ओवरले 'यूनियन' करना चाहते हैं ( कुछ मूल बातों के लिए infogeoblog.wordpress.com/2013/01/08/geo-processing-in-qgis देखें ) फिर प्रत्येक मूल बहुभुज के लिए 'आँकड़ों' और 'बाहर' की गणना करें gis.stackexchange.com/questions/43037/… ओवरले प्रतिशत का निर्धारण करने के लिए ... संकेत: आपको एक क्षेत्र माप की आवश्यकता है gis.stackexchange.com/questions/23355/…
माइकल

सुझावों के लिए धन्यवाद। मैं यही कोशिश कर रहा था। मैं अजगर कंसोल के माध्यम से संघ को काफी आसान कर सकता हूं। पहले से ही क्षेत्र विशेषता मूल्यों में जोड़ा गया है। यह अगला कदम है जिसके बारे में मैं अनिश्चित हूं। मैं 'इन' और 'आउट' आँकड़ों की गणना करने के लिए अजगर का उपयोग कैसे करूं ताकि मैं 90% बहुभुजों की पहचान / चयन / क्लिप / कर सकूं?
dnormous

मुझे लगता है कि यह अजगर के बिना संभव है। क्या आपको पूरी तरह से अजगर की जरूरत है या आभासी परतों के साथ एक समाधान आपके लिए अच्छा है?
पिआर्मा

, इन ’क्षेत्रों में दोनों बहुभुजों से विशेषता होगी, areas बाहर’ क्षेत्रों में केवल बहुभुज के एक सेट से गुण होते हैं। क्षेत्र के आँकड़ों के दोनों सेट प्राप्त करें और मूल बहुभुजों में वापस शामिल हों, 'इन', 'आउट' और कवरेज के लिए एक फ़ील्ड जोड़ें, क्षेत्रों के योग से 'इन' और 'आउट' के मानों की गणना करें, फिर 'द्वारा' में विभाजित करें प्रतिशत की गणना करने के लिए मूल क्षेत्र (या '+' आउट 'में')।
माइकल स्टिम्सन

1
पिआर्मा - मुझे बहुभुजों को खोजने के लिए एक स्वचालित विधि की आवश्यकता है।
dnormous

जवाबों:


3

अगला कोड QGIS के मेरे पायथन कंसोल में काम करता है। यह बहुभुज के साथ एक स्मृति परत का उत्पादन करता है जो लाल क्षेत्रों द्वारा> 90% ओवरलैप किया जाता है।

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

#for polygon_intersects
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]

#for xwRcl
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]

selected_feats = []

for i, feat1 in enumerate(feats_lyr1):
    area1 = 0
    area2 = 0
    for j, feat2 in enumerate(feats_lyr2):
        if feat1.geometry().intersects(feat2.geometry()):
            area = feat1.geometry().intersection(feat2.geometry()).area()
            print i, j, area, feat2.attribute('class')
            if feat2.attribute('class') == 1:
                area1 += area
            else:
                area2 += area
    crit = area1/(area1 + area2)
    print crit
    if crit > 0.9:
        selected_feats.append(feat1)

epsg = layers[0].crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           "mem_layer",
                           "memory")

prov = mem_layer.dataProvider()

for i, feat in enumerate(selected_feats):
    feat.setAttributes([i])

prov.addFeatures(selected_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

मैंने इन दो वेक्टर परतों के साथ कोड आज़माया:

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

परिणामों की पुष्टि के लिए QGIS के पायथन कंसोल पर कोड चलाने के बाद, अनुक्रमणिका i, सम्मिलित सुविधाएँ, चौराहे क्षेत्र, polygons_intersects में फ़ील्ड की विशेषता (लाल क्षेत्रों के लिए 1 और ग्रे क्षेत्रों के लिए 2) और अतिव्यापी मानदंड मुद्रित किए गए थे। ।

0 0 9454207.56892 1
0 1 17429206.7906 2
0 2 10326705.2376 2
0 4 40775341.6814 1
0 5 26342803.0964 2
0 7 11875753.3216 2
0.432253120382
1 6 1198411.02558 2
1 7 1545489.96614 2
1 10 27511427.9909 1
0.90930850584
2 7 750262.940888 2
2 8 12012343.5859 1
0.941213972294
3 6 23321277.5158 2
0.0

अगली मेमोरी में बनाई गई मेमोरी लेयर (ग्रीन फीचर्स) देखी जा सकती है। जैसी उम्मीद थी।

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


6

यहाँ एक समाधान है कि अजगर की आवश्यकता नहीं है।

एक क्वेरी के साथ एक नई आभासी परत जोड़ें:

WITH r AS (
SELECT 
    Basins800.rowid AS idGray, 
    area(Basins800.geometry) AS areaGray, 
    area(Intersection(Basins800.geometry, Severity.geometry)) AS aeraInter, 
    Basins800.geometry AS geomGray 
  FROM Basins800, Severity
)

SELECT *, areaInterSum/areaGray  AS overlap , geomGray 
    FROM (
        SELECT 
           idGray, 
           areaGray, 
           sum(areaInter) AS areaInterSum, 
           geomGray 
        FROM r 
        GROUP BY idGray) 
     WHERE areaInterSum/areaGray > 0.9

साथ में :

  • अपनी परत के रूप में Basins800 आप ग्रे बहुभुज के साथ फ़िल्टर करना चाहते हैं

  • गंभीरता: आपकी लाल परत अतिव्यापी।

परिणाम एक नई परत होगी जिसमें केवल सभी ग्रे प्लॉलेगन्स> 90% लाल पॉलीगनों द्वारा ओवरलैप किया जाएगा, जिसमें एक नया क्षेत्र होगा जिसमें ओवरलैप प्रतिशत होगा।

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

आशा है कि यह काम करता है। यदि आवश्यक हो तो मैं क्वेरी पर अधिक विवरण जोड़ सकता हूं।

नोट: आपके डेटा में बहुत छोटे बहुभुज हैं (आपके रेखापुंज प्रसंस्करण से और एक रेखापुंज पिक्सेल से संबंधित है। चित्र पर, हम 4 बहुभुज देख सकते हैं, लेकिन 25 अन्य छोटे बहुभुज हैं)। यह निष्पादित करने के लिए क्वेरी को बहुत धीमा करता है (Intersection फ़ंक्शन। दो परतों से प्रत्येक जोड़ी सुविधाओं के लिए एक सुविधा उत्पन्न करता है)।


जब मैं 'एक वर्चुअल लेयर बनाता हूं' बटन के माध्यम से क्वेरी चलाता हूं, तो मुझे एक त्रुटि मिल रही है। "आरईएम एएस के साथ क्रिएट टेम्पर व्यू _टव्यू के रूप में क्वैरी एक्जीक्यूशन एरर (" .... बाकी कोड यहां ... उसके बाद: "1 - निकट" के साथ ": सिंटैक्स त्रुटि" मैं QGIS के लिए काफी नया हूं। इस वर्चुअल लेयर को प्रोग्राम बनाएं। आपकी मदद के लिए धन्यवाद!
dnormous


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

यह प्रक्रिया का केवल एक छोटा सा टुकड़ा है। मेरे पास ऐसा करने के लिए ~ 1000 नक्शे हैं, इसलिए प्रक्रिया को स्वचालित करना बेहद मददगार होगा।
dnormous

मुझे अभी भी वही त्रुटि मिल रही है -> "1 - निकट" के साथ ": वाक्यविन्यास त्रुटि"। मैंने ग्रेलेयर और रेडलेयर के लिए प्रत्येक परत के लिए स्थानीय नामों को प्लग किया। क्या स्थानीय नाम है जो मुझे उपयोग करना चाहिए? अर्थात: ग्रे लेयर को "बेसिंस_800" के रूप में लेबल किया जाता है, इसलिए मेरे पास "बेसिंस_800.जैमेट्री" जैसा कोड है
dnormous

2

गंभीरता और Basins800 के लिंक को देखने के बाद शेपफ़ाइलें, मैं आवश्यक geoprocess समझ सकते हैं। मैंने कोड संशोधित किया है:

प्रोग्रामेटिक रूप से बहुभुज ढूंढ रहे हैं>> QGIS का उपयोग करके एक और वेक्टर बहुभुज परत द्वारा 90% ओवरलैप किया गया है?

इसे पाने के लिए:

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

#for Severity
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]

#for Basins800
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]

selected_feats = []

print "processing..."

for i, feat1 in enumerate(feats_lyr1):
    for j, feat2 in enumerate(feats_lyr2):
        if feat1.geometry().intersects(feat2.geometry()):
            area1 = feat1.geometry().intersection(feat2.geometry()).area()
            area2 = feat1.geometry().area()
            print i, j, area1, area2
    crit = area1/area2
    print crit
    if crit > 0.9:
        selected_feats.append(feat1)

epsg = layers[0].crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           "mem_layer",
                           "memory")

prov = mem_layer.dataProvider()

for i, feat in enumerate(selected_feats):
    feat.setAttributes([i])

prov.addFeatures(selected_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

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

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

मैं परिणामों को डीबग नहीं करने जा रहा हूं क्योंकि सुविधाओं के लिए 1901 * 3528 = 6706728 इंटरैक्शन हैं। हालाँकि, कोड आशाजनक लगता है।

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