Teilen von Polygonen am Mittelpunkt mit ArcPy?

14

Ich versuche, ungefähr 4000 Polygone an ihrem Mittelpunkt senkrecht zu ihrer längsten Achse (dh über die Breite am Mittelpunkt) aufzuteilen, wie im folgenden Diagramm gezeigt.

Bildbeschreibung hier eingeben

Im Idealfall möchte ich dies automatisch tun und vermeiden, jedes Polygon manuell zu teilen. Ich habe den Mittelpunkt von Polygonen durch Konvertieren der längsten Linien extrahiert, die jeweils gezeichnet werden können. Ich muss nur eine Methode bestimmen, um automatisch eine Breitenlinie über diesen Punkt zu zeichnen.

Polygone variieren in ihrer Breite, und daher sind Werkzeuge, die Polygone durch Definieren von Breitenlinien einer bestimmten Länge teilen, nicht wirklich das, wonach ich suche.

Irgendwelche Ideen?

Matt
quelle
Sind alle Polygone konvex?
AnserGIS
Ja, sie haben mehr oder weniger die gleiche Form wie in der obigen Abbildung.
Matt
Senkrecht wie beschrieben erstellen gis.stackexchange.com/questions/201867/… Verwenden Sie diese und das Original als Eingaben für das Merkmal zum Polygon. Es wird helfen, nahe an Punkten an Grenzen zu tun
FelixIP
@Matt hat meine Antwort Ihr Problem gelöst? Wenn ja, können Sie es mit der Checkbox als beantwortet markieren?
BERA

Antworten:

23

Das folgende Skript gibt eine neue Feature-Class von aufgeteilten Polygonen und die zum Aufteilen verwendeten Linien aus. Erweiterte Lizenz ist erforderlich.

Die Polygone werden wie folgt aufgeteilt: Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Verwenden des Rechtecks ​​mit dem Schwerpunkt der minimalen Begrenzungsgeometrie als Mittelpunkt und Aufteilen über das Rechteck.

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'

Bildbeschreibung hier eingeben

Attribute gehen verloren, können aber mit Spatial Join erneut hinzugefügt werden.

BERA
quelle
6
Großartige Lösung. Ich denke, es sollte beachtet werden, dass die Advanced-Lizenz erforderlich ist, um diesen Vorgang durchzuführen (splitline, featureToLine und featureToPolygon). Außerdem denke ich, dass das Hinzufügen einiger Kommentare in Ihrem Code neuen Python-Benutzern hilft, zu verstehen, was jede Zeile tut.
Fezter
Hallo @BERA, sorry für die langsame Antwort. Das Skript scheint nicht zu funktionieren und gibt den folgenden Fehler aus: FEHLER 000466: in_memory \ templine stimmt nicht mit dem Schema der Zielsplitlinien überein Fehler beim Ausführen (Anhängen).
Matt
1
Versuchen Sie, die Append-Zeile zu ändern: arcpy.Append_management (input = r'in_memory \ templine ', target = outfc_splitlines, schema_type =' NO_TEST ')
BERA
Diesmal scheint es einen anderen Fehler zu geben: Parsing error IndentationError: unindent entspricht keiner äußeren Einrückungsstufe (Zeile 28)
Matt
Sie müssen 8 Leerzeichen vor dem arcpy.Append_manag haben ...
BERA