Estoy tratando de conseguir un número de puntos en polígonos basándose en los valores de fila, y escríbelos en la tabla de atributos de los polígonos. He polígono (Zonas), y los puntos (Objetos con campos tales como escuelas, mercados, hoteles, tiendas) que se encuentran en los polígonos. Quiero seleccionar los puntos en función de sus atributos (por ejemplo yo quiero saber cuántas escuelas hay en mi polígono, y escribir en un campo. y repita el proceso para otros atributos de cómo muchos de los hoteles/mercados/tiendas hay en el polígono de las zonas, etc).
No era una pregunta similar, y esta respuesta fue buena para Contar el número de atributos únicos valores de campo, pero sólo para la selección de la ubicación. El script devuelve el recuento de todos los número de objetos en el polígono de las zonas, y no estaba basada en atributos, justo en el lugar.
Me las arreglé para modificar la secuencia de comandos, desde el enlace. Este es el código, y me da resultado, la suma de todos los puntos, y fue escrita en fila:
import arcpy
Objects = r'D:\GIS_Temp\Points.shp'
Zones = r'D:\GIS_Temp\Zones.shp'
Objects_lyr = arcpy.MakeFeatureLayer_management(Objects,r'in_memory\Objects_lyr')
Zones_lyr = arcpy.MakeFeatureLayer_management(Zones,r'in_memory\Zones_lyr')
fields = ['Descrip','Point_Sum']
with arcpy.da.UpdateCursor(Zones_lyr,fields) as cur:
for row in cur:
Zones = row[0]
where = '"Descrip" = \'{}\''.format(Zones)
arcpy.SelectLayerByAttribute_management(Zones_lyr,'NEW_SELECTION',where)
arcpy.SelectLayerByLocation_management(Objects_lyr,'INTERSECT',Zones_lyr)
Point_Sum = int(arcpy.GetCount_management(Objects_lyr).getOutput(0))
row[1] = Point_Sum
cur.updateRow(row)
print('Operation complete.')
Y este es el resultado:
Pero quiero actualizar Zonas, basado en la intersección de los Objetos, sino que se basa en los atributos, y la actualización de las filas en las Zonas, con número de intersección de objetos (Hoteles, Tiendas, Mercados, Escuelas).
Lo que me estoy perdiendo en mi código. Supongo que tiene algo que ver con la selección por atributos, o con bucle, como se sugiere en los comentarios, debo crear bucle dentro de un bucle, pero no estoy seguro de donde ponerlo, y cómo. Entiendo por qué, pero no sé cómo.
EDITAR:
Traté de modificar el código, como este, por lo que la selección hecha por el atributo de forma individual y tratar de ponerlas en su propia fila, pero no hubo suerte. Código ok, no hay ningún error, pero no actualiza nada.
Es allí cualquier modificación a este, lo que podría acelerar mi flujo de trabajo, en caso de tener más de cuatro valores (como en este ejemplo, escuelas, etc)? Este es el código:
import arcpy
Objects = r'D:\GIS_Temp\Points.shp'
Zones = r'D:\GIS_Temp\Zones.shp'
ObjectsSCHOOLS_lyr = arcpy.MakeFeatureLayer_management(Objects,r'SCHOOLS', "\"Name\" = 'Schools'")
ObjectsMARKETS_lyr = arcpy.MakeFeatureLayer_management(Objects,r'MARKETS', "\"Name\" = 'Markets'")
ObjectsHOTELS_lyr = arcpy.MakeFeatureLayer_management(Objects,r'HOTELS', "\"Name\" = 'Hotels'")
ObjectsSHOPS_lyr = arcpy.MakeFeatureLayer_management(Objects,r'SHOPS', "\"Name\" = 'Shops'")
Zones_lyr = arcpy.MakeFeatureLayer_management(Zones,r'in_memory\Zones_lyr')
fields = ['Descrip','Schools_Nr', 'Markets_Nr', 'Hotels_Nr', 'Shops_Nr']
with arcpy.da.UpdateCursor(Zones_lyr,fields) as cur:
for row in cur:
state = row[0]
where = '"Descrip" = \'{}\''.format(Zones)
arcpy.SelectLayerByAttribute_management(Zones_lyr,'NEW_SELECTION',where)
arcpy.SelectLayerByLocation_management(ObjectsSCHOOLS_lyr,'INTERSECT',Zones_lyr)
Schools_Nr = int(arcpy.GetCount_management(ObjectsSCHOOLS_lyr).getOutput(0))
row[1] = Schools_Nr
cur.updateRow(row)
for row in cur:
state = row[0]
where = '"Descrip" = \'{}\''.format(Zones)
arcpy.SelectLayerByAttribute_management(Zones_lyr,'NEW_SELECTION',where)
arcpy.SelectLayerByLocation_management(ObjectsMARKETS_lyr,'INTERSECT',Zones_lyr)
Markets_Nr = int(arcpy.GetCount_management(ObjectsMARKETS_lyr).getOutput(0))
row[1] = Markets_Nr
cur.updateRow(row)
for row in cur:
state = row[0]
where = '"Descrip" = \'{}\''.format(Zones)
arcpy.SelectLayerByAttribute_management(Zones_lyr,'NEW_SELECTION',where)
arcpy.SelectLayerByLocation_management(ObjectsHOTELS_lyr,'INTERSECT',Zones_lyr)
Hotels_Nr = int(arcpy.GetCount_management(ObjectsHOTELS_lyr).getOutput(0))
row[1] = Hotels_Nr
cur.updateRow(row)
for row in cur:
state = row[0]
where = '"Descrip" = \'{}\''.format(Zones)
arcpy.SelectLayerByAttribute_management(Zones_lyr,'NEW_SELECTION',where)
arcpy.SelectLayerByLocation_management(ObjectsSHOPS_lyr,'INTERSECT',Zones_lyr)
Shops_Nr = int(arcpy.GetCount_management(ObjectsSHOPS_lyr).getOutput(0))
row[1] = Shops_Nr
cur.updateRow(row)
print('Operation complete.')