जब PyQGIS / Python का उपयोग करके किसी अन्य परत की विशेषता के साथ प्रतिच्छेद करते समय एक विशेषता को विभाजित करें?


12

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

while ldbuffprovider.nextFeature(feat):
  while barprovider.nextFeature(feat2):
    if feat.geometry().intersects(feat2.geometry()):
        intersection = feat.geometry().intersection(feat2.geometry())
        result, newGeometries, topoTestPoints=feat.geometry().splitGeometry(intersection.asPolyline(),True) 

जो परिणाम के लिए 1 (त्रुटि) और newGeometries के लिए एक खाली सूची देता है। कोई भी मदद बहुत ही सराहनीय होगी।

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


1
शायद यहाँ यह आपकी मदद करेगा: gis.stackexchange.com/questions/66543/erase-method-use-ogr
Michalis Avraam

जवाबों:


7

आप इसके लिए ऑब्जेक्ट के reshapeGeometryफ़ंक्शन का उपयोग कर सकते हैं QgsGeometry, जो एक लाइन के साथ अपने चौराहे के साथ बहुभुज को काटता है।

निम्नलिखित लाइनों के साथ बफर बहुभुज को प्रतिच्छेद करेगा, और विभाजित बहुभुज सुविधाओं को एक मेमोरी लेयर (QGIS 2.0 वाक्यविन्यास) में जोड़ेगा:

# Get the dataProvider objects for the layers called 'line' and 'buffer'
linepr = QgsMapLayerRegistry.instance().mapLayersByName('line')[0].dataProvider()
bufferpr = QgsMapLayerRegistry.instance().mapLayersByName('buffer')[0].dataProvider()

# Create a memory layer to store the result
resultl = QgsVectorLayer("Polygon", "result", "memory")
resultpr = resultl.dataProvider()
QgsMapLayerRegistry.instance().addMapLayer(resultl)


for feature in bufferpr.getFeatures():
  # Save the original geometry
  geometry = QgsGeometry.fromPolygon(feature.geometry().asPolygon())
  for line in linepr.getFeatures():
    # Intersect the polygon with the line. If they intersect, the feature will contain one half of the split
    t = feature.geometry().reshapeGeometry(line.geometry().asPolyline())
    if (t==0):
      # Create a new feature to hold the other half of the split
      diff = QgsFeature()
      # Calculate the difference between the original geometry and the first half of the split
      diff.setGeometry( geometry.difference(feature.geometry()))
      # Add the two halves of the split to the memory layer
      resultpr.addFeatures([feature])
      resultpr.addFeatures([diff])


1
यह शानदार ढंग से काम करता है। मैंने पहले दूसरे समाधान की कोशिश की और इसने काम किया ताकि मैं उर एन्स को पढ़ने से पहले ही इसके लिए इनाम दूं। यह समाधान बिल्कुल सही है और मेरी स्क्रिप्ट को बेहतर तरीके से सूट करता है। इसके लिए खेद है: /
एलेक्स

अरे, कोई बात नहीं! खुशी है कि यह मदद करता है!
जेक

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

वहाँ एक speicifc परत के सभी बहुभुज को विभाजित करने का कोई तरीका है?
मुहम्मद फैजान खान

मेरे पास एक ही परत है और कई बहुभुज हैं जो मैं उन्हें गर्त कोडिंग को विभाजित करना चाहता हूं
मुहम्मद फैजान खान

2

GDAL के साथ एक अच्छा सन्निकटन> = 1.10.0 SQLite और SpatiaLite के साथ संकलित एक OGR VRT फ़ाइल में अपनी परतों (जैसे poligon.shp और line.shp ) को लपेटने में शामिल है (जैसे परतों ।vrt :

<OGRVRTDataSource>
    <OGRVRTlayer name="buffer_line">
        <SrcDataSource>line.shp</SrcDataSource>
        <SrcSQL dialect="sqlite">SELECT ST_Buffer(geometry,0.000001) from line</SrcSQL>
    </OGRVRTlayer>
    <OGRVRTlayer name="polygon">
        <SrcDataSource>polygon.shp</SrcDataSource>
    </OGRVRTlayer>
</OGRVRTDataSource>

आदेश में एक बहुत छोटे बफर के लिए में (उदाहरण के लिए 1 माइक्रोन) के आसपास line.shp * buffer_line * परत प्राप्त करने के। फिर, हम स्पैटियालाइट का उपयोग करके इन ज्यामितीयों पर सममित अंतर और अंतर लागू कर सकते हैं:

ogr2ogr splitted_polygons.shp layers.vrt -dialect sqlite -sql "SELECT ST_Difference(ST_SymDifference(g1.geometry,g2.geometry),g2.geometry) FROM polygon AS g1, buffer_line AS g2" -explodecollections

जाहिर है, यह सब सामान एक पायथन स्क्रिप्ट से पूरी तरह से निष्पादन योग्य है:

os.system("some_command with args")

उम्मीद है की यह मदद करेगा!


@ जेक reshapeGeometry एक अपवाद अज्ञात त्रुटि फेंक रहा है। क्या बहुभुज और पॉलीलाइन के बीच चौराहे की जांच करने के लिए कोई अन्य तरीका है?
user99

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