3 votos

Usando geocubo en Python para rasterizar cada polígono en un shapefile

Tengo un shapefile de polígonos que traje a Python en Jupyter Notebook a través de GeoPandas como un geodataframe. Hay cientos de polígonos en este shapefile, y quiero crear un raster individual para cada polígono, donde cada raster tenga ese polígono rasterizado aislado, como si fuera el único polígono, donde cada raster de salida tenga un número único adjunto (por ejemplo, "Output_raster_35" etc.). Quiero quemar específicamente valores correspondientes a cada polígono dentro de la columna "Values" en este geodataframe.

Estoy tratando de usar el paquete geocube para esta tarea ejecutando lo siguiente para rasterizar todo el shapefile:

vector_fn = 'polygons.shp'

out_grid = make_geocube(
    vector_data=vector_fn,
    measurements=["Values"],
    resolution=(-25, 25),
    fill=-9999,
)
out_grid["Values"].rio.to_raster("my_rasterized_column.tif")

Este código fue sugerido en esta publicación de stackoverflow: Rasterizing polygons in shapefile using GDAL

Sin embargo, necesito iterar este proceso sobre cada polígono (fila), en lugar de rasterizar todos los polígonos a la vez.

Hasta ahora mi idea es:

polygons = gpd.read_file('polygons.shp')
polygon_IDs = polygons.Polygon_ID.tolist()

for i in polygon_IDs:
    x = polygons.loc[polygons.Polygon_ID == i]
    vector_fn = x

    out_grid = make_geocube(
        vector_data=vector_fn,
        measurements=["Values"],
        resolution=(-25, 25),
        fill=-9999,
    )
    out_grid["Values"].rio.to_raster("Output_Raster")

Aunque tengo problemas para saber si tengo mi lógica y sintaxis correctas aquí.

¿Cómo puedo corregir mi código para que cree rasters quemados individuales para cada polígono en el shapefile donde los archivos de salida de raster estén numerados?

2voto

rashid Puntos 23

He realizado un par de cambios:

He reemplazado polygon_ID por ['id']. Así es como se llama a una columna/atributo de un dataframe.

He añadido str(i) a tu sección de guardado para guardar el siguiente polígono que sea seleccionado a través de tu bucle for.

import geopandas as gpd
from geocube.api.core import make_geocube

polígonos = gpd.read_file('testing.shp')
IDs_polígono = polígonos['id'].tolist()

for i in IDs_polígono:
    x = polígonos.loc[polígonos['id'] == i]
    vector_fn = x
    out_grid = make_geocube(
        vector_data=vector_fn,
        measurements=["values"],
        resolution=(-25, 25),
        fill=-9999,
    )
    out_grid["values"].rio.to_raster(str(i) + "_Output_Raster.tif")

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