Tách một tính năng khi giao với một tính năng của lớp khác bằng PyQGIS / Python?


12

Tôi có một lớp đệm (đa giác màu xanh lá cây) mà tôi muốn chia thành hai đa giác bất cứ khi nào nó vượt qua một rào cản (đường màu xanh). Tôi đã cố gắng sử dụng phương pháp "splitGeometry", nhưng tôi không thể làm cho nó hoạt động được. Mã của tôi cho đến nay là:

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) 

Trả về 1 cho kết quả (lỗi) và danh sách trống cho newGeometries. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

nhập mô tả hình ảnh ở đây


1
Có lẽ cái này ở đây sẽ giúp bạn: gis.stackexchange.com/questions/66543/erase-method-USE-ogr
Michalis Avraam

Câu trả lời:


7

Bạn có thể sử dụng reshapeGeometrychức năng của QgsGeometryđối tượng cho việc này, nó cắt một đa giác dọc theo giao điểm của nó với một đường.

Sau đây sẽ giao cắt các đa giác bộ đệm với các dòng và thêm các tính năng đa giác phân chia vào một lớp bộ nhớ (cú pháp 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
Điều này làm việc rực rỡ. Tôi đã thử giải pháp khác trước và nó đã có hiệu quả vì vậy tôi đã nhận được tiền thưởng cho điều đó ngay cả trước khi tôi đọc được. Giải pháp này là hoàn toàn hoàn hảo và phù hợp với kịch bản của tôi tốt hơn. xin lỗi vì điều đó: /
Alex

Hehe, không vấn đề gì! Vui vì nó giúp!
Jake

Tôi nêu lên câu trả lời của bạn bởi vì nó hoạt động hoàn hảo, trong khi của tôi chỉ là một xấp xỉ. @PeyMan Cảm ơn tiền thưởng, nhưng không có câu trả lời nào ngoại trừ câu trả lời của tôi khi giá trị tiền thưởng kết thúc. Các giải pháp tốt hơn luôn được chào đón.
Antonio Falciano

Có cách nào để phân chia tất cả các đa giác của một lớp speicifc?
Muhammad Faizan Khan

Tôi có một lớp duy nhất và có nhiều đa giác tôi muốn tách chúng thành mã hóa máng
Muhammad Faizan Khan

2

Một xấp xỉ tốt với GDAL> = 1.10.0 được biên dịch bằng SQLite và SpatiaLite bao gồm việc bọc các lớp của bạn (ví dụ: poligon.shpline.shp ) trong tệp OGR VRT (ví dụ: layer.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>

để có một bộ đệm rất nhỏ (ví dụ 1 micron) xung quanh line.shp có được lớp * buffer_line *. Sau đó, chúng ta có thể áp dụng sự khác biệt và khác biệt đối xứng trên các hình học này bằng 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

Rõ ràng, tất cả những thứ này hoàn toàn có thể thực hiện được từ tập lệnh Python:

os.system("some_command with args")

Hi vọng điêu nay co ich!


@Jake reshapeGeometry đang ném một lỗi không xác định ngoại lệ. Vậy có cách nào khác để kiểm tra giao điểm giữa đa giác và đa tuyến không?
dùng99

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.