Cześć, tu Alex z DEV STORIES DOT EU. Rasterio:
Numpy dla danych geoprzestrzennych, odcinek 1 z 5. Chcesz wyciągnąć wartości pikseli ze zdjęcia satelitarnego, ale standardowe biblioteki do obrazów nie radzą sobie z formatami geoprzestrzennymi, a oficjalne bindingi przypominają pisanie kodu w C wewnątrz Pythona. Właśnie przez ten zgrzyt powstało Rasterio.
Rasterio to biblioteka, która czyta i zapisuje dane geoprzestrzenne w formie siatki, takie jak pliki GeoTIFF. Bardzo możliwe, że słyszałeś o GDAL, bibliotece geoprzestrzennej będącej standardem w branży. Powszechnym mitem jest to, że Rasterio zastępuje GDAL. Wcale tak nie jest. Rasterio tak naprawdę używa GDAL pod spodem. Różnica tkwi w interfejsie. Jeśli kiedykolwiek korzystałeś z natywnych bindingów GDAL w Pythonie, wiesz, że wystawiają one toporne C API, pełne ręcznego zarządzania zasobami i składni, która wydaje się zupełnie obca w Pythonie. Rasterio zostawia to w tyle. Zapewnia nowoczesny interfejs w podejściu Python-first. Traktuje datasety rastrowe jak normalne pliki, a ich piksele obsługuje jak standardowe Numpy arrays.
Załóżmy, że masz na dysku plik GeoTIFF ze zdjęciami Landsat. Otwierasz ten plik za pomocą funkcji rasterio kropka open. Ponieważ Rasterio trzyma się standardowych wzorców Pythona, robisz to używając with statement. To tworzy context manager. Podobnie jak przy otwieraniu zwykłego pliku tekstowego, blok with gwarantuje, że dataset zostanie czysto zamknięty, a pamięć zwolniona w momencie zakończenia działania twojego kodu. Nigdy nie musisz ręcznie niszczyć obiektów ani martwić się o memory leaks z niezamkniętych plików.
Wewnątrz tego bloku with, funkcja open daje ci obiekt dataset reader. Przed odczytaniem jakichkolwiek właściwych pikseli, możesz zbadać plik. Możesz zapytać dataset o jego właściwość count, która mówi ci o całkowitej liczbie pasm, czyli warstw, na zdjęciu. Dla zdjęcia Landsat, ten count może wynosić coś koło siedmiu lub jedenastu, reprezentując różne długości fal światła. Możesz odczytać właściwości width i height, aby uzyskać wymiary przestrzenne w pikselach. Możesz również sprawdzić właściwość dtypes. To daje ci data type pikseli dla każdego pasma, na przykład unsigned 16-bit integers lub 32-bit floats. Wszystkie te metadane są dostępne natychmiast, bez ładowania ciężkich danych obrazu do pamięci systemowej.
Oto kluczowa kwestia. Kiedy jesteś gotowy, by spojrzeć na właściwe piksele, wywołujesz metodę read na obiekcie dataset. Możesz przekazać konkretny indeks, aby załadować tylko jedną warstwę. Zwróć uwagę na ten szczegół: pasma w Rasterio są one-indexed, co oznacza, że prosisz o pasmo pierwsze, a nie zerowe. Jeśli wywołasz read i przekażesz jedynkę, metoda zwróci te piksele jako standardowy, dwuwymiarowy Numpy array. Jeśli wywołasz read bez żadnych argumentów, odczyta wszystko, zwracając trójwymiarowy Numpy array zawierający wszystkie pasma.
Nie ma żadnego specjalnego, własnościowego pixel object. Dostajesz po prostu array liczb. Kiedy już masz ten Numpy array, wracasz na znane terytorium. Możesz go slice'ować, odpalać operacje statystyczne, albo przekazać bezpośrednio do modeli machine learning, używając dokładnie tego samego kodu, co dla każdej innej macierzy. Rasterio działa jak most. Obsługuje skomplikowane formaty plików i metadane na dysku, i przekazuje ci czysty obiekt matematyczny w pamięci.
Jeśli podoba ci się podcast i chcesz wesprzeć to, co robimy, możesz wyszukać DevStoriesEU na Patreon — to ogromna pomoc.
Prawdziwa siła Rasterio nie polega na tym, że wymyśla na nowo przetwarzanie geoprzestrzenne, ale na tym, że czyni je nudnym; zamieniając skomplikowane zdjęcia satelitarne w standardowe Numpy arrays, pozwala ci przestać walczyć z formatami GIS i zacząć robić prawdziwe data science.
Dzięki za wysłuchanie, miłego kodowania wszystkim!