ArcPyを使用して中点でポリゴンを分割しますか?


14

次の図のように、最長軸に垂直な(つまり、中間点の幅を横切る)中間点で約4000個のポリゴンを分割しようとしています。

ここに画像の説明を入力してください

理想的には、これを自動的に行い、各ポリゴンを手動で分割しないようにします。それぞれに描画できる最長の線を変換してポリゴンの中間点を抽出しましたが、この点を横切る線を自動的に描画する方法を決定するだけです。

ポリゴンの幅はさまざまであるため、特定の長さの幅の線を定義してポリゴンを分割するツールは、私が探しているものではありません。

何か案は?


すべての多角形は凸形ですか?
AnserGIS

はい、それらは上の図に示されているものとほぼ同じような形をしています。
マット

説明したとおりに垂直を作成します。gis.stackexchange.com/ questions / 201867 /…ポリゴンへのフィーチャの入力として使用し、オリジナルを使用します。境界のポイントを近くで確認するのに役立ちます
-FelixIP

@Mattはあなたの問題を解決しましたか?その場合、チェックボックスで回答済みとしてマークできますか?
ベラ

回答:


23

以下のスクリプトは、スプリットポリゴンの新しいフィーチャクラスと、それらを分割するために使用されるラインを出力します。高度なライセンスが必要です。

ポリゴンは次のように分割されます。 ここに画像の説明を入力してください

ここに画像の説明を入力してください

最小境界ジオメトリの重心を中点として使用し、四角形全体に分割します。

import arcpy
print 'Running'
arcpy.env.workspace = r'C:\TEST.gdb'    #Change to match your data
infc = r'polygons123'                   #Change to match your data
outfc_splitlines = r'splitlines'        
outfc_splitpolygons=r'splitpolygons'    

spatial_ref = arcpy.Describe(infc).spatialReference
arcpy.CreateFeatureclass_management(out_path=arcpy.env.workspace, out_name=outfc_splitlines, geometry_type='POLYLINE',spatial_reference=spatial_ref) #Creates a new feature class to hold the split lines

with arcpy.da.SearchCursor(infc,['SHAPE@','SHAPE@X','SHAPE@Y']) as cursor: #For each input polygon create a minimum bounding rectangle
    for row in cursor:
        arcpy.MinimumBoundingGeometry_management(row[0],r'in_memory\bounding','RECTANGLE_BY_WIDTH')
        arcpy.SplitLine_management(r'in_memory\bounding', r'in_memory\splitline') #Split the rectangle into four lines, one for each side
        linelist=[]
        with arcpy.da.SearchCursor(r'in_memory\splitline',['SHAPE@LENGTH','SHAPE@']) as cursor2:
            for row2 in cursor2:
                linelist.append(row2) #Store the lines lenghts and geometries in a list
            linelist=sorted(linelist,key=lambda x: x[0]) #Sort shortest to longest (the two shortest sides of the rectangles come first and second in list)
        arcpy.CopyFeatures_management(in_features=linelist[0][1], out_feature_class=r'in_memory\templine') #Copy the first line to memory
        with arcpy.da.UpdateCursor(r'in_memory\templine',['SHAPE@X','SHAPE@Y']) as cursor3:
            for row3 in cursor3:
                newcentroidx=row[1] #Find x coord of bounding rectangle centroid
                newcentroidy=row[2] #Find y..
                row3[0]=newcentroidx #Assign this to the shortest line
                row3[1]=newcentroidy #Assign this to the shortest line
                cursor3.updateRow(row3) #Move the line to the centroid of bounding rectangle
        arcpy.Append_management(inputs=r'in_memory\templine', target=outfc_splitlines) #Save this line in splitline feature class
#After all split lines are created convert input polygons to lines, merge with split lines and create new polygons from lines.

arcpy.FeatureToLine_management(in_features=infc, out_feature_class=r'in_memory\polytemp')
arcpy.Merge_management(inputs=[r'in_memory\polytemp',outfc_splitlines], output=r'in_memory\templines')
arcpy.FeatureToPolygon_management(in_features=r'in_memory\templines', out_feature_class=outfc_splitpolygons)
print 'Done'

ここに画像の説明を入力してください

属性は失われますが、Spatial Joinを使用して再度追加できます。


6
素晴らしい解決策。この操作(splitline、featureToLine、featureToPolygon)を実行するにはAdvancedライセンスが必要であることに注意してください。さらに、コード全体にコメントを追加すると、新しいpythonユーザーが各行の内容を理解するのに役立つと思います。
フェスター

こんにちは@BERA、返信が遅くなって申し訳ありません。スクリプトが機能していないようで、次のエラーを出力します:エラー000466:in_memory \ templineはターゲットスプリットラインのスキーマと一致しません(実行)に失敗しました。
マット

1
追加行を次のように変更してみてください:arcpy.Append_management(inputs = r'in_memory \ templine '、target = outfc_splitlines、schema_type =' NO_TEST ')
BERA

別のエラーを取得するように見える、この時間は:構文解析エラーIndentationErrorは:インデント解除は、任意の外側のインデントレベル(ライン28)と一致しない
マット・

arcpy.Append_managの前に8つのスペースが必要です...-
BERA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.