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

14

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 entidades como esta:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

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 mirando desde 1 número, así que si tengo un polígono y tiene 4 vértices, quiero convertir el polígono en vértices, mostraré un número de vértices como este (1, 2, 3, 4, 5), luego se muestra xy para cada vértice, creo que la verdadera identificación del desafío, cómo convertir todos los polígonos en vértices y hacer que cada número de vértices comience desde 1 número.

Hombre SIG
fuente
Según su edición, ¿desea que cada entidad tenga una ID única (1 .... n) por entidad y coordenadas XY? ¿Preferiría que una columna / campo tenga toda esta información para fines de etiquetado, por ejemplo, [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...?
Aaron
sí, si no es un error, uno archivado tiene una identificación para el número de vértices de cada polígono como este (1,2,3,4), (1,2,3,4,5), (1,2,3,4, 5,6,), (1,2,3,4,5,6,7,8,9), etc., entonces creo que xy puede ser fácil si llamamos agregar herramienta xy desde arctoolbox
GIS Man

Respuestas:

5

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

import arcpy
arcpy.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 puede eliminarse seleccionando todos los puntos que tengan valores "DRAW_ORDER" nulos o únicos, si no son necesarios para la reconstrucción. Se puede utilizar una consulta de definición para eliminar los puntos superpuestos de la pantalla.

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

También estaba jugando con FeatureClass en una matriz numpy, pero terminé esto primero.

gm70560
fuente
gracias @ gm70560, he seguido sus variables de código y lo guardé como .py, pero cuando quiero ejecutarlo, aparece un mensaje de error, "El nombre de campo especificado no existe dentro de la tabla", entonces, ¿qué puedo hacer? ?
GIS Man
Aquí hay una pantalla de impresión desde mi PC, acabo de establecer la ruta de la clase de entidad de destino y la ruta para la salida de la nueva clase de entidad, en su código, si puede hacer una guía sobre cómo usar su código, imageshack.com/i/ fvsozep
GIS Man
No agregó el campo (?). ¿Qué pasó más arriba en los resultados? Tengo una sala de chat para volcar los resultados completos. Deja un comentario para que pueda revisar la habitación.
gm70560
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!.pointCountdevuelve el número total de vértices en la función. 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 Python para que esta expresión funcione.

Calculadora de campo

dmahr
fuente
Esto es realmente genial, pero no proporcionará el XY para cada uno de estos vértices. Parece que la respuesta sería usar ambas respuestas (es decir, también @ Aaron's) para obtener toda la información solicitada.
Roland
@Roland Tienes razón ... Me perdí la parte de la pregunta sobre los vértices XY. En ese caso, deberá usar el SearchCursormétodo en la respuesta de Aaron o una herramienta de geoprocesamiento como Vertices a puntos de entidades (aunque esta herramienta requiere una licencia ArcGIS for Desktop Advanced).
dmahr
muchas gracias @dmahr, creo que falta un paso, cuando calculo el valor, el resultado es el número de vértices, así que si tengo una clase de entidad de parcela con 5 vértices, quiero mostrarla así 1,2,3 , 4,5 en cada vértice, no cuenta todos los vértices en un número, el verdadero desafío es cómo mostrar el número de cada vértice a partir de 1 número para cada parcela.
GIS Man
12

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

  1. Presentar vértices a puntos
  2. Agregue dos nuevos campos (tipo: doble) en el nuevo punto FC "X", "Y"
  3. Calcular geometría. Haga clic con el botón derecho en el campo> Calcular geometría ...> Coordenada X del punto (repita para el campo Y)
  4. Agregue otro campo "XY" (tipo: 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 con el botón derecho en capa> Etiquetas> Campo de etiqueta: XY

Esto produce los siguientes resultados:

ingrese la descripción de la imagen aquí

También puede realizar estas acciones mediante programación mediante explode_to_pointsun cursor de búsqueda (como inicio).

Deconstruir una entidad en sus puntos o vértices individuales. Si explode_to_points se establece en True, una entidad multipunto con cinco puntos, por ejemplo, está representada por cinco filas.

(El valor predeterminado es False)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})
Aaron
fuente
parece que uno necesitaría algún proceso posterior o usar la respuesta de @ dmahr para obtener una suma por función de # de vértices.
Roland
4

Si uno no quiere calcular un nuevo campo y solo quiere obtener un número de vértices por capa muy rápidamente (para fines de generalización, como al exponer los conjuntos de datos en la web), entonces es posible crear una herramienta de script personalizada dentro de un 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,"SHAPE@")]
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,"SHAPE@")]
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)
Alex Tereshenkov
fuente