Tengo dos archivos shape que abarcan 3897 características cada uno. Los shapefiles correspondientes (pueblo y cuenca que desemboca en él) tienen el mismo ID (ws_id en uno, OBJECTID en el otro). Muchas cuencas hidrográficas se solapan. Debido a los errores en la capa de la cuenca, quiero comparar las áreas de cada cuenca con su pueblo correspondiente (settelment_area para los pueblos y Shape_Area para las cuencas). Si la cuenca tiene una superficie menor que la del pueblo en el que desemboca, hay que eliminarla y añadir los datos del pueblo correspondiente a los del pueblo en el que desemboca la siguiente cuenca (los datos incluyen el área urbana y la población).
He intentado hacer esto usando cursores y tablas temporales, pero mis conocimientos de python no son muy buenos y parece que pierdo muchos de los datos relacionados por el camino (terminando con listas vacías).
utilizando arcgis desktop 10.2 con licencia avanzada
Código
#the aim of this code is to get rid of erroneous data by creating a new serviceshed_v0 shapefile which would contain only serviceshed which are larger than the settlement they run into.
#it could then be extended to have different minium size requirements for servicesheds
import arcpy
arcpy.CheckOutExtension("spatial")
arcpy.env.overwriteOutput = True
workdir = r'C:\Users\xxx\beneficiarylayers.gdb'
arcpy.env.workspace = workdir
fc1 = workdir + r'\servicesheds_v0'
fc2 = workdir + r'\miyun_settlements'
fc1table = arcpy.CreateTable_management(workdir, 'fc1table')
fc2table = arcpy.CreateTable_management(workdir, 'fc2table')
template = workdir + r'\template'
arcpy.CreateTable_management(workdir, 'servicesheds_v1', template)
newservicesheds = workdir + r'\servicesheds_v1'
rows = arcpy.SearchCursor(fc1)
for row in rows:
arcpy.Append_management('Shape_Area', fc1table)
del row, rows
rows = arcpy.SearchCursor(fc2)
for row in rows:
arcpy.Append_management('settlement_area', fc2table)
del row, rows
rows = arcpy.SearchCursor(fc1table)
for row in rows:
if fc1table > fc2table:
arcpy.Append_management(row, newservicesheds)
del row, rows
es un primer intento. El problema es que me doy cuenta de que las tablas no son el camino a seguir porque los datos que relacionan cada tupla con un polígono se pierden. me gustaría conseguir algo como esto para trabajar (abajo), pero no estoy seguro de si se permite en python synthax
arcpy.CreateTable_management(workdir, 'servicesheds_v1')
newservicesheds = workdir + r'\servicesheds_v1'
cursor1=arcpy.da.SearchCursor(fc1, "Shape_Area")
cursor2=arcpy.da.SearchCursor(fc2, "settlement_area")
for row in cursor1:
if 'Shape_Area' in cursor1 > 'settlement_area' in cursor2:
arcpy.Append_management(row, newservicesheds)
CÓDIGO FINAL He aquí un método que permite crear rápidamente una lista con todos los polígonos que cumplen la función de ser demasiado pequeños.
import arcpy
arcpy.CheckOutExtension("spatial")
arcpy.env.overwriteOutput = True
workdir = r'C:\Users\xx\beneficiarylayers.gdb'
arcpy.env.workspace = workdir
fc1 = workdir + r'\servicesheds_v0'
fc2 = workdir + r'\miyun_settlements'
#set up cursors
cursor1 = arcpy.da.SearchCursor(fc1, ["ws_id", "Shape_Area"])
cursor2 = arcpy.da.SearchCursor(fc2, ["OBJECTID", "settlement_area"])
wrongsheds = []
#make a dictionary and store values from watershed table
serviceshed_area = {}
for row in cursor1:
serviceshed_areas[row[0]] = row[1]
#loop through other table
for row in cursor2:
if row[1] > serviceshed_areas[row[0]]:
# if serviceshed_areas < village_Areas add to list and print
wrongsheds.append(row[0])
print "serviceshed {} is wrong".format(row[0])