¿Dividir polígonos en el punto medio usando ArcPy?

14

Estoy tratando de dividir alrededor de 4000 polígonos en su punto medio, perpendicular a su eje más largo (es decir, a través del ancho en el punto medio), como en el diagrama a continuación.

ingrese la descripción de la imagen aquí

Idealmente, me gustaría hacer esto automáticamente y evitar dividir manualmente cada polígono. Extraje el punto medio de los polígonos al convertir las líneas más largas que se pueden dibujar en cada uno, solo necesito determinar un método para dibujar una línea de ancho a través de este punto automáticamente.

Los polígonos varían en su ancho, y por lo tanto, las herramientas que dividen los polígonos definiendo líneas de ancho de una cierta longitud no son realmente lo que estoy buscando.

¿Algunas ideas?

Mate
fuente
¿Son todos los polígonos convexos?
AnserGIS
Sí, tienen una forma más o menos similar a la que se muestra en el diagrama anterior.
Matt
Cree perpendicular como se describe gis.stackexchange.com/questions/201867/… Use usarlos y original como entradas para la función de polígono. Ayudará a hacer cerca de puntos a límites
FelixIP
@ Matt ¿mi respuesta resolvió tu problema? Si es así, ¿podría marcarlo como respondido con la casilla de verificación?
BERA

Respuestas:

23

El siguiente script generará una nueva clase de entidad de polígonos divididos y las líneas utilizadas para dividirlos. Se requiere licencia avanzada.

Los polígonos se dividirán así: ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Usando el rectángulo Centroide de geometría de límite mínimo como punto medio y dividido en el rectángulo.

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'

ingrese la descripción de la imagen aquí

Los atributos se perderán, pero puede usar la Unión espacial para agregarlos nuevamente.

BERA
fuente
66
Gran solución Creo que debe tenerse en cuenta que se requiere la licencia avanzada para realizar esta operación (splitline, featureToLine y featureToPolygon). Además, creo que agregar algunos comentarios a lo largo de su código ayudará a los nuevos usuarios de Python a comprender lo que está haciendo cada línea.
Fezter
Hola @BERA, perdón por la lenta respuesta. El script no parece funcionar y genera el siguiente error: ERROR 000466: in_memory \ templine no coincide con el esquema de las líneas divisorias de destino. Error al ejecutar (Agregar).
Matt
1
Intente cambiar la línea de adición a: arcpy.Append_management (input = r'in_memory \ templine ', target = outfc_splitlines, schema_type =' NO_TEST ')
BERA
Parece obtener otro error, esta vez: Error de análisis IndentationError: unindent no coincide con ningún nivel de sangría externa (línea 28)
Matt
Debes tener 8 espacios antes del arco. Apéndice_administrar ...
BERA