แยกคุณสมบัติเมื่อตัดกันด้วยคุณสมบัติของอีกชั้นหนึ่งโดยใช้ PyQGIS / Python หรือไม่?


12

ฉันมีเลเยอร์บัฟเฟอร์ (รูปหลายเหลี่ยมสีเขียว) ซึ่งฉันต้องการแยกเป็นรูปหลายเหลี่ยมสองรูปเมื่อใดก็ตามที่ข้ามสิ่งกีดขวาง (เส้นสีน้ำเงิน) ฉันพยายามใช้วิธี "splitGeometry" แต่ฉันไม่สามารถใช้งานได้ รหัสของฉันคือ:

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-using-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
มันใช้งานได้ดี ฉันลองใช้วิธีแก้ปัญหาอื่นก่อนแล้วจึงใช้งานได้ดีกว่านั้นก่อนที่ฉันจะอ่านคำตอบ โซลูชันนี้สมบูรณ์แบบและเหมาะสมกับสคริปต์ของฉันดีกว่า ขอโทษสำหรับสิ่งนั้น: /
อเล็กซ์

ฮิฮิไม่มีปัญหา! ดีใจที่มันช่วย!
Jake

ฉันถอนคำตอบของคุณเพราะมันทำงานได้อย่างสมบูรณ์ในขณะที่ฉันเป็นเพียงการประมาณ @PeyMan ขอบคุณสำหรับเงินรางวัล แต่ก็ไม่มีคำตอบยกเว้นของฉันเมื่อมูลค่ารางวัลสิ้นสุดลง ทางออกที่ดีกว่ายินดีต้อนรับเสมอ
Antonio Falciano

มีวิธีใดบ้างที่จะแบ่งรูปหลายเหลี่ยมทั้งหมดของเลเยอร์ speicifc?
มูฮัมหมัดฟาซานคาน

ฉันมีชั้นเดียวและมีหลายรูปหลายเหลี่ยมฉันต้องการแยกการเขียนโปรแกรมราง
Muhammad Faizan Khan

2

การประมาณที่ดีด้วย GDAL> = 1.10.0 ที่คอมไพล์ด้วย SQLite และ SpatiaLite ประกอบด้วยเลเยอร์ของคุณ (เช่นpoligon.shpและline.shp ) ในไฟล์ OGR VRT (เช่นlayers.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 * จากนั้นเราสามารถใช้ความแตกต่างและความแตกต่างแบบสมมาตรกับรูปทรงเหล่านี้โดยใช้ SpatiaLite:

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

เห็นได้ชัดว่าทุกสิ่งนี้สามารถเรียกใช้งานได้อย่างสมบูรณ์แบบจากสคริปต์ Python:

os.system("some_command with args")

หวังว่านี่จะช่วยได้!


@ Jake reshapeGeometry กำลังขว้างข้อผิดพลาดที่ไม่ทราบสาเหตุดังนั้นจะมีวิธีอื่นอีกไหมในการตรวจหาจุดตัดระหว่างรูปหลายเหลี่ยมและรูปหลายเหลี่ยม?
user99

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.