Ciao, sono Alex di DEV STORIES DOT EU. Rasterio:
Numpy per i dati geospaziali, episodio 5 di 5. A volte hai a disposizione bellissime immagini satellitari ad alta risoluzione, ma il tuo modello climatico accetta solo input grezzi e a bassa risoluzione. Non puoi semplicemente fare lo slice dell'array, perché i pixel risultanti devono comunque rappresentare l'esatta stessa area fisica, solo in una griglia a densità inferiore. Per farlo correttamente, hai bisogno di Resampling e Writing.
Non si tratta di reprojection. Il coordinate reference system rimane esattamente lo stesso. Stiamo solo cambiando la risoluzione. Mettiamo che tu debba fare il downsample di un raster della metà. In Rasterio, esegui il resampling nell'esatto momento in cui leggi i dati in memoria. Quando chiami il metodo read sul tuo dataset, passi un parametro chiamato out shape. Invece di leggere l'intero array, Rasterio lo legge e lo scala immediatamente per adattarlo alla shape che hai richiesto. Per un raster a banda singola, la tua out shape sarebbe una tuple che specifica una banda, poi metà dell'altezza originale e metà della larghezza originale.
Devi anche dire a Rasterio come calcolare i valori di questi nuovi pixel più grandi. Lo fai passando un parametro resampling. Rasterio fornisce un enum Resampling per questo. Se stai lavorando con dati continui come la temperatura, potresti passare Resampling dot bilinear, che calcola una media ponderata dei pixel circostanti. Se stai lavorando con dati categorici come la copertura del suolo, useresti Resampling dot nearest per preservare gli esatti valori di classe originali.
Ecco il punto chiave. Ora hai un nuovo array Numpy più piccolo, ma rappresenta ancora l'esatta stessa area geografica sulla Terra. Poiché l'array ha meno pixel, ogni singolo pixel copre più spazio fisico. Questo significa che la tua Affine transform originale ora è completamente sbagliata. Se scrivi il nuovo array su disco usando la vecchia transform, la tua immagine si restringerà sulla mappa fino a coprire solo un quarto della sua area originale.
Devi scalare la transform. Lo fai prendendo la transform del dataset originale e moltiplicandola per una Affine scaling matrix. Trovi gli scaling ratio dividendo la larghezza originale per la tua nuova larghezza, e l'altezza originale per la tua nuova altezza. Dato che abbiamo dimezzato le dimensioni, entrambi questi ratio sono esattamente due. Quando moltiplichi la transform originale per questi scaling factor, ottieni una nuova transform in cui le dimensioni dei pixel sono raddoppiate, ma il punto di origine in alto a sinistra rimane perfettamente ancorato.
Ora hai il tuo array resampled e la tua transform scalata. Il passaggio finale è scrivere un GeoTIFF valido su disco. Per farlo, hai bisogno dei metadati. L'approccio più sicuro è copiare la property profile dal tuo dataset di origine. Questo ti dà un dictionary contenente il file driver, il coordinate reference system, il data type e il valore nodata. Quindi aggiorni questo dictionary profile con la tua nuova altezza, la tua nuova larghezza e la tua transform appena calcolata.
Con il profile aggiornato pronto, chiami rasterio dot open. Fornisci il nuovo filename, imposti la modalità su write e fai l'unpack del tuo dictionary profile come keyword arguments. Questo crea un dataset vuoto su disco formattato secondo le tue esatte specifiche. Infine, chiami il metodo write su questo nuovo oggetto dataset e passi il tuo array Numpy downsampled. L'array viene scritto nel file, e il tuo nuovo GeoTIFF a bassa risoluzione è pronto per il modello climatico.
Ricorda, modificare i dati raster è sempre un contratto in due parti: se cambi la shape dell'array Numpy, devi cambiare esplicitamente l'Affine transform per farla corrispondere, o la tua impronta spaziale sarà compromessa. Questo ci porta alla fine della nostra serie. Ti incoraggio a leggere la documentazione ufficiale di Rasterio per esplorare altri algoritmi di resampling e provare a costruire queste pipeline hands-on. Se vuoi suggerire argomenti per una serie futura, visita devstories dot eu. Vorrei prendermi un momento per ringraziarti per l'ascolto — ci aiuta tantissimo. Buona giornata!