Dividir polígonos no ponto médio usando o ArcPy?

14

Estou tentando dividir cerca de 4000 polígonos no ponto médio, perpendicular ao eixo mais longo (ou seja, através da largura no ponto médio), como no diagrama abaixo.

insira a descrição da imagem aqui

Idealmente, eu gostaria de fazer isso automaticamente e evitar a divisão manual de cada polígono. Eu extraí o ponto médio dos polígonos convertendo as linhas mais longas que podem ser desenhadas em cada uma; eu só preciso determinar um método para desenhar uma linha de largura através desse ponto automaticamente.

Os polígonos variam em largura e, portanto, as ferramentas que dividem polígonos definindo linhas de largura de um determinado comprimento não são exatamente o que estou procurando.

Alguma ideia?

Matt
fonte
todos os polígonos são convexos?
AnserGIS 14/03
Sim, eles têm mais ou menos formato semelhante ao mostrado no diagrama acima.
Matt
Crie perpendicular como descrito gis.stackexchange.com/questions/201867/… Use-os e o original como entradas para o recurso ao polígono. Ela vai ajudar a fazer perto de pontos de fronteiras
FelixIP
@ Matt minha resposta resolveu seu problema? Em caso afirmativo, você pode marcá-lo como respondido com a caixa de seleção?
BERA 23/03

Respostas:

23

O script abaixo produzirá uma nova classe de recurso de polígonos divididos e as linhas usadas para dividi-los. É necessária uma licença avançada.

Os polígonos serão divididos assim: insira a descrição da imagem aqui

insira a descrição da imagem aqui

Usando o retângulo de Centroid da geometria limite mínima como ponto médio e divida pelo retâ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'

insira a descrição da imagem aqui

Os atributos serão perdidos, mas você pode usar a Junção Espacial para adicioná-los novamente.

BERA
fonte
6
Ótima solução. Eu acho que deve ser observado que a licença Avançada é necessária para executar esta operação (splitline, featureToLine e featureToPolygon). Além disso, acho que adicionar alguns comentários em todo o seu código ajudará os novos usuários de python a entender o que cada linha está fazendo.
Fezter
Oi @BERA, desculpe pela resposta lenta. O script parece não funcionar, gerando o seguinte erro: ERRO 000466: in_memory \ templine não corresponde ao esquema das linhas de divisão de destino Falha ao executar (Anexar).
5157 Matt
1
Tente alterar a linha de acréscimo para: arcpy.Append_management (inputs = r'in_memory \ templine ', target = outfc_splitlines, schema_type =' NO_TEST ')
BERA
Parece obter outro erro, desta vez: Erro de análise IndentationError: unindent não corresponde a nenhum nível de indentação externo (linha 28)
Matt
Você precisa ter 8 espaços antes do arcpy.Append_manag ...
BERA