Sto tentando di fare un join spaziale in modo molto simile all'esempio qui: esiste un'opzione python per "unire gli attributi per posizione"? . Tuttavia, questo approccio sembra davvero inefficiente / lento. Anche eseguirlo con un modesto 250 punti richiede quasi 2 minuti e fallisce completamente su shapefile con> 1.000 punti. C'è un approccio migliore? Mi piacerebbe farlo interamente in Python senza usare ArcGIS, QGIS, ecc.
Sarei anche interessato a sapere se è possibile sommare gli attributi (ovvero la popolazione) di tutti i punti che ricadono all'interno di un poligono e unire quella quantità allo shapefile del poligono.
Ecco il codice che sto cercando di convertire. Viene visualizzato un errore sulla riga 9:
poly['properties']['score'] += point['properties']['score']
che dice:
TypeError: tipi di operando non supportati per + =: 'NoneType' e 'float'.
Se sostituisco "+ =" con "=", funziona bene ma ciò non somma i campi. Ho anche provato a renderli come numeri interi ma anche questo ha esito negativo.
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']})