กำลังเพิ่มแบนด์ลงใน GeoTiff ที่มีอยู่โดยใช้ GDAL หรือไม่


15

ดูเหมือนว่ามันจะตรงไปตรงมา แต่ฉันไม่สามารถใช้ชีวิตของฉันได้

ด้วย GeoTiff ที่มีอยู่แล้วที่มีวงดนตรีเดียวคุณจะเพิ่มวงอื่นใน GeoTiff นั้นได้อย่างไร เป็นวิธีเดียวที่จะทำเช่นนี้เพื่อใช้ GDALCreate () เพื่อสร้างไฟล์ใหม่ที่มีวงดนตรีเพิ่มเติมและจากนั้นคัดลอกวงดนตรีที่มีอยู่จากไฟล์ต้นฉบับไปยังไฟล์ใหม่หรือไม่? นั่นเป็นทางออกเดียวที่ฉันเกิดขึ้นจนถึงตอนนี้ แต่ดูเหมือนว่าควรมีวิธีง่ายๆในการเพิ่มแบนด์ไปยังชุดข้อมูลที่มีอยู่


สวัสดี @TheOx ฉันมีปัญหาเดียวกัน ฉันต้องการสร้างภาพสีผสมจากแถบ 2,3,4 ของวงเดียว LDCM คุณมีทางออกสำหรับคำถามของคุณหรือยัง
แจ็กกี้

1
@Jackie ดูความคิดเห็นของไคล์ในคำตอบที่ยอมรับเกี่ยวกับการใช้ไดรเวอร์ vrt เพื่อสร้างสำเนาเพิ่มวงดนตรีจากนั้นสร้างสำเนาของสิ่งนั้นกลับไปที่ geotiff ด้วยไดรเวอร์ GeoTiff
TheOx

คำตอบ:


8

วิธีการแก้ปัญหาถ้า suuports ขับมันคือการเรียก GDALOpen ()ที่มีการเข้าถึง GA_Update แล้วใช้GDALAddBandหรือGDALDataset :: AddBand อย่างไรก็ตามไดรเวอร์ geotiff ไม่รองรับ AddBand


2
มีไดรเวอร์น้อยมากที่รองรับการเพิ่มย่านความถี่ผมไม่เชื่อว่าไดรเวอร์ของ geotiff ทำอะไร คนเดียวที่ฉันรู้ว่าสนับสนุนเป็น vrt

ดี @ kyle ถูกต้อง - ไดรเวอร์ geotiff ไม่รองรับ AddBand แต่วิธีการในคำตอบนี้ถูกต้องหากไดรเวอร์รองรับและเป็นสิ่งที่ฉันกำลังมองหาดังนั้นฉันจึงยอมรับ
TheOx

Doh! ลืมรายละเอียดเล็ก ๆ น้อยนั้น @TheOx ฉันไม่คิดว่าคุณควรยอมรับคำตอบของฉันเพราะมันไม่ถูกต้องอีกครั้ง คำถามเกี่ยวกับต้นกำเนิดซึ่งเกี่ยวข้องกับ geotiff โดยเฉพาะ
2856

@Luke: แก้ไขคำตอบของคุณเพื่อระบุว่าเป็นทางออกทั่วไปหากไดรเวอร์รองรับและฉันจะยอมรับ ดูเหมือนจะไม่มีวิธีอื่นในการทำเช่นนี้กับ GeoTiff สั้น ๆ ของวิธีการในคำถามเดิมของฉัน
TheOx

1
ใช้ไดรเวอร์ vrt, CreateCopy (), AddBand (), CreateCopy () พร้อมไดรเวอร์ Geotiff

8

เพื่อขยายคำตอบของลุคและให้ตัวอย่างที่เป็นรูปธรรมใน Python ต่อไปนี้เป็นตัวอย่างข้อมูลที่เพิ่มแถบอัลฟาลงในแหล่งภาพแรสเตอร์และบันทึกเป็น 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

ฉันใช้MEMไดรเวอร์แทนVRTเนื่องจากตัวหลังไม่รองรับWriteRaster()และWriteArray()(ข้อผิดพลาด "การเขียนผ่าน VRTSourcedRasterBand ไม่รองรับ") ฉันคิดว่าการใช้ไดรเวอร์ vrt อาจทำได้ด้วยวิธีอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.