4 votos

Usa cursores de actualización en arcpy para contar el número de puntos dentro de cada polígono

Tengo dos archivos shape. Uno contiene muchos puntos del estado. El otro es el de todos los condados en el estado. Me gustaría hacer dos cosas:

  1. utilizar un cursor de contar cuántos puntos hay en cada condado y, a continuación, rellenar un campo nuevo con esos datos; y
    1. crear un tipo verdadero/falso, campo en el cual la verdadera = el condado contiene más de dos puntos.

Empecé el primero pero no tuvo éxito, por lo que la segunda no estoy seguro de cómo llevar a cabo. Esto es lo que tengo hasta ahora...

import arcpy

points = r"C:\Users\points"
counties = r"C:\Users\counties"
#create new fields
arcpy.AddField_management(counties, "numOfPoints", "LONG", field_length = 10)
arcpy.AddField_management(counties, "hasTwoPoints", "LONG", field_length = 10)

points_lyr = arcpy.MakeFeatureLayer_management(points,r'in_memory\points_lyr')
counties_lyr = arcpy.MakeFeatureLayer_management(counties,r'in_memory\counties_lyr')
# Create an update cursor to access and update states features
#NAME has names of counties and numPoints will be populated with number of points 
fields = ['NAME','numOfPoints','hasTwoPoints']

with arcpy.da.UpdateCursor(counties_lyr,fields) as cur:
    for row in cur:
        county = row[0]
        where = '"NAME" = \'{}\''.format(county)
        arcpy.SelectLayerByAttribute_management(counties_lyr,'NEW_SELECTION',where)
        arcpy.SelectLayerByLocation_management(points_lyr,'INTERSECT',counties_lyr)
        number_of_points = int(arcpy.GetCount_management(counties_lyr).getOutput(0))
        row[1] = number_of_points
        cur.updateRow(row)
print('Operation complete.')

La secuencia de comandos actual funciona, pero se rellena el campo "numOfPoints' con todos los valores 1 lo cual no es correcto.

luego, al final agregar el verdadero/falso basado en la salida de un solo script,

fields2 = ['numOfPoints','hasTwoPoints']

with arcpy.da.UpdateCursor(counties_lyr,fields2) as cur:
   for row in cur:
       if row[0] > 1: row[1] = 'TRUE'
   else: row[1] = 'FALSE'
   cur.updateRow(row)

Me sale este error: StopIteration: iteración no se inicia

5voto

sundry-somerset Puntos 16

Ya tienes una línea en mal estada:

Cuando calculas number_of_points, quieres GetCount points_lyr, no la counties_lyr.

Para hacer la segunda parte de tu pregunta, tienes que borrar todas las selecciones:

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