Czy dodać pasmo do istniejącego GeoTiff przy użyciu GDAL?

15

Wydaje się, że powinno to być proste, ale nie mogę tego zrozumieć w życiu.

Biorąc pod uwagę istniejący GeoTiff zawierający jeden zespół, jak możesz dodać kolejny zespół do tego GeoTiff? Czy jest to jedyny sposób, aby to zrobić przy użyciu GDALCreate (), aby utworzyć nowy plik wyjściowy z dodatkowym pasmem, a następnie skopiować istniejące pasmo z oryginalnego pliku do nowego pliku? To jedyne rozwiązanie, jakie do tej pory wymyśliłem, ale wydaje się, że powinien istnieć prosty sposób na dodanie pasma do istniejącego zestawu danych.

Wół
źródło
Cześć @ TheOx, mam ten sam problem. Chcę zrobić kompozytowy kolor obrazu z pasma 2,3,4 pojedynczych pasm LDCM. Czy masz już rozwiązanie swojego pytania?
Jackie
1
@Jackie zobacz komentarz Kyle'a w zaakceptowanej odpowiedzi na temat używania sterownika vrt do utworzenia kopii, dodania zespołu, a następnie utwórz kopię tego z powrotem do geotiffu za pomocą sterownika GeoTiff.
TheOx

Odpowiedzi:

8

Rozwiązaniem, jeśli sterownik je obsługuje, jest wywołanie GDALOpen () z dostępem GA_Update, a następnie użycie GDALAddBand lub GDALDataset :: AddBand . Jednak sterownik geotiff nie obsługuje AddBand.

użytkownik2856
źródło
2
Bardzo niewielu kierowców obsługuje dodawanie pasma, nie sądzę, że robi to kierowca geotiff. Jedyny, jaki znam , to obsługuje vrt.
Cóż, @kyle ma rację - sterownik geotiff nie obsługuje AddBand, ale metoda w tej odpowiedzi jest poprawna, jeśli sterownik go obsługuje i był tym, czego szukałem, więc go akceptuję.
TheOx
Doh! Zapomniałem o tym drobnym szczególe. @ TheOx Nie sądzę, że powinieneś zaakceptować moją odpowiedź, ponieważ jest ona nieprawidłowa. pytanie pierwotne, które konkretnie dotyczyło geotiffów.
user2856
@Luke: Edytuj swoją odpowiedź, aby określić, że jest to ogólne rozwiązanie, jeśli sterownik ją obsługuje, a ja ją zaakceptuję. Wydaje się, że nie ma innego sposobu na zrobienie tego dla GeoTiff poza metodą z mojego pierwotnego pytania.
TheOx
1
Użyj sterownika vrt, CreateCopy (), AddBand (), CreateCopy () ze sterownikiem Geotiff.
8

Aby rozwinąć odpowiedź Luke'a i podać konkretny przykład w Pythonie, oto fragment, który dodaje pasmo alfa do źródłowego rastra i zapisuje go jako PNG.

from osgeo import gdal

src_ds = gdal.OpenShared(input_path)
mask_ds = gdal.OpenShared(mask_path)
mask = mask_ds.GetRasterBand(1).ReadAsArray()

tmp_ds = gdal.GetDriverByName('MEM').CreateCopy('', src_ds, 0)
tmp_ds.AddBand()
tmp_ds.GetRasterBand(4).WriteArray(mask)

dst_ds = gdal.GetDriverByName('PNG').CreateCopy(output_path, tmp_ds, 0)
del dst_ds

Użyłem MEMsterownika, VRTponieważ ten ostatni nie obsługuje WriteRaster()i WriteArray()(błąd „Zapis przez VRTSourcedRasterBand nie jest obsługiwany.”). Podejrzewam, że użycie sterownika vrt może być nadal możliwe za pomocą innych metod.

Martin Valgur
źródło