Dividere i poligoni nel punto medio usando ArcPy?


14

Sto tentando di dividere circa 4000 poligoni nel loro punto medio, perpendicolarmente al loro asse più lungo (cioè attraverso la larghezza nel punto medio), come nel diagramma seguente.

inserisci qui la descrizione dell'immagine

Idealmente, vorrei farlo automaticamente ed evitare di dividere manualmente ogni poligono. Ho estratto il punto medio dei poligoni convertendo le linee più lunghe che possono essere tracciate in ciascuna, ho solo bisogno di determinare un metodo per disegnare automaticamente una linea di larghezza su questo punto.

I poligoni variano nella loro larghezza, e quindi gli strumenti che dividono i poligoni definendo linee di larghezza di una certa lunghezza non sono proprio quello che sto cercando.

Qualche idea?


tutti i poligoni sono convessi?
AnserGIS

Sì, hanno più o meno una forma simile a quella mostrata nel diagramma sopra.
Matt

Crea perpendicolare come descritto gis.stackexchange.com/questions/201867/… Usa usali e originali come input per la funzione al poligono. Aiuterà ad avvicinarsi ai punti ai confini
FelixIP

@Matt la mia risposta ha risolto il tuo problema? In tal caso, puoi contrassegnarlo come risposto con la casella di controllo?
BERA,

Risposte:


23

Lo script seguente genererà una nuova classe di funzioni di poligoni divisi e le linee utilizzate per dividerli. È richiesta una licenza avanzata.

I poligoni saranno divisi in questo modo: inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Utilizzo del centroide del rettangolo Geometria minima limite come punto medio e divisione nel rettangolo.

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'

inserisci qui la descrizione dell'immagine

Gli attributi andranno persi ma puoi usare Join spaziale per aggiungerli di nuovo.


6
Ottima soluzione Penso che si debba notare che per eseguire questa operazione è necessaria la licenza Advanced (splitline, featureToLine e featureToPolygon). Inoltre, penso che l'aggiunta di alcuni commenti nel codice aiuterà i nuovi utenti di Python a capire cosa sta facendo ogni riga.
Fezter

Ciao @BERA, scusa per la risposta lenta. Lo script non sembra funzionare, generando il seguente errore: ERRORE 000466: in_memory \ templine non corrisponde allo schema delle linee di divisione target Impossibile eseguire (Aggiungi).
Matt,

1
Prova a cambiare la riga di append in: arcpy.Append_management (input = r'in_memory \ templine ', target = outfc_splitlines, schema_type =' NO_TEST ')
BERA

Sembra che si verifichi un altro errore, questa volta: errore di analisi IndentationError: unindent non corrisponde a nessun livello di indentazione esterno (riga 28)
Matt

Devi avere 8 spazi prima dell'arcpy.Append_manag ...
BERA
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.