GDAL kullanarak mevcut GeoTiff'e bant eklensin mi?


15

Bu anlaşılması kolay bir şey gibi görünüyor ama benim hayatım boyunca anlayamam.

Tek bir bant içeren mevcut bir GeoTiff göz önüne alındığında, bu GeoTiff'e nasıl başka bir bant ekleyebilirsiniz? Ek bant ile yeni bir çıktı dosyası oluşturmak ve daha sonra varolan bandı orijinal dosyadan yeni dosyaya kopyalamak için GDALCreate () kullanmak için bunu yapmanın tek yolu var mı? Şimdiye kadar bulduğum tek çözüm bu, ancak mevcut veri kümesine bir bant eklemenin basit bir yolu olması gerektiği gibi görünüyor.


Merhaba @TheOx, ben de aynı sorun var. LDCM tek bantlarının 2,3,4 bandından bileşik görüntü rengi yapmak istiyorum. Sorunuz için henüz bir çözümünüz var mı?
Jackie

1
@Jackie, bir kopya oluşturmak, bir bant eklemek için vrt sürücüsünü kullanma hakkında kabul edilen cevapta kyle'nin yorumuna bakın, ardından GeoTiff sürücüsü ile bir geotiff'e geri kopyasını oluşturun.
TheOx

Yanıtlar:


8

Çözüm, sürücünün paketini alırsa , GA_Update erişimi olan GDALOpen () öğesini çağırmak ve ardından GDALAddBand veya GDALDataset :: AddBand komutunu kullanmaktır . Ancak, geotiff sürücüsü AddBand'i desteklemez.


2
Çok az sürücü bant ekleme desteği, geotiff sürücüsünün inanmıyor. Bunu desteklediğini bildiğim tek kişi vrt.

@Kyle doğru - geotiff sürücüsü AddBand'ı desteklemiyor, ancak sürücü destekliyorsa ve aradığım şey buysa, bu cevaptaki yöntem doğrudur, bu yüzden kabul ediyorum.
TheOx

Doh! O küçük detayı unuttum. @TheOx Cevabımı doğru olmadığı için kabul etmeniz gerektiğini düşünmüyorum. özellikle geotiffs ile ilgili orig sorusu.
user2856

@ Luke: Sürücü destekliyorsa genel çözümün bu olduğunu belirtmek için yanıtınızı düzenleyin ve kabul edeceğim. Benim orijinal sorum yöntem GeoTiff kısa bunu yapmanın başka bir yolu yok gibi görünüyor.
TheOx

1
Geotiff Driver ile vrt sürücüsünü, CreateCopy (), AddBand (), CreateCopy () kullanın.

8

Luke'un cevabını genişletmek ve Python'da somut bir örnek sunmak için, bir kaynak rasterine bir alfa bandı ekleyen ve bunu bir PNG olarak kaydeden bir snippet.

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

Ben ikincisi desteklemediği için MEMsürücüyü kullandım ve ("VRTSourcedRasterBand ile yazma desteklenmiyor" hatası). Sanırım vrt sürücüsünü kullanmak başka yöntemlerle hala mümkün olabilir.VRTWriteRaster()WriteArray()

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.