Estoy intentando hacer una unión espacial muy parecida al ejemplo de aquí: ¿Existe una opción en python para "unir atributos por ubicación"? . Sin embargo, ese enfoque parece realmente ineficiente / lento. Incluso ejecutando esto con unos modestos 250 puntos se tarda casi 2 minutos y falla por completo en shapefiles con > 1.000 puntos. ¿Existe un enfoque mejor? Me gustaría hacer esto completamente en Python sin usar ArcGIS, QGIS, etc.
También me interesaría saber si es posible sumar los atributos (es decir, la población) de todos los puntos que caen dentro de un polígono y unir esa cantidad al shapefile del polígono.
Aquí está el código que estoy tratando de convertir. Me da un error en la línea 9:
poly['properties']['score'] += point['properties']['score']
que dice:
TypeError: tipo(s) de operando no soportado(s) para +=: 'NoneType' y 'float'.
Si sustituyo el "+=" por "=" funciona bien pero no suma los campos. También he probado a hacerlos como enteros pero también falla.
with fiona.open(poly_shp, 'r') as n:
with fiona.open(point_shp,'r') as s:
outSchema = {'geometry': 'Polygon','properties':{'region':'str','score':'float'}}
with fiona.open (out_shp, 'w', 'ESRI Shapefile', outSchema, crs) as output:
for point in s:
for poly in n:
if shape(point['geometry']).within(shape(poly['geometry'])):
poly['properties']['score']) += point['properties']['score'])
output.write({
'properties':{
'region':poly['properties']['NAME'],
'score':poly['properties']['score']},
'geometry':poly['geometry']})