Salut, sunt Alex de la DEV STORIES DOT EU. Rasterio:
Numpy pentru date geospațiale, episodul 5 din 5. Uneori ai imagini satelitare superbe, de înaltă rezoluție, dar modelul tău climatic acceptă doar inputuri grosiere, de rezoluție mică. Nu poți pur și simplu să dai slice la array, pentru că pixelii rezultați trebuie să reprezinte exact aceeași zonă fizică, doar într-un grid cu densitate mai mică. Ca să faci asta corect, ai nevoie de resampling și writing.
Aici nu este vorba despre reproiecție. Sistemul de referință de coordonate rămâne exact același. Schimbăm doar rezoluția. Să zicem că trebuie să dai downsample la un raster la jumătate. În Rasterio, faci resampling-ul exact în momentul în care citești datele în memorie. Când apelezi metoda read pe dataset-ul tău, pasezi un parametru numit out shape. În loc să citească tot array-ul, Rasterio îl citește și îi dă scale imediat pentru a se potrivi cu shape-ul cerut. Pentru un raster cu o singură bandă, out shape-ul tău ar fi un tuple care specifică o bandă, apoi jumătate din înălțimea originală și jumătate din lățimea originală.
De asemenea, trebuie să-i spui lui Rasterio cum să calculeze valorile acestor pixeli noi, mai mari. Faci asta pasând un parametru de resampling. Rasterio oferă un enum Resampling pentru asta. Dacă lucrezi cu date continue, cum ar fi temperatura, poți pasa Resampling dot bilinear, care calculează o medie ponderată a pixelilor din jur. Dacă lucrezi cu date categorice, cum ar fi acoperirea terenului, ai folosi Resampling dot nearest pentru a păstra exact valorile originale ale claselor.
Aici e ideea cheie. Acum ai un array Numpy nou, mai mic, dar care reprezintă exact aceeași zonă geografică de pe Pământ. Pentru că array-ul are mai puțini pixeli, fiecare pixel în parte acoperă mai mult spațiu fizic. Asta înseamnă că transformarea Affine originală este acum complet greșită. Dacă scrii noul array pe disk folosind vechea transformare, imaginea ta se va micșora pe hartă și va acoperi doar un sfert din suprafața originală.
Trebuie să scalezi transformarea. Faci asta luând transformarea dataset-ului original și înmulțind-o cu o matrice de scalare Affine. Găsești rapoartele de scalare împărțind lățimea originală la noua lățime, și înălțimea originală la noua înălțime. Pentru că am înjumătățit dimensiunile, ambele rapoarte sunt exact doi. Când înmulțești transformarea originală cu acești factori de scalare, obții o nouă transformare în care dimensiunile pixelilor sunt dublate, dar punctul de origine din stânga-sus rămâne perfect ancorat.
Acum ai array-ul resampled și transformarea scalată. Pasul final este scrierea unui GeoTIFF valid pe disk. Pentru asta, ai nevoie de metadata. Cea mai sigură abordare este să copiezi proprietatea profile din dataset-ul sursă. Asta îți dă un dictionary care conține driver-ul fișierului, sistemul de referință de coordonate, tipul de date și valoarea nodata. Apoi actualizezi acest dictionary profile cu noua înălțime, noua lățime și transformarea nou calculată.
Cu profile-ul actualizat gata, apelezi rasterio dot open. Oferi noul nume de fișier, setezi modul pe write și despachetezi dictionary-ul profile ca keyword arguments. Asta creează un dataset gol pe disk, formatat conform specificațiilor tale exacte. În cele din urmă, apelezi metoda write pe acest nou obiect dataset și pasezi array-ul tău Numpy downsampled. Array-ul este scris în fișier, iar noul tău GeoTIFF de rezoluție mai mică este gata pentru modelul climatic.
Ține minte, modificarea datelor raster este mereu un contract în două părți: dacă schimbi shape-ul array-ului Numpy, trebuie să modifici explicit transformarea Affine ca să se potrivească, altfel amprenta spațială este stricată. Asta ne aduce la finalul seriei noastre. Te încurajez să citești documentația oficială Rasterio ca să explorezi alți algoritmi de resampling și să încerci să construiești aceste pipeline-uri hands-on. Dacă vrei să sugerezi subiecte pentru o serie viitoare, vizitează devstories dot eu. Aș vrea să-mi iau un moment să-ți mulțumesc pentru că ne asculți — ne ajută enorm. Să ai o zi faină!