PyQGIS / Pythonを使用して別のレイヤーのフィーチャと交差するときにフィーチャを分割しますか?


12

バッファーレイヤー(緑のポリゴン)があり、バリア(青い線)を横切るたびに2つのポリゴンに分割します。私は「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) 

result(エラー)に対して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
これは見事に機能します。最初に他の解決策を試してみましたが、うまくいきました。このソリューションは完全に完璧であり、私のスクリプトにより適しています。ごめんなさい:/
アレックス

へへ、問題ない!助かります!
ジェイク

私はあなたの答えを完璧に機能させますが、私の答えは近似にすぎません。@PeyMan賞金に感謝しますが、賞金の価値が終わったとき、私のものを除いて答えはありませんでした。より良いソリューションはいつでも歓迎です。
アントニオファルチャーノ

特定のレイヤーのすべてのポリゴンを分割する方法はありますか?
ムハンマドファイザンカーン

私は、単一の層を持っていると私はコーディングトラフそれらを分割したい複数のポリゴンがある
ムハンマドFaizanカーン

2

SQLiteのとSpatiaLiteでコンパイルさGDAL> = 1.10.0との良好な近似は、(例えば、あなたのレイヤーをラップに構成されていpoligon.shpline.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>

* buffer_line *レイヤーを取得するline.shpの周りに非常に小さなバッファー(1ミクロンなど)を持たせるため。次に、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.