Necesito numerar miles de polígonos en grupos, para que cada grupo tenga un número único. Cada polígono que se cruza es un grupo único (ver imagen).
Así que los polígonos tienen "grupos" de campos con valores:
Los polígonos 1,2,3 son el grupo 1;
Los polígonos 4,5 son el grupo 2;
los polígonos 6,7,8,9 son el grupo 3 y así sucesivamente...
Mi enfoque actual es muy lento, tarda unos 5 minutos en enumerar capas con unos 10 000 polígonos (son 4 100 grupos).
¿Hay alguna forma más rápida de hacerlo?
Esto es lo que hago:
- Disolver todos los polígonos - esa es mi manera de encontrar grupos (arcpy.Dissolve_management)
- Dar números únicos a cada polígono en la capa disuelta (arcpy.CalculateField_management)
- Iterar cada característica en la capa disuelta (arcpy.SelectLayerByAttribute_management)
- Seleccione los polígonos que se cruzan con la capa original (no disuelta).
- Darles número de grupo (arcpy.CalculateField_management)
Aquí está una parte del código:
#1
arcpy.Dissolve_management(fc, dissolve_shp, "", "", "SINGLE_PART")
#2
arcpy.CalculateField_management(dissolve_shp, "ID", '!FID!+1', "PYTHON")
#3
number_of_rows = arcpy.GetCount_management(dissolve_shp)
number_of_rows = int(number_of_rows.getOutput(0))
lyr_dissolve = r"in_memory\Temporary_layer_DISSOLVE_DEL"
lyr_merge = r"in_memory\Temporary_layer_MERGE_DEL"
arcpy.MakeFeatureLayer_management(dissolve_shp, lyr_dissolve)
arcpy.MakeFeatureLayer_management(fc, lyr_merge)
for i in range(number_of_rows):
i2=i+1
if float(i2)//100 == float(i2)/100:
print i2, "of", number_of_rows
arcpy.SelectLayerByAttribute_management (lyr_dissolve, "NEW_SELECTION", '"ID" = '+str(i2))
#4
arcpy.SelectLayerByLocation_management (lyr_merge, "INTERSECT", lyr_dissolve)
#5
arcpy.CalculateField_management(lyr_merge, "TERM_P_NUM", i2, "PYTHON")
5 votos
Viendo que los grupos son los individuales disueltos por qué no Intersectar (o unión) ellos, que obtiene el GroupID en los polígonos ... añadiendo un campo (OrigID) y la copia de los valores FID antes de la unión significará que usted puede encontrar el original (fuente) polígono para el área de intersección. A continuación, iterar los polígonos con un UpdateCursor utilizando whereclause GroupID = 1..n para enumerar cada polígono en el grupo.
1 votos
@MichaelMiles-Stimson No he hecho una prueba para confirmarlo, pero creo que la superposición de polígonos debería permitir al solicitante prescindir del cursor de ArcPy y de los miles de Selecciones de capas por lugares, para reducir el tiempo a unos 10-15 segundos en total. Te deben una. No creo que pidan hacer esa última enumeración que mencionas.
0 votos
¿Puede acceder a Vecinos del polígono en Análisis>Caja de herramientas de proximidad?
0 votos
@ fatih_dur sí tengo todas las herramientas de ArcGIS disponibles
0 votos
@MichaelMiles-Stimson Su enfoque funciona bien y es mucho más rápido que el mío. El único problema es la división de los polígonos. La herramienta de unión divide todos los polígonos por la línea de intersección. Yo evito esto disolviendo de nuevo (usar la opción de campos de atributos).
0 votos
Si no es eso lo que busca, utilice Spatial Join para transferir los atributos de los grupos. Hay algunas herramientas de superposición (polígono sobre polígono) que funcionan más o menos igual pero de forma ligeramente diferente, en este caso la unión espacial de polígonos originales a grupos disueltos y enumerados no romperá los polígonos en secciones superpuestas.