6 votos

¿Contar el número de atributos para valores de campo únicos en ArcGIS for Desktop?

Con ArcGIS 10.1 para Desktop, tengo dos clases de características en una geodatabase. Una es una FC de puntos para los colegios electorales, la otra es una FC de polígonos para los estados.

El FC del colegio electoral contiene más de 1000 puntos y tiene un campo de estados que indica en qué estado se encuentra el colegio electoral. La FC de estados tiene un atributo para cada estado y tiene un campo en blanco para el número de colegios electorales en cada estado.

Necesito un python script que obtenga el recuento de cuántos colegios electorales se encuentran en cada estado a partir de la FC de los colegios electorales, y luego escriba esos números en la columna de la FC de los estados - obviamente a su estado correspondiente.

6voto

Aissen Puntos 131

Si utiliza ArcGIS, creo que una forma fácil de hacerlo, sin crear ningún producto intermedio, sería seleccionar cada estado en su polígono de estados (suponiendo que tiene características multiparte) y luego seleccionar por ubicación las características de los colegios electorales. A continuación, puede obtener un recuento de cuántas características están seleccionadas y escribir este valor en su polígono de estados. Esto sería algo así:

import arcpy

# Define some variables
#
polling_stations = r'c:\path\to\geodatabase.gdb\polling_stations'
states = r'c:\path\to\geodatabase.gdb\states'

# Make feature layers for processing
#
polling_stations_lyr = arcpy.MakeFeatureLayer_management(polling_stations,r'in_memory\polling_stations_lyr')
states_lyr = arcpy.MakeFeatureLayer_management(states,r'in_memory\states_lyr')

# Create an update cursor to access and update states features
#
fields = ['field_containing_state_names','field_which_will_be_updated_with_#_of_polls']
with arcpy.da.UpdateCursor(states_lyr,fields) as cur:
    for row in cur:

        # Make a query to select this feature to be used in a selection of polling places
        #
        state = row[0]
        where = '"field_containing_state_names" = \'{}\''.format(state)
        arcpy.SelectLayerByAttribute_management(states_lyr,'NEW_SELECTION',where)

        # Now select the polling stations by location using the selected state feature
        #
        arcpy.SelectLayerByLocation_management(polling_stations_lyr,'INTERSECT',states_lyr)

        # Count the number of polling stations selected
        #
        number_of_polling_stations = int(arcpy.GetCount_management(polling_stations_lyr).getOutput(0))

        # Update the state feature with this value
        #
        row[1] = number_of_polling_stations
        cur.updateRow(row)

print('Operation complete.')

Este código requiere ArcGIS 10.x, pero puede hacerse compatible con versiones anteriores utilizando el cursor de estilo antiguo en lugar del cursor del módulo de acceso a datos utilizado aquí.

0 votos

Gracias, ¡esto ha ayudado mucho! Parece que algo con el 'SelectLayerByAttribute' no está funcionando correctamente. Me di cuenta de que la cláusula where estaba en la ubicación incorrecta (debería venir después de 'NEW_SELECTION') pero esto no resolvió el problema. Cuando ejecuto el script después de cambiar la ubicación de la cláusula where, obtengo un error de expresión no válida.

0 votos

Perdón por eso, tienes razón en lo del orden lo actualizaré en mi respuesta. Creo que la "expresión inválida" se debe a unas comillas que faltan y que dejé fuera del where declaración. Lo arreglaré también... hazme saber cómo te funciona.

6voto

Amy Puntos 46

Hay varias maneras de abordar esto, pero aquí hay una bastante fácil. Voy a asumir que usted está usando ArcGIS. Esto se puede hacer fácilmente sin python. ¿Has mirado el Resumen estadístico ¿herramienta? Puede ejecutarla en la capa del colegio electoral y unir la tabla resultante a la clase de características del Estado.

Establezca el campo Estadística como Estado y el tipo de estadística como Recuento. Une los resultados a la clase de característica de estado y actualiza el campo Recuento en esa capa.

2voto

dchanson Puntos 29

Asumiendo que estás usando ArcGIS, podrías escribir un python script para hacer esto, pero también podrías simplemente hacer lo siguiente:

  1. Intersecte los puntos con los polígonos del estado. Esto producirá un nuevo conjunto de datos de puntos.
  2. Ejecutar un el Frecuencia para obtener un recuento del número de puntos por campo estatal.
  3. Une esto al polígono original del estado FC y calcula tu columna.

0 votos

El único problema posible con el uso de la herramienta de frecuencia en lugar de la herramienta de resumen estadístico es que la frecuencia sólo está disponible (ridículamente) con una licencia de ArcInfo/Advanced.

1voto

Tommy Puntos 21

Para aportar otra solución no basada en el código Python: Se podría utilizar la herramienta 'Tabular Intersection' para obtener una tabla de salida por estados con el número de colegios electorales que se cruzan. Esta tabla, de nuevo, puede unirse al Shapefile de los estados para añadir la columna de atributos con el número de colegios electorales.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X