如何使用GDAL(gdalwarp/gdal_translate)设置GeoTIFF文件的“带描述”选项/标签

7

请问有谁知道如何使用GDAL更改或设置GeoTIFF文件的“描述”选项/标签?

为了说明我的意思,这是带有设置“描述”的GeoTIFF文件的gdalinfo返回示例:

 Band 1 Block=64x64 Type=UInt16, ColorInterp=Undefined
 Description = AVHRR Channel 1:  0.58  micrometers -- 0.68 micrometers
 Min=0.000 Max=814.000 
 Minimum=0.000, Maximum=814.000, Mean=113.177, StdDev=152.897
 Metadata:
    LAYER_TYPE=athematic
    STATISTICS_MAXIMUM=814
    STATISTICS_MEAN=113.17657236931
    STATISTICS_MINIMUM=0
    STATISTICS_STDDEV=152.89720574652

在这个例子中,您可以看到:描述 = AVHRR频道1:0.58微米-0.68微米。
我如何使用GDAL设置此参数?
4个回答

9
在Python中,您可以像这样设置带宽描述:
from osgeo import gdal, osr
import numpy

# Define output image name, size and projection info:
OutputImage = 'test.tif'
SizeX = 20
SizeY = 20
CellSize = 1
X_Min = 563220.0
Y_Max = 699110.0
N_Bands = 10
srs = osr.SpatialReference()
srs.ImportFromEPSG(2157)
srs = srs.ExportToWkt()
GeoTransform = (X_Min, CellSize, 0, Y_Max, 0, -CellSize)

# Create the output image:
Driver = gdal.GetDriverByName('GTiff')
Raster = Driver.Create(OutputImage, SizeX, SizeY, N_Bands, 2) # Datatype = 2 same as gdal.GDT_UInt16
Raster.SetProjection(srs)
Raster.SetGeoTransform(GeoTransform)

# Iterate over each band
for band in range(N_Bands):
    BandNumber = band + 1
    BandName = 'SomeBandName '+ str(BandNumber).zfill(3)
    RasterBand = Raster.GetRasterBand(BandNumber)
    RasterBand.SetNoDataValue(0)
    RasterBand.SetDescription(BandName) # This sets the band name!
    RasterBand.WriteArray(numpy.ones((SizeX, SizeY)))

# close the output image
Raster = None
print("Done.")

很遗憾,我不确定ArcGIS或QGIS是否能够读取波段描述。但是,在Tuiview中,波段名称是清晰可见的:enter image description here


带特定元数据是GeoTiff扩展还是Tiff的常规部分? - CMCDragonkai
它包含在GeoTiff元数据中。如果您使用命令“gdalinfo -norat *.tif”,它将返回图像中每个波段的描述。我已在Landsat 8图像上进行了测试,它会返回我设置的波段名称(例如“Red”,“Green”,“Blue”,“NIR”),而不仅仅是Band1,Band2,Band3,Band4等。 - user6747353
1
谢谢@Osian,这是完美的解决方案。 - Generic Wevers

2
GDAL包含一个名为gdal_edit.py的Python应用程序,可用于就地修改文件的元数据。我不熟悉您所指的描述字段,但这个工具应该是要使用的工具。
这是手册页面: gdal_edit.py 以下是使用我从USGS Earth-Explorer下载的正射影像的示例脚本。
#!/bin/sh

#  Image to modify
IMAGE_PATH='11skd505395.tif'

#  Field to modify
IMAGE_FIELD='TIFFTAG_IMAGEDESCRIPTION'

# Print the tiff image description tag
gdalinfo $IMAGE_PATH | grep $IMAGE_FIELD

#  Change the Field
CMD="gdal_edit.py -mo ${IMAGE_FIELD}='Lake-Tahoe' $IMAGE_PATH"
echo $CMD
$CMD

#  Print the new field value
gdalinfo $IMAGE_PATH | grep $IMAGE_FIELD

输出

$ ./gdal-script.py 
TIFFTAG_IMAGEDESCRIPTION=OrthoVista
gdal_edit.py -mo TIFFTAG_IMAGEDESCRIPTION='Lake-Tahoe' 11skd505395.tif
TIFFTAG_IMAGEDESCRIPTION='Lake-Tahoe'

这里有另一个链接,应该会提供有用的信息。

https://gis.stackexchange.com/questions/111610/how-to-overwrite-metadata-in-a-tif-file-with-gdal


3
没问题,我知道如何编辑文件的通用元数据,但问题是如何编辑特定于乐队的元数据? - Generic Wevers
1
TIFFTAG_IMAGEDESCRIPTION 可以用于单个波段吗? - CMCDragonkai

0
这是一个单一目的的 Python 命令行脚本,可在原地编辑乐队描述。
''' Set image band description to specified text'''
import os
import sys
from osgeo import gdal

gdal.UseExceptions()

if len(sys.argv) < 4:
    print(f"Usage: {sys.argv[0]} [in_file] [band#] [text]")
    sys.exit(1)

infile = sys.argv[1]        # source filename and path
inband = int(sys.argv[2])   # source band number
descrip = sys.argv[3]        # description text

data_in = gdal.Open(infile, gdal.GA_Update)
band_in = data_in.GetRasterBand(inband)
old_descrip = band_in.GetDescription()
band_in.SetDescription(descrip)
new_descrip = band_in.GetDescription()

# de-reference the datasets, which triggers gdal to save
data_in = None
data_out = None

print(f"Description was: {old_descrip}")
print(f"Description now: {new_descrip}")

正在使用中:

$ python scripts\gdal-edit-band-desc.py test-edit.tif 1 "Red please"
Description was:
Description now: Red please

$ gdal-edit-band-desc test-edit.tif 1 "Red please also"

$ python t:\ENV.558\scripts\gdal-edit-band-desc.py test-edit.tif 1 "Red please also"
Description was: Red please
Description now: Red please also

正确的做法应该是将其添加到gdal_edit.py,但我不知道足够的信息来直接添加它。


-1

使用带有-mo标志的gdal_edit.py可以用于编辑波段描述,其中波段从1开始编号:

gdal_edit.py -mo BAND_1=AVHRR_Channel_1_p58_p68_um -mo BAND_2=AVHRR_Channel_2 avhrr.tif

我没有尝试过带有特殊字符的情况,但如果您使用正确的引号可能会奏效。


虽然这段代码可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在回答未来读者的问题,而这些人可能不知道您提出代码建议的原因。 - Muhammad Dyas Yaskur
4
这并没有达到我所要求的目标。它只是添加了由您定义的附加通用元数据,但未向单波段属性添加描述。 - Generic Wevers
这是具有误导性的;它没有将元数据添加到波段中。 - metasim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接