9 votos

¿Iteración de características y almacenamiento en búfer mediante GeoPandas?

Tengo un shapefile con muchos polígonos grandes y me gustaría procesar cada polígono individualmente porque las operaciones espaciales en todo el conjunto de datos son demasiado grandes para la memoria. Por ejemplo, iterar el shapefile, almacenar cada polígono, calcular las estadísticas zonales y almacenar los resultados como un único geodataframe.

¿Podemos iterar a través del marco de datos de las geopandas para amortiguar cada polígono por separado?

Mi código inicial no parece actualizar el área del geodataframe después del buffering.

import geopandas as gpd
#import rasterio

fp = r"E:\Polygon_Features.shp"
data = gpd.read_file(fp)
print(data.area)

data_buffer = data.copy()

for index, row in data_buffer.iterrows():    
    row['geometry'] = row['geometry'].buffer(500)

print(data_buffer.area)

1 votos

No soy exactamente una persona de pandas, pero parece como si hubieras hecho una copia del contenido de un flujo de sólo lectura, sin ningún intento de escritura.

12voto

Anton8000 Puntos 165

Mira la respuesta a Actualización del valor en iterrow para pandas :

Las filas que se obtienen de iterrows son copias que ya no están con el marco de datos original, por lo que las ediciones no cambian su marco de datos. Afortunadamente, debido a que cada elemento que se obtiene de iterrows contiene el índice actual, puede utilizarlo para acceder y editar el marco de datos fila correspondiente del marco de datos

Una forma más sencilla sería:

df.geometry = df.geometry.buffer(100)

Para las estadísticas zonales, intente rasterstats :

from rasterstats import zonal_stats
import geopandas as gpd
import pandas as pd

dem = '/folder/dem.tif'
polygons = '/folder/polygons.shp'

df = gpd.read_file(polygons)
stats = pd.DataFrame(zonal_stats(vectors=df['geometry'].buffer(1000), raster=dem))
df = pd.concat([df,stats], axis=1)

df.drop('geometry', axis=1)
   id sometext  count         max       mean        min
0   4   sdaasd   2548  114.134956  93.990887  77.059998
1   5  dffggfd   2455  114.134956  89.212946  77.059998
2   2  jhhgjgh   2414  110.125275  84.960471  76.599998
3   3    nbmnb   2321  108.325272  82.390840  76.599998
4   1   ytuyut   2275  104.621407  81.760467  76.599998

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X