Band zu bestehendem GeoTiff mit GDAL hinzufügen?

15

Dies scheint so, als ob es einfach sein sollte, aber ich kann es für mein ganzes Leben nicht herausfinden.

Wie können Sie bei einem vorhandenen GeoTiff mit einer einzelnen Band eine weitere Band zu diesem GeoTiff hinzufügen? Ist dies die einzige Möglichkeit, mit GDALCreate () eine neue Ausgabedatei mit einem zusätzlichen Band zu erstellen und dann das vorhandene Band aus der Originaldatei in die neue Datei zu kopieren? Das ist die einzige Lösung, die ich bisher gefunden habe, aber es scheint nur eine einfache Möglichkeit zu geben, dem vorhandenen Datensatz ein Band hinzuzufügen.

Der Ochse
quelle
Hallo @TheOx, ich habe das gleiche Problem. Ich möchte eine zusammengesetzte Bildfarbe aus Band 2,3,4 von LDCM-Einzelbändern erstellen. Haben Sie schon eine Lösung für Ihre Frage?
Jackie
1
@Jackie siehe kyles Kommentar in der akzeptierten Antwort über die Verwendung des vrt-Treibers zum Erstellen einer Kopie, das Hinzufügen eines Bands und das Zurückschreiben einer Kopie an einen Geotiff mit dem GeoTiff-Treiber.
TheOx

Antworten:

8

Wenn der Treiber dies unterstützt, können Sie GDALOpen () mit GA_Update-Zugriff aufrufen und dann GDALAddBand oder GDALDataset :: AddBand verwenden . Der Geotiff-Treiber unterstützt AddBand jedoch nicht.

user2856
quelle
2
Sehr wenige Treiber unterstützen Add-Band, ich glaube nicht, dass der Geotiff-Treiber dies tut. Das einzige, von dem ich weiß, dass es es unterstützt, ist das vrt.
Nun, @kyle ist richtig - der Geotiff-Treiber unterstützt AddBand nicht, aber die Methode in dieser Antwort ist korrekt, wenn der Treiber es unterstützt und genau das ist, wonach ich gesucht habe, und ich akzeptiere es.
TheOx
Doh! Ich habe dieses kleine Detail vergessen. @TheOx Ich glaube nicht, dass du meine Antwort akzeptieren solltest, da sie nicht korrekt ist. Die ursprüngliche Frage, die sich speziell auf Geotiffs bezog.
user2856
@Luke: Bearbeiten Sie Ihre Antwort, um anzugeben, dass dies die allgemeine Lösung ist, wenn der Treiber sie unterstützt und ich sie akzeptieren werde. Es scheint keinen anderen Weg zu geben, dies für GeoTiff zu tun, als die Methode in meiner ursprünglichen Frage.
TheOx
1
Verwenden Sie den vrt-Treiber CreateCopy (), AddBand (), CreateCopy () mit Geotiff-Treiber.
8

Um Lukes Antwort zu erweitern und ein konkretes Beispiel in Python bereitzustellen, hier ein Ausschnitt, der einem Quell-Raster ein Alpha-Band hinzufügt und es als PNG speichert.

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

Ich habe MEMstattdessen den Treiber verwendet, VRTda dieser nicht unterstützt WriteRaster()und WriteArray()(Fehler "Schreiben über VRTSourcedRasterBand wird nicht unterstützt."). Die Verwendung des vrt-Treibers ist vermutlich noch mit anderen Methoden möglich.

Martin Valgur
quelle