打开栅格数据的正确方式

作者:阿振

邮箱:tanzhenyugis@163.com

博客:https://blog.csdn.net/theonegis/article/details/80089375

修改时间:2018-05-16

声明:本文为博主原创文章,转载请注明原文出处

以一个简单例子说明如何打开栅格影像

下面的例子打开一副GeoTIFF影像,输出了影像的一些信息,然后遍历了所有波段,输出波段的一些信息

import gdal

# 打开栅格数据集
ds = gdal.Open('example.tif')

# 获得栅格数据的一些重要信息
print(f'投影信息:{ds.GetProjection()}')
print(f'栅格波段数:{ds.RasterCount}')
print(f'栅格列数(宽度):{ds.RasterXSize}')
print(f'栅格行数(高度):{ds.RasterYSize}')

# 获取数据集的元数据信息
metadata = ds.GetMetadata_Dict()
for key, value in metadata.items():
    print(f'{key} -> {value}')


for b in range(ds.RasterCount):
    # 注意GDAL中的band计数是从1开始的
    band = ds.GetRasterBand(b + 1)
    # 波段数据的一些信息
    print(f'数据类型:{gdal.GetDataTypeName(band.DataType)}')  # DataType属性返回的是数字
    print(f'NoData值:{band.GetNoDataValue()}')  # 很多影像都是NoData,我们在做数据处理时要特别对待
    print(f'统计值(最大值最小值):{band.ComputeRasterMinMax()}')  # 有些数据本身就存储了统计信息,有些数据没有需要计算

# 关闭数据集
ds = None

输出如下:

如何将Dataset转为Numpy的ndarray

当我们得到Band对象以后,如果按照GDAL的C/C++接口惯例,我们可以使用WriteRaster()方法进行数据写入(C/C++接口是WriteBlock()),但是在Python中我们有很强大的ndarray对象,所以我们一般是将Band对象中存储的数据转为ndarray进行处理以后,然后再写回去。

下面介绍几种转换的方法:

  1. Dataset级别进行转换,转换结果是一个三维数组,第一个维度是波段数

  2. Band级别进行转换,转换的结果是一个二维数据

  3. 使用gdal_array模块中的LoadFile()函数直接进行(相当于第一种转换)

输出结果:

使用gdal_array模块

在GDAL中使用Python的异常对象

Last updated