QGIS में बहुभुज मुखौटा का उपयोग करके विशिष्ट परत को स्टाइल करना?


10

मेरे पास QGIS में एक लाइन लेयर और एक बहुभुज परत है:

मास्क से पहले

मैं एक स्टाइल का उपयोग करके बहुभुज के बाहर लाइन लेयर के हिस्से और एक अलग स्टाइल का उपयोग करके अंदर के हिस्से को स्टाइल करना चाहूंगा:

मास्क के बाद

मैं एक व्युत्पन्न डेटा सेट, पूर्व नहीं बनाना चाहता। लाइन की परत को क्लिप करें और दो हिस्सों को स्टाइल करें।

यह एक साधारण मामला है, लेकिन मेरी QGIS परियोजना में मेरे पास +30 परतें हैं, इसलिए मुझे लगता है कि किसी भी परत का सम्मिश्रण अंतर्निहित परतों को परेशान करेगा।

क्या ऐसा कुछ करना संभव है?

मैं बहुभुज परत नहीं दिखाना चाहता, यह सिर्फ यहाँ है कि मैं क्या करना चाहता हूं।


1
अच्छी विधि! मुझे लगता है कि प्रश्न को संपादित करने के बजाय एक उत्तर के रूप में पोस्ट किया जाना चाहिए :)
यूसुफ

@ जोसेफ, यह हो गया!
चौ

जवाबों:


11

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

प्लस चिन्ह पर क्लिक करके एक नई प्रतीक परत जोड़ें और Geometry generatorप्रतीक परत प्रकार का चयन करें । LineString / MultiLineStringनिम्न अभिव्यक्ति के लिए भू-प्रकार प्रकार सेट करें और उसका उपयोग करें:

intersection($geometry, geometry(get_feature( 'polygonLayer','fieldName','value'))) 

आपको अपने विशिष्ट बहुभुज के बारे में विवरण जोड़ने की आवश्यकता होगी जहां:

  • polygonLayer आपकी बहुभुज परत का नाम है
  • fieldName क्षेत्र का नाम है
  • value आपके विशिष्ट बहुभुज का फीचर वैल्यू है

शैली के गुण

ध्यान दें कि दृश्य रेखा को रंगने के लिए, आपको इसे ड्रॉ इफेक्ट्स प्रॉपर्टी से करने की आवश्यकता हो सकती है :

प्रभाव गुण आकर्षित करें

यह परिणाम था (ध्यान दें कि दृश्य रेखा ने मूल रेखा को पूरी तरह से ओवरलैप नहीं किया था इसलिए मैंने ऑफसेट को थोड़ा संशोधित किया):

परिणाम

और बहुभुज के बिना:

बहुभुज के बिना परिणाम



संपादित करें:

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

from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def func(feature, parent):
    polygon_layer = QgsMapLayerRegistry.instance().mapLayersByName( "polygon example_2" )[0]
    feat_list = []
    geoms = QgsGeometry.fromWkt('GEOMETRYCOLLECTION()')
    for polygon_feat in polygon_layer.getFeatures():
        if feature.geometry().intersects(polygon_feat.geometry()):
            intersection = feature.geometry().intersection(polygon_feat.geometry())
            feat_list.append(intersection)
    for x in feat_list:
        geoms = geoms.combine(x)
    return geoms

समारोह संपादक

लोड पर क्लिक करें फिर एक्सप्रेशन टैब पर जाएं और टाइप करें func()। उम्मीद है कि परिणाम निम्नलिखित की तरह दिखना चाहिए (ऊपर उल्लिखित समान शैली गुणों का उपयोग करके):

अंतिम परिणाम


मैंने वास्तव में उस पर ध्यान दिया, लेकिन जब मुझे पता चला तो रुक गया, जिसके get_featureलिए फ़ील्ड नाम और मूल्य की आवश्यकता थी । मेरे पास सिर्फ एक बहुभुज परत है और वह उस परत की सभी विशेषताओं का उपयोग मुखौटा बनाने के लिए करना चाहेगी। क्या यह संभव है?
चौ।

@Chau - एक संभावित पद्धति को शामिल करने के लिए संपादित पोस्ट :)
जोसफ

1
एक अन्य विकल्प बहुभुज परत को भंग करना होगा।
csk

1
@ जोसेफ - जब एक Geometry Generatorविधि का उपयोग किया जाता है तो funcउस परत पर हर सुविधा के लिए कॉल किया जाता है जहां इसका उपयोग स्टाइल के लिए किया जाता है? तो अगर मेरी लाइन लेयर में 3 विशेषताएं हैं, तो func3 बार कहा जाता है और 3 बार एक ही परिणाम आ रहा है?
चाऊ

1
@Chau - मुझे लगता है कि आप सही थे, कोड प्रत्येक सुविधा के माध्यम से कई बार पुनरावृत्त हुआ। पोस्ट को संपादित किया ताकि funcअब केवल प्रत्येक पंक्ति विशेषता के अनुसार बुलाया जाए और केवल एक बार परिणाम निकालेगा (जो ऐसा लगता है जैसे कि पॉलीगॉन के अंदर वर्टेक्स मार्कर द्वारा दिखाया गया है, इससे पहले कि यह नीचे छिपा हुआ था जो मुझे याद था)। इसे इंगित करने के लिए धन्यवाद :)
जोसेफ

3

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

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface

@qgsfunction(args='auto', group='Custom')
def mask_line_with_polygon(mask_type, line_layer_name, polygon_layer_name_1, polygon_layer_name_2, feature, parent):
    line_layer = QgsMapLayerRegistry.instance().mapLayersByName( line_layer_name )[0]

    # This is the geometry outside the polygon mask.
    outside = QgsGeometry(feature.geometry())

    polygon_layer_names = [polygon_layer_name_1, polygon_layer_name_2]
    line_feature_extent = outside.boundingBox()

    geoms = QgsGeometry.fromWkt('MultiLineString()')

    for polygon_layer_name in polygon_layer_names:
        if polygon_layer_name is None or len(polygon_layer_name) == 0:
            continue

        # If the line and the polygon layers have different projections, handle them here.
        polygon_layer = QgsMapLayerRegistry.instance().mapLayersByName(polygon_layer_name)[0]
        trs = QgsCoordinateTransform(line_layer.crs(), polygon_layer.crs())
        polygon_extent = trs.transform(line_feature_extent)
        trs = QgsCoordinateTransform(polygon_layer.crs(), line_layer.crs())

        # Go through the features in the polygon layer, but only those within the line feature bounding box.
        for feature in polygon_layer.getFeatures(QgsFeatureRequest().setFilterRect(polygon_extent)):
            polygon_geometry = QgsGeometry(feature.geometry())

            # Transform the polygon to line space.
            polygon_geometry.transform(trs)

            if outside.intersects(polygon_geometry):
                if mask_type.lower() == 'outside':
                    inside = outside.intersection(polygon_geometry)

                    if inside.isMultipart():
                        for x in inside.asMultiPolyline():
                            geoms.addPart(x)
                    else:
                        geoms.addPart(inside.asPolyline())

                outside = outside.difference(polygon_geometry)

    if mask_type.lower() == 'inside':
        if outside.isMultipart():
            for x in outside.asMultiPolyline():
                geoms.addPart(x)
        else:
            geoms.addPart(outside.asPolyline())

    return geoms

इस अभ्यास ने मुझे दिखाया है कि क्यूजीआईएस बड़े डेटा सेट के साथ काम करने का शौक नहीं रखता है और क्यूजीआईएस के साथ यह एल्गोरिथ्म अक्सर मेरे रास्ते में दुर्घटनाग्रस्त हो जाता है। मुझे संदेह है कि QGIS रेंडरर जियोमेट्री जेनरेटर को प्रस्तुत करना पसंद नहीं करता है जो समय लेने वाली हैं।

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