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
칼리스 아브람

답변:


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
이것은 훌륭하게 작동합니다. 나는 다른 해결책을 먼저 시도했고 그것이 효과가 있기 전에 나는 그것을 위해 현상금을 주었다. 이 솔루션은 절대적으로 완벽하며 내 스크립트에 더 적합합니다. 죄송합니다 : /
Alex

Hehe, 문제 없습니다! 도움이되어 다행입니다!
Jake

나는 그것이 완벽하게 작동하기 때문에 당신의 대답을 찬성했습니다. @PeyMan 현상금에 감사드립니다. 더 나은 솔루션은 언제나 환영합니다.
Antonio Falciano

speicifc 레이어의 모든 다각형을 분할하는 방법이 있습니까?
무하마드 Faizan 칸

나는 하나의 레이어가 여러 다각형 내가 코딩을 저점 분할 할이 있습니다
무하마드 Faizan 칸

2

SQLite 및 SpatiaLite로 컴파일 된 GDAL> = 1.10.0을 사용한 근사치는 레이어 (예 : poligon.shpline.shp )를 OGR VRT 파일 (예 : 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>

line.shp 주위에 매우 작은 버퍼 (예 : 1 마이크론)를 갖기 위해 * 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.