Hola, soy Alex de DEV STORIES DOT EU. Rasterio:
Numpy para datos geoespaciales, episodio 5 de 5. A veces tienes imágenes de satélite preciosas y de alta resolución, pero tu modelo climático solo acepta inputs de baja resolución. No puedes simplemente hacer un slice del array, porque los píxeles resultantes todavía tienen que representar exactamente la misma área física, solo que en un grid de menor densidad. Para hacer eso correctamente, necesitas Resampling y Writing.
Esto no va de reproyección. El coordinate reference system se queda exactamente igual. Solo estamos cambiando la resolución. Digamos que necesitas hacer un downsample de un raster a la mitad. En Rasterio, haces el resampling en el momento exacto en el que lees los datos en memoria. Cuando llamas al método read en tu dataset, pasas un parámetro llamado out shape. En lugar de leer el array completo, Rasterio lo lee y lo escala inmediatamente para que encaje en el shape que has pedido. Para un raster de una sola banda, tu out shape sería una tupla especificando una banda, luego la mitad del height original, y la mitad del width original.
También tienes que decirle a Rasterio cómo calcular los valores de estos nuevos píxeles más grandes. Esto lo haces pasando un parámetro resampling. Rasterio proporciona un enum Resampling para esto. Si estás trabajando con datos continuos como la temperatura, podrías pasar Resampling punto bilinear, que calcula una media ponderada de los píxeles de alrededor. Si estás trabajando con datos categóricos como la cobertura del suelo, usarías Resampling punto nearest para preservar los valores de clase originales exactos.
Aquí está la clave. Ahora tienes un nuevo array Numpy más pequeño, pero sigue representando exactamente la misma área geográfica en la Tierra. Como el array tiene menos píxeles, cada píxel individual cubre más espacio físico. Esto significa que tu Affine transform original ahora está completamente mal. Si escribes el nuevo array a disco usando el transform antiguo, tu imagen encogerá en el mapa para cubrir solo una cuarta parte de su área original.
Tienes que escalar el transform. Esto lo haces cogiendo el transform del dataset original y multiplicándolo por una scaling matrix de Affine. Encuentras los scaling ratios dividiendo el width original entre tu nuevo width, y el height original entre tu nuevo height. Como hemos reducido las dimensiones a la mitad, ambos ratios son exactamente dos. Cuando multiplicas el transform original por estos scaling factors, obtienes un nuevo transform donde las dimensiones de los píxeles se duplican, pero el punto de origen arriba a la izquierda se queda perfectamente anclado.
Ahora tienes tu array con el resampling y tu transform escalado. El paso final es escribir un GeoTIFF válido a disco. Para hacer esto, necesitas metadatos. El enfoque más seguro es copiar la property profile de tu dataset de origen. Esto te da un diccionario que contiene el file driver, el coordinate reference system, el data type, y el valor nodata. Luego actualizas este diccionario profile con tu nuevo height, tu nuevo width, y tu transform recién calculado.
Con el profile actualizado listo, llamas a rasterio punto open. Le pasas el nuevo filename, pones el mode en write, y desempaquetas tu diccionario profile como keyword arguments. Esto crea un dataset vacío en disco formateado con tus especificaciones exactas. Finalmente, llamas al método write en este nuevo objeto dataset y le pasas tu array Numpy con el downsample. El array se escribe en el archivo, y tu nuevo GeoTIFF de menor resolución está listo para el modelo climático.
Recuerda, modificar datos raster es siempre un contrato de dos partes: si cambias el shape del array Numpy, tienes que cambiar explícitamente el Affine transform para que coincida, o tu spatial footprint se romperá. Eso nos lleva al final de nuestra serie. Te animo a leer la documentación oficial de Rasterio para explorar otros algoritmos de resampling y a probar a construir estas pipelines de forma práctica. Si quieres sugerir temas para una futura serie, visita devstories punto eu. Me gustaría tomarme un momento para darte las gracias por escucharnos; nos ayuda mucho. ¡Que vaya genial!