Добавление полосы в существующий GeoTiff с использованием GDAL?

15

Кажется, что это должно быть просто, но я не могу понять, насколько я понимаю.

Учитывая существующий GeoTiff, содержащий одну полосу, как вы можете добавить другую полосу к этой GeoTiff? Является ли единственный способ сделать это, используя GDALCreate () для создания нового выходного файла с дополнительной полосой, а затем скопировать существующую полосу из исходного файла в новый файл? Это единственное решение, которое я придумала до сих пор, но кажется, что должен быть простой способ добавить группу в существующий набор данных.

TheOx
источник
Привет @ TheOx, у меня та же проблема. Я хочу сделать составное изображение цветным из группы 2,3,4 из отдельных полос LDCM. У вас есть решение для вашего вопроса еще?
Джеки
1
@Jackie см. Комментарий Кайла в принятом ответе об использовании драйвера vrt для создания копии, добавления полосы, а затем создания копии этого обратно в геотифф с драйвером GeoTiff.
TheOx

Ответы:

8

Решение, если драйвер поддерживает его, состоит в том, чтобы вызвать GDALOpen () с доступом GA_Update, а затем использовать GDALAddBand или GDALDataset :: AddBand . Однако драйвер geotiff не поддерживает AddBand.

user2856
источник
2
Очень немногие драйверы поддерживают добавочную группу, я не верю, что драйвер geotiff делает. Единственный, кого я знаю, который поддерживает это vrt.
Что ж, @kyle прав - драйвер geotiff не поддерживает AddBand, но метод в этом ответе верен, если драйвер поддерживает его и был тем, что я искал, поэтому я принимаю его.
TheOx
Doh! Забыл об этой маленькой детали. @TheOx Я не думаю, что вы должны принять мой ответ, так как он неверный. вопрос о происхождении, который конкретно связан с геотифами.
user2856
@ Люк: Отредактируйте свой ответ, чтобы указать, что это общее решение, если драйвер его поддерживает, и я его приму. Кажется, нет другого способа сделать это для 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 все еще возможно с помощью других методов.

Мартин Валгур
источник