使用GDAL向现有的GeoTiff添加频段吗?


15

这似乎应该很简单,但是我无法一生解决。

给定一个包含单个波段的现有GeoTiff,如何将另一个波段添加到该GeoTiff?这样做的唯一方法是使用GDALCreate()创建具有附加波段的新输出文件,然后将现有波段从原始文件复制到新文件吗?这是我到目前为止提出的唯一解决方案,但似乎应该有一种简单的方法可以将波段添加到现有数据集中。


嗨,@ TheOx,我有同样的问题。我想从LDCM单波段的波段2、3、4制作合成图像颜色。您是否有解决问题的方法?
成龙2014年

1
@Jackie在关于使用vrt驱动程序创建副本,添加乐队然后使用GeoTiff驱动程序将其创建回geotiff的副本的公认答案中看到kyle的评论。
TheOx 2014年

Answers:


8

如果驱动程序支持,则解决方案是调用 具有GA_Update访问权限的GDALOpen(),然后使用GDALAddBandGDALDataset :: AddBand。但是,geotiff驱动程序不支持AddBand。


2
很少有驱动程序支持添加范围,我不相信geotiff驱动程序可以。我知道唯一支持它的是vrt。

@kyle是正确的-geotiff驱动程序不支持AddBand,但是如果该驱动程序支持它并且正是我在寻找的,则此答案中的方法是正确的,因此我接受它。
TheOx 2013年

h!忘了那个小细节。@TheOx我认为您不应该接受我的回答,因为它不正确。与原住民特别相关的原始问题。
user2856

@Luke:编辑您的答案以指定这是常规解决方案,如果驱动程序支持的话,我会接受的。除了我最初提出的方法外,对于GeoTiff似乎没有其他方法可以做到。
TheOx 2013年

1
将vrt驱动程序,CreateCopy(),AddBand(),CreateCopy()与Geotiff驱动程序一起使用。

8

为了扩展Luke的答案并提供Python的具体示例,下面的代码片段向源栅格添加了Alpha波段并将其另存为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驱动程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.