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

14

Estoy intentando 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 se muestra en el diagrama a continuación.

Idealmente, me gustaría hacer esto automáticamente y evitar dividir manualmente cada polígono. He extraído 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 al definir líneas de ancho de una cierta longitud no son realmente lo que estoy buscando.

¿Alguna idea?

    
pregunta Matt 14.03.2017 - 11:04

1 respuesta

23

La siguiente secuencia de comandos 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í:

UsandoelcentrodeunrectángulodeGeometríadedelimitaciónmínimacomopuntomedioydivididoatravésdelrectángulo.

importarcpyprint'Running'arcpy.env.workspace=r'C:\TEST.gdb'#Changetomatchyourdatainfc=r'polygons123'#Changetomatchyourdataoutfc_splitlines=r'splitlines'outfc_splitpolygons=r'splitpolygons'spatial_ref=arcpy.Describe(infc).spatialReferencearcpy.CreateFeatureclass_management(out_path=arcpy.env.workspace,out_name=outfc_splitlines,geometry_type='POLYLINE',spatial_reference=spatial_ref)#Createsanewfeatureclasstoholdthesplitlineswitharcpy.da.SearchCursor(infc,['[email protected]','[email protected]','[email protected]'])ascursor:#Foreachinputpolygoncreateaminimumboundingrectangleforrowincursor:arcpy.MinimumBoundingGeometry_management(row[0],r'in_memory\bounding','RECTANGLE_BY_WIDTH')arcpy.SplitLine_management(r'in_memory\bounding',r'in_memory\splitline')#Splittherectangleintofourlines,oneforeachsidelinelist=[]witharcpy.da.SearchCursor(r'in_memory\splitline',['[email protected]','[email protected]'])ascursor2:forrow2incursor2:linelist.append(row2)#Storethelineslenghtsandgeometriesinalistlinelist=sorted(linelist,key=lambdax:x[0])#Sortshortesttolongest(thetwoshortestsidesoftherectanglescomefirstandsecondinlist)arcpy.CopyFeatures_management(in_features=linelist[0][1],out_feature_class=r'in_memory\templine')#Copythefirstlinetomemorywitharcpy.da.UpdateCursor(r'in_memory\templine',['[email protected]','[email protected]'])ascursor3:forrow3incursor3:newcentroidx=row[1]#Findxcoordofboundingrectanglecentroidnewcentroidy=row[2]#Findy..row3[0]=newcentroidx#Assignthistotheshortestlinerow3[1]=newcentroidy#Assignthistotheshortestlinecursor3.updateRow(row3)#Movethelinetothecentroidofboundingrectanglearcpy.Append_management(inputs=r'in_memory\templine',target=outfc_splitlines)#Savethislineinsplitlinefeatureclass#Afterallsplitlinesarecreatedconvertinputpolygonstolines,mergewithsplitlinesandcreatenewpolygonsfromlines.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'

Los atributos se perderán, pero puedes usar la combinación espacial para volver a agregarlos.

    
respondido por el BERA 14.03.2017 - 16:15

Lea otras preguntas en las etiquetas