v1.5 — Ediția 2026. Un scurt curs audio din 5 episoade care explorează Rasterio 1.5. Învață cum să creezi o punte între datele geospațiale complexe și Python, să procesezi terabytes de date raster folosind ferestre sigure pentru memorie și să scrii fără probleme noi seturi de date.
Descoperă cum Rasterio creează o punte între datele geospațiale complexe și Python. Acoperim deschiderea unui set de date, inspectarea metadatelor de bază și citirea benzilor raster direct în array-uri Numpy.
4m 11s
2
Transformarea Affine
Învață cum o grilă de pixeli se transpune în lumea reală. Analizăm în detaliu Coordinate Reference Systems (CRS) și matricea de transformare Affine folosită pentru a traduce indecșii array-ului în coordonate geografice.
3m 58s
3
Procesarea Windowed
Procesează terabytes de date raster fără să-ți blochezi computerul. Explorăm citirea și scrierea Windowed pentru a gestiona seturi de date masive în bucăți mici, sigure pentru memorie.
3m 38s
4
Mascarea cu vectori
Creează o punte între datele vectoriale și cele raster. Învață cum să folosești shapefiles și poligoane pentru a decupa și masca dinamic seturi de date raster mai mari, exact pe zona ta de interes.
4m 08s
5
Resampling și scriere
Schimbă rezoluția datelor tale și salvează rezultatele. Acoperim upsampling, downsampling, actualizarea transformării Affine și scrierea setului de date final înapoi pe disc.
4m 34s
Episoade
1
Numpy pentru hărți
4m 11s
Descoperă cum Rasterio creează o punte între datele geospațiale complexe și Python. Acoperim deschiderea unui set de date, inspectarea metadatelor de bază și citirea benzilor raster direct în array-uri Numpy.
Salut, sunt Alex de la DEV STORIES DOT EU. Rasterio: Numpy pentru date geospațiale, episodul 1 din 5. Vrei să extragi valorile pixelilor dintr-o imagine din satelit, dar librăriile standard de imagini se blochează la formatele geospațiale, iar bindings-urile oficiale te fac să te simți de parcă ai scrie cod C în Python. Această tensiune este exact motivul pentru care există Rasterio.
Rasterio este o librărie care citește și scrie date geospațiale bazate pe grid, cum ar fi fișierele GeoTIFF. Este foarte probabil să fi auzit de GDAL, librăria geospațială standard în industrie. O concepție greșită frecventă este că Rasterio înlocuiește GDAL. Nu este așa. Rasterio folosește de fapt GDAL în spate. Diferența este interfața. Dacă ai folosit vreodată bindings-urile native GDAL pentru Python, știi că expun un C API greoi, plin de management manual al resurselor și o sintaxă care pare complet străină de Python. Rasterio lasă asta în urmă. Oferă o interfață modernă, Python-first. Tratează dataset-urile raster ca pe niște fișiere normale și gestionează pixelii lor ca pe niște array-uri Numpy standard.
Să presupunem că ai un fișier GeoTIFF cu imagini Landsat pe disc. Deschizi acest fișier folosind funcția rasterio dot open. Pentru că Rasterio adoptă pattern-uri standard din Python, faci asta folosind un with statement. Asta creează un context manager. La fel ca la deschiderea unui fișier text simplu, blocul with se asigură că dataset-ul este închis curat și memoria este eliberată în momentul în care codul tău termină de rulat. Nu trebuie niciodată să distrugi manual obiecte sau să-ți faci griji în privința memory leak-urilor de la fișiere neînchise.
În interiorul acelui bloc with, funcția open îți dă un obiect dataset reader. Înainte să citești pixelii propriu-ziși, poți inspecta fișierul. Poți cere dataset-ului proprietatea count, care îți spune numărul total de benzi, sau layere, din imagine. Pentru o imagine Landsat, acest count ar putea fi ceva de genul șapte sau unsprezece, reprezentând diferite lungimi de undă ale luminii. Poți citi proprietățile width și height pentru a obține dimensiunile spațiale în pixeli. De asemenea, poți verifica proprietatea dtypes. Asta îți dă data type-ul pixelilor pentru fiecare bandă, cum ar fi unsigned 16-bit integers sau 32-bit floats. Toate aceste metadate sunt disponibile instant, fără să încarci datele grele ale imaginii în memoria sistemului tău.
Iată ideea cheie. Când ești gata să te uiți la pixelii propriu-ziși, apelezi metoda read pe obiectul dataset. Poți pasa un index specific pentru a încărca un singur layer. Fii atent la partea asta: benzile Rasterio sunt one-indexed, ceea ce înseamnă că ceri banda unu, nu banda zero. Dacă apelezi read și pasezi numărul unu, metoda returnează acei pixeli ca un array Numpy bidimensional standard. Dacă apelezi read fără niciun argument, citește tot, returnând un array Numpy tridimensional care conține toate benzile.
Nu există un obiect pixel special, proprietar. Primești pur și simplu un array de numere. Odată ce ai acel array Numpy, ești din nou pe un teritoriu familiar. Îi poți da slice, poți rula operații statistice sau îl poți da direct unor modele de machine learning, folosind exact același cod pe care îl folosești pentru orice altă matrice. Rasterio acționează ca o punte. Gestionează formatele de fișiere complicate și metadatele de pe disc, și îți oferă un obiect matematic curat în memorie.
Dacă îți place emisiunea și vrei să susții ceea ce facem, poți căuta DevStoriesEU pe Patreon — este de mare ajutor.
Adevărata putere a lui Rasterio nu este că reinventează procesarea geospațială, ci că o face plictisitoare; transformând imaginile satelitare complexe în array-uri Numpy standard, îți permite să nu te mai bați cu formatele GIS și să începi să faci data science pe bune.
Mulțumesc pentru ascultare, happy coding tuturor!
2
Transformarea Affine
3m 58s
Învață cum o grilă de pixeli se transpune în lumea reală. Analizăm în detaliu Coordinate Reference Systems (CRS) și matricea de transformare Affine folosită pentru a traduce indecșii array-ului în coordonate geografice.
Salut, sunt Alex de la DEV STORIES DOT EU. Rasterio: Numpy pentru date geospațiale, episodul 2 din 5. Un array Numpy de bază este doar o grilă plată de numere. Dacă îl vizualizezi, obții pur și simplu un dreptunghi colorat pe monitor. Ce transformă de fapt aceste numere abstracte într-o hartă precisă a Podișului Colorado? Răspunsul este Transformarea Afină.
Oamenii presupun adesea că datele geospațiale sunt doar o imagine în care colțurile sunt fixate vag de coordonatele hărții. Nu este cazul. Transformarea este o legătură matematică strictă care calculează poziția precisă în lumea reală a fiecărui pixel din array-ul tău.
Înainte de a putea mapa pixelii pe Pământ, trebuie să știi cum măsori Pământul. Acesta este Sistemul de Referință de Coordonate. Îl citești din dataset accesând dataset dot crs. Această proprietate îi spune lui Rasterio dacă coordonatele tale spațiale sunt măsurate în grade de longitudine și latitudine, sau în metri față de un anumit ecuator și meridian zero.
Odată ce sistemul de referință este setat, ai nevoie de logica de mapare. Găsești asta verificând dataset dot transform. Asta returnează o matrice de transformare afină. Sună a algebră liniară grea, dar este practic un set de șase numere care descriu amprenta fizică a grilei tale. Matricea definește coordonatele spațiale exacte x și y ale colțului din stânga sus al pixelului din stânga sus. Definește lățimea fizică a unui pixel, de exemplu, exact treizeci de metri. Definește înălțimea fizică a unui pixel, care este de obicei negativă deoarece rândurile imaginii se numără în jos, în timp ce coordonatele hărții se numără în sus. Matricea conține, de asemenea, valori de rotație în cazul în care satelitul a fost înclinat când a fost capturată imaginea.
Iată ideea cheie. Nu trebuie niciodată să înmulțești manual aceste valori ale matricei. Rasterio îți oferă metode directe pentru a sări înainte și înapoi între spațiul pixelilor și spațiul coordonatelor.
Să presupunem că analizezi o imagine și găsești o anomalie într-o locație specifică, să zicem rândul cinci sute și coloana o mie. Pentru a afla unde se află asta pe planeta reală, pasezi aceste două numere întregi în metoda dataset dot xy. Rasterio trece rândul și coloana prin matricea afină și returnează coordonatele spațiale exacte x și y pentru punctul central al acelui pixel specific.
De asemenea, poți rula această mașinărie în sens invers. Să zicem că ai coordonatele spațiale exacte pentru o locație fizică. Poate e un canion situat exact la o sută de kilometri est și cincizeci de kilometri sud de originea imaginii tale. Trebuie să extragi datele pixelilor subiacenți pentru acel canion. Iei valorile spațiale x și y și le pasezi în metoda dataset dot index. Rasterio inversează matricea afină, îți procesează coordonatele și returnează numerele întregi exacte pentru rând și coloană. Apoi folosești aceste numere întregi pentru a da slice în array-ul tău Numpy și a citi măsurătoarea exactă înregistrată de satelit.
Transformarea afină izolează array-ul tău de date brute de geometria spațială, garantând că, indiferent cum dai crop sau citești datele, nu îți pierzi niciodată poziția precisă pe glob.
Asta e tot pentru astăzi. Mulțumesc pentru ascultare — du-te și construiește ceva tare.
3
Procesarea Windowed
3m 38s
Procesează terabytes de date raster fără să-ți blochezi computerul. Explorăm citirea și scrierea Windowed pentru a gestiona seturi de date masive în bucăți mici, sigure pentru memorie.
Salut, sunt Alex de la DEV STORIES DOT EU. Rasterio: Numpy pentru date geospațiale, episodul 3 din 5. Dacă încerci să citești un GeoTIFF de zece gigabytes direct în memoria laptopului tău, scriptul tău va da crash aproape sigur. S-ar putea să ai nevoie doar de un mic patch de pixeli pentru a testa un algoritm, dar sistemul încearcă să înghită tot continentul dintr-o dată. Soluția la această limită de memorie este Windowed Processing.
Windowed processing îți permite să citești sau să scrii subseturi dreptunghiulare specifice dintr-un fișier raster, în timp ce restul fișierului rămâne în siguranță pe hard drive. Asta se bazează în întregime pe index. Nu avem de-a face cu coordonate geografice astăzi. Avem de-a face strict cu rânduri de pixeli și coloane de pixeli.
Pentru a citi un subset, ai nevoie de o modalitate să-i spui lui Rasterio ce pixeli să ia. Faci asta importând obiectul Window din modulul rasterio windows. Modul standard de a defini un Window este oferind patru numere: column offset, row offset, width și height.
Fii atent la partea asta. Ordinea argumentelor contează. Cere mai întâi column offset-ul, apoi row offset-ul. Column offset-ul este poziția ta orizontală de start, măsurată de la marginea din stânga. Row offset-ul este poziția ta verticală de start, măsurată în jos de la marginea de sus. După offset-uri, specifici câți pixeli pe lățime și câți pixeli pe înălțime ar trebui să aibă selecția ta.
Ia în considerare un fișier de test masiv, de mărimea unui gigabyte. Vrei să extragi un tile mic, cu o lățime de 256 de pixeli și o înălțime de 512 pixeli. Vrei ca acest tile să înceapă la o mie de pixeli de la stânga și două mii de pixeli în jos de la marginea de sus. Instanțiezi Window-ul pasând o mie pentru column offset, două mii pentru row offset, 256 pentru width și 512 pentru height.
Apoi, îți deschizi dataset-ul folosind funcția standard open. Când apelezi metoda read, nu lași argumentele goale. Argumentele goale îi spun lui Rasterio să încarce tot fișierul în memorie. În schimb, atribui noul tău obiect Window la keyword argument-ul window din interiorul metodei read. Rasterio traduce acel window în byte offsets pe disk, extrage doar acel chunk specific de 256 pe 512 și îl returnează ca un numpy array. Utilizarea memoriei tale abia se mișcă.
Dacă lucrezi cu numpy toată ziua, pasarea de offsets și dimensiuni s-ar putea să ți se pară puțin nefirească. Probabil ești obișnuit să definești slices cu indecși de start și stop pentru rândurile și coloanele tale. Rasterio suportă acest workflow cu o metodă alternativă numită Window dot from slices.
Metoda asta primește două input-uri. Primul input este un tuple care definește row start index și row stop index. Al doilea input este un tuple care definește column start index și column stop index. Observă că ordinea aici este mai întâi rândurile, apoi coloanele. Asta reflectă exact modul în care dai slice unui numpy array bidimensional. În spate, metoda asta calculează offset-urile și dimensiunile pentru tine și returnează un obiect Window standard pe care îl poți pasa metodei read la fel ca înainte.
Prin impunerea de windowed reads în data pipelines ale tale, decuplezi permanent dimensiunea fizică a fișierelor de input de limitele hardware ale mașinii tale.
Asta e tot pentru acest episod. Mulțumesc că ai ascultat și continuă să construiești!
4
Mascarea cu vectori
4m 08s
Creează o punte între datele vectoriale și cele raster. Învață cum să folosești shapefiles și poligoane pentru a decupa și masca dinamic seturi de date raster mai mari, exact pe zona ta de interes.
Salut, sunt Alex de la DEV STORIES DOT EU. Rasterio: Numpy pentru date geospațiale, episodul 4 din 5. Tocmai ai descărcat o imagine satelitară masivă care acoperă un întreg stat, dar te interesează doar pixelii din interiorul conturului specific al unei ferme. Încărcarea întregii grile consumă memorie, iar citirea după pixel offsets este inutilă atunci când conturul tău are o formă de poligon neregulat. Soluția este Masking cu vectori.
Într-un episod anterior, ne-am uitat la windowed reading. Această abordare necesita indici exacți de pixeli, cum ar fi să ceri rândul cincizeci și coloana o sută. Masking-ul este complet diferit. Masking-ul se bazează pe coordonate geografice din lumea reală. În loc să numeri pixelii, oferi o geometrie vectorială, cum ar fi un poligon definit de longitudini și latitudini reale. Rasterio determină ce pixeli cad în interiorul acelei forme și gestionează conversia complexă dintre spațiul continuu de coordonate vectoriale și grila raster discretă.
Instrumentul principal pentru acest workflow este funcția mask, situată în modulul rasterio dot mask. Îi pasezi două argumente principale. În primul rând, un dataset raster deschis. În al doilea rând, un iterable de forme geometrice. Aceste forme trebuie formatate ca dicționare care respectă specificația GeoJSON. De obicei, citești un shapefile care conține poligonul fermei tale, extragi dicționarul de geometrie pentru acel feature specific, îl pui într-o listă Python standard și îl pasezi funcției mask.
Iată ideea cheie. Funcția mask are două comportamente distincte controlate de un singur parametru boolean numit crop. Trebuie să înțelegi diferența dintre a face pur și simplu masking pe un dataset și a-i face efectiv cropping. Dacă rulezi funcția cu crop setat pe false, Rasterio analizează poligonul fermei tale și setează fiecare pixel din afara acelui contur la o valoare nodata. Citește valoarea nodata implicită direct din metadatele rasterului original. Array-ul de output pe care îl primești are exact aceleași dimensiuni ca imaginea ta masivă originală la nivel de stat. Pixelii din interiorul fermei își păstrează valorile reale, dar tot ce este în exterior este blanked out. Extent-ul spațial general al fișierului nu se modifică.
Dacă setezi crop pe true, comportamentul se schimbă. Rasterio setează în continuare pixelii din afara poligonului tău la nodata. Totuși, apoi elimină zonele vaste de spațiu gol. Calculează bounding box-ul dreptunghiular al poligonului neregulat al fermei și micșorează array-ul returnat pentru a se potrivi exact în acel box specific. Array-ul tău gigantic la nivel de stat este redus fizic la o grilă minusculă, ușor de gestionat, care conține doar ferma și o cantitate mică de padding nodata în jurul marginilor sale neregulate.
Deoarece cropping-ul modifică fizic dimensiunile grilei, schimbă și punctul de plecare geografic. Colțul din stânga sus nu mai este colțul din stânga sus al statului. Acum este colțul din stânga sus al bounding box-ului fermei. Prin urmare, funcția mask returnează un tuple care conține două elemente. Primul element este noul tău array numpy cropped. Al doilea element este un obiect affine transform complet nou.
Acest transform actualizat conține noile coordonate de origine. Dacă vrei să salvezi acest array nou cropped într-un fișier nou, trebuie să pasezi acest transform actualizat în write profile-ul tău. Dacă refolosești din greșeală transform-ul original la nivel de stat, imaginea fermei tale mici va fi întinsă înapoi pe întregul stat. Adevărata valoare a funcției mask este că gestionează automat toate aceste recalcule spațiale pentru tine.
Sper că a fost util. Mulțumesc pentru că ai ascultat și îți doresc o zi frumoasă în continuare.
5
Resampling și scriere
4m 34s
Schimbă rezoluția datelor tale și salvează rezultatele. Acoperim upsampling, downsampling, actualizarea transformării Affine și scrierea setului de date final înapoi pe disc.
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ă!
Tap to start playing
Browsers block autoplay
Share this episode
Episode
—
Copy this episode in another language:
Acest site nu folosește cookie-uri. Furnizorul nostru de hosting ar putea înregistra adresa ta IP în scopuri de analiză. Află mai multe.