Salut, c'est Alex de DEV STORIES DOT EU. Rasterio :
Numpy pour les données géospatiales, épisode 5 sur 5. Parfois, tu as de magnifiques images satellites haute résolution, mais ton modèle climatique n'accepte que des inputs grossiers et basse résolution. Tu ne peux pas juste slicer l'array, parce que les pixels qui en résultent doivent toujours représenter exactement la même zone physique, juste sur une grille moins dense. Pour faire ça correctement, tu as besoin du resampling et du writing.
Il ne s'agit pas de reprojection. Le coordinate reference system reste exactement le même. On change uniquement la résolution. Disons que tu dois downsampler un raster de moitié. Dans Rasterio, tu fais le resampling au moment précis où tu lis les données en mémoire. Quand tu appelles la méthode read sur ton dataset, tu passes un paramètre appelé out shape. Au lieu de lire tout l'array, Rasterio le lit et le scale immédiatement pour qu'il corresponde à la shape que tu as demandée. Pour un raster à une seule bande, ton out shape serait un tuple spécifiant une bande, puis la moitié de la hauteur d'origine, et la moitié de la largeur d'origine.
Tu dois aussi indiquer à Rasterio comment calculer les valeurs de ces nouveaux pixels plus grands. Tu fais ça en passant un paramètre resampling. Rasterio fournit un enum Resampling pour ça. Si tu traites des données continues comme la température, tu peux passer Resampling dot bilinear, qui calcule une moyenne pondérée des pixels environnants. Si tu traites des données catégorielles comme l'occupation du sol, tu vas utiliser Resampling dot nearest pour conserver les valeurs de classe d'origine exactes.
Voici le point clé. Tu as maintenant un nouvel array Numpy plus petit, mais il représente toujours exactement la même zone géographique sur Terre. Comme l'array contient moins de pixels, chaque pixel individuel couvre un espace physique plus grand. Ça veut dire que ton Affine transform d'origine est maintenant complètement fausse. Si tu écris le nouvel array sur le disque en utilisant l'ancienne transform, ton image va rétrécir sur la carte pour ne couvrir plus qu'un quart de sa surface d'origine.
Tu dois scaler la transform. Tu fais ça en prenant la transform du dataset d'origine et en la multipliant par une matrice de scaling Affine. Tu trouves les ratios de scaling en divisant la largeur d'origine par ta nouvelle largeur, et la hauteur d'origine par ta nouvelle hauteur. Puisqu'on a divisé les dimensions par deux, ces deux ratios sont exactement de deux. Quand tu multiplies la transform d'origine par ces facteurs de scaling, tu obtiens une nouvelle transform où les dimensions en pixels sont doublées, mais le point d'origine en haut à gauche reste parfaitement ancré.
Tu as maintenant ton array resamplé et ta transform scalée. L'étape finale, c'est d'écrire un GeoTIFF valide sur le disque. Pour faire ça, tu as besoin de metadata. L'approche la plus sûre est de copier la propriété profile de ton dataset source. Ça te donne un dictionnaire contenant le file driver, le coordinate reference system, le data type et la valeur nodata. Tu mets ensuite à jour ce dictionnaire profile avec ta nouvelle hauteur, ta nouvelle largeur et ta transform fraîchement calculée.
Une fois le profile mis à jour, tu appelles rasterio dot open. Tu fournis le nouveau nom de fichier, tu mets le mode sur write, et tu unpack ton dictionnaire profile comme keyword arguments. Ça crée un dataset vide sur le disque, formaté selon tes spécifications exactes. Enfin, tu appelles la méthode write sur ce nouvel objet dataset et tu lui passes ton array Numpy downsamplé. L'array est écrit dans le fichier, et ton nouveau GeoTIFF basse résolution est prêt pour le modèle climatique.
N'oublie pas, modifier des données raster est toujours un contrat en deux parties : si tu changes la shape de l'array Numpy, tu dois explicitement modifier l'Affine transform pour qu'elle corresponde, sinon ta spatial footprint est cassée. Ça nous amène à la fin de notre série. Je t'encourage à lire la documentation officielle de Rasterio pour explorer d'autres algorithmes de resampling et essayer de construire ces pipelines toi-même. Si tu veux suggérer des sujets pour une future série, visite devstories dot eu. Je voudrais prendre un moment pour te remercier de ton écoute, ça nous aide beaucoup. Passe une bonne journée !