¿Extrae el número de vértices en cada polígono?

12

Tengo ArcGIS Desktop 10.2 y mi desafío es cómo extraer el número de vértices en cada polígono para todas las características como esta:

Tengo muchas parcelas en mi clase de entidad y quiero extraer el número de vértices para todas las entidades por separado, luego quiero mostrar las coordenadas XY para todos los vértices.

para obtener más información, solo quiero convertir los vértices de cada polígono y mostrar el número de cada vértice desde un número, así que si tengo un polígono y tengo 4 vértices, quiero convertir un polígono a vértices i mostrar el número de vértices como este (1,2,3,4,5), luego se muestra xy para cada vértice, creo que el verdadero ID de desafío, cómo convertir todos los polígonos en vértices y hacer cada número de vértices a partir de 1 número.

    
pregunta GIS Man 30.01.2014 - 14:36

4 respuestas

4

El siguiente código combina las otras respuestas y agrega un poco para numerar los vértices.

importarcpyarcpy.env.workspace="in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

Los puntos están etiquetados en orden de dibujo. El último punto (debajo del primero) no tendrá etiqueta y se puede eliminar seleccionando todos los puntos que tengan valores "DRAW_ORDER" únicos o nulos, si no son necesarios para la reconstrucción. Se puede usar una consulta de definición para eliminar los puntos superpuestos de la pantalla.

Los datos XY están presentes, pero se los dejaré a sus deseos de etiquetado / visualización. Vea la respuesta de Aaron acerca de agregar un campo XY para el etiquetado.

También estaba jugando con FeatureClass para numpy array, pero terminé esto primero.

    
respondido por el gm70560 07.02.2014 - 07:23
22

La forma más fácil de hacer esto es agregar un nuevo campo entero a la tabla de atributos de la capa de parcelas. Luego, ejecute la calculadora de campo con la siguiente expresión:

!Shape!.pointCount-!Shape!.partCount

El !Shape!.pointCount devuelve el número total de vértices en la entidad. Sin embargo, el primer vértice de cada parte se repite al final, para cerrar la característica. Para manejar esto, reste un vértice para cada parte usando -!Shape!.partCount .

Tenga en cuenta que tendrá que usar el analizador de Python para que esta expresión funcione.

    
respondido por el dmahr 30.01.2014 - 14:59
12

dmahr proporcionó una buena solución para contar vértices. Para una manera no programática de etiquetar cada punto con los acordes XY, pruebe el siguiente flujo de trabajo:

  1. Características de los vértices a los puntos
  2. Agregue dos nuevos campos (escriba: doble) en el nuevo punto FC "X", "Y"
  3. Calcular geometría. Haga clic derecho en el campo > Calcular geometría ... > X Coordenadas del punto (repetir para el campo Y)
  4. Agregue otro campo "XY" (escriba: Texto)
  5. Calcule el campo "XY" en la calculadora de campo, donde XY =

    str (! x!) + "," + str (! y!)

  6. Características de la etiqueta. Haga clic derecho en la capa > Etiquetas > Campo de etiqueta: XY

Esto produce los siguientes resultados:

Tambiénpuederealizarestasaccionesmedianteprogramaciónusandoexplode_to_pointsconun cursor de búsqueda (como comienzo).

  

Deconstruye una entidad en sus puntos individuales o vértices. Si   explode_to_points se establece en True, una característica multipunto con cinco   los puntos, por ejemplo, están representados por cinco filas.

     

(El valor predeterminado es False)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})
    
respondido por el Aaron 30.01.2014 - 14:53
4

Si uno no quiere calcular un nuevo campo y solo quiere recuperar un número de vértices por capa muy rápidamente (por motivos de generalización, como al exponer los conjuntos de datos en la web), entonces es posible crear una herramienta de secuencia de comandos personalizada dentro de una caja de herramientas o exponer el código como un complemento de Python.

Código de herramienta de script personalizado:

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"[email protected]")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

Código de complemento de Python (seleccione una capa en la tabla de contenido para contar los vértices):

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"[email protected]")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
    
respondido por el Alex Tereshenkov 30.09.2015 - 16:20

Lea otras preguntas en las etiquetas