Python与开源GIS:使用GDAL获取栅格数据波段信息

上面我们介绍数据集操作的主要函数。 但是如果需要更多信息,我们就需要看一下遥感图像处理中更常用到的波段操作的函数。

获取数据集的波段

GetRasterBand 获得栅格数据集的波段

    >>> from osgeo import gdal
    >>> dataset = gdal.Open("/bk/gdata/img_landsat_subset_index.img")
    >>> dataset.RasterCount
        1
    >>> band = dataset.GetRasterBand(1)

这里我们获取了第一个波段(红色值组成的表)。 注意!这里的波段获取和通常的C数组获取不一样,开始是1不是0。获取了波段,我们就可以在下面的操作中读取这个波段的所有数值。

查看波段的基本信息

下面我们现在来看看刚才读取出来的那个band有些什么东西可以供我们操作的。

与操作数据集一样,GDAL同样提供了查看波段基本信息的函数。

    >>> from osgeo import gdal
    >>> dataset = gdal.Open("/bk/gdata/img_landsat.tif")
    >>> band = dataset.GetRasterBand(1)
    >>> dir(band)
    ['Checksum', 'ComputeBandStats', 'ComputeRasterMinMax', 'CreateMaskBand', 'DataType', 'Fill', 'FlushCache', 'GetBlockSize', 'GetColorTable', 'GetDefaultHistogram', 'GetDefaultRAT', 'GetDescription', 'GetHistogram', 'GetMaskBand', 'GetMaskFlags', 'GetMaximum', 'GetMetadata', 'GetMetadataItem', 'GetMetadata_Dict', 'GetMetadata_List', 'GetMinimum', 'GetNoDataValue', 'GetOffset', 'GetOverview', 'GetOverviewCount', 'GetRasterCategoryNames', 'GetRasterColorInterpretation', 'GetRasterColorTable', 'GetScale', 'GetStatistics', 'ReadAsArray', 'ReadRaster', 'SetColorTable', 'SetDefaultHistogram', 'SetDefaultRAT', 'SetDescription', 'SetMetadata', 'SetMetadataItem', 'SetNoDataValue', 'SetRasterCategoryNames', 'SetRasterColorInterpretation', 'SetRasterColorTable', 'SetStatistics', 'WriteArray', 'WriteRaster', 'XSize', 'YSize', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__get_array_interface__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__swig_getmethods__', '__swig_setmethods__', '__weakref__', '_s', 'this']

看一下常用的操作。这些也是来获取波段的属性信息。

获取波段大小

    >>> band.XSize
        4688
    >>> band.YSize
        4631
    >>> band.DataType
        1

得到波段图像的宽和高(像元为单位)。 这个与dataset中使用RasterXSizeRasterYSize获取的值一致。DataType是图像中实际数值的数据类型,表示8位无符整型。 在[subsec:banddatatype]节有更进一步的解释。

获取波段数据的属性

    >>> band.GetNoDataValue()
    >>> band.GetMaximum()
    >>> band.GetMinimum()
    >>> band.ComputeRasterMinMax()
        (0.0, 255.0)

Maximum 是表示在本波段数值中最大的值,Minimum当然就是表示本波段中最小的值啦。 我们可以看到在一开始这两个都没有值。因为对于文件格式不会有固有的最大最小值。 所以我们通过函数ComputeRasterMinMax()计算得到了。注意!这里的最大最小值不包括"无意义值"! 也就是上面显示的 NoDataValue。用ComputeRasterMinMax()算出的最大最小值, 是排除了无意义值后计算出来的最大最小值。