Bootstrap

《Python与开源GIS——数据处理、空间分析与地图制图》学习笔记——GDAL部分

使用GDAL操作栅格数据

获取栅格影像信息

导入GDAL与gdalconst

from osgeo import gdal  # 导入GDAL
from osgeo.gdalconst import *

注册栅格数据驱动

gdal.AllRegister()  # 注册所有数据驱动
#  driver = gdal.GetDriverByName('GTiff')
#  driver.Register()  # 单独注册某一类型驱动(如GeoTiff类型)

打开栅格影像数据

filepath = r'E:\codes_lib\QGIS\GIS_Dev\gdata\geotiff_file.tif'
rds = gdal.Open(filepath)  # 打开栅格数据

读取影像元数据

# 读取影像元数据
rds.GetMetadata()
{'AREA_OR_POINT': 'Area', 'PyramidResamplingType': 'NEAREST'}

获取栅格数据信息

# 获取栅格数据信息
rds.GetDescription()
'E:\\codes_lib\\QGIS\\GIS_Dev\\gdata\\geotiff_file.tif'

读取栅格波段数目

# 获取栅格波段数
rds.RasterCount
3

获取栅格影像的行列数目

# 获取栅格影像的行列数目
img_Xsize = rds.RasterXSize
img_Ysize = rds.RasterYSize
print("影像的列数目(影像宽度)为:{} 行数目(影像高度)为:{}".format(img_Xsize,img_Ysize))
影像的列数目(影像宽度)为:1500 行数目(影像高度)为:900

获得影像的空间参考(仿射变换六参数)

# 获得影像的空间参考(仿射变换六参数)
GeoTransform = rds.GetGeoTransform()
Transform = ['左上角像元经度:','像元宽度:','X方向上旋转角度:','左上角像元纬度:','像元高度:','Y方向的旋转角度:']
for i in range(len(GeoTransform)):
    print(Transform[i],GeoTransform[i])
左上角像元经度: 1868454.913
像元宽度: 30.0
X方向上旋转角度: 0.0
左上角像元纬度: 5353126.266
像元高度: 0.0
Y方向的旋转角度: -30.0

获取影像投影信息

# 获取投影信息
rds.GetProjection()
'PROJCS["Albers_Beijing54",GEOGCS["Unknown datum based upon the Krassowsky 1940 ellipsoid",DATUM["Not_specified_based_on_Krassowsky_1940_ellipsoid",SPHEROID["Krassowsky 1940",6378245,298.3,AUTHORITY["EPSG","7024"]],AUTHORITY["EPSG","6024"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]]],PROJECTION["Albers_Conic_Equal_Area"],PARAMETER["latitude_of_center",0],PARAMETER["longitude_of_center",105],PARAMETER["standard_parallel_1",25],PARAMETER["standard_parallel_2",47],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]]'

获取栅格数据波段信息

rds = gdal.Open(r'E:\codes_lib\QGIS\GIS_Dev\gdata\lu75c.tif')
rds.RasterCount
1

读取栅格数据的波段

# 获取数据集的波段
band = rds.GetRasterBand(1)  # 注意波段索引开始值是1而不是0
dir(band)  # 查看波段的基本信息
['AdviseRead',
 'AsMDArray',
 'Checksum',
 'ComputeBandStats',
 'ComputeRasterMinMax',
 'ComputeStatistics',
 'CreateMaskBand',
 'DataType',
 'DeleteNoDataValue',
 'Fill',
 'FlushCache',
 'GetActualBlockSize',
 'GetBand',
 'GetBlockSize',
 'GetCategoryNames',
 'GetColorInterpretation',
 'GetColorTable',
 'GetDataCoverageStatus',
 'GetDataset',
 'GetDefaultHistogram',
 'GetDefaultRAT',
 'GetDescription',
 'GetHistogram',
 'GetMaskBand',
 'GetMaskFlags',
 'GetMaximum',
 'GetMetadata',
 'GetMetadataDomainList',
 'GetMetadataItem',
 'GetMetadata_Dict',
 'GetMetadata_List',
 'GetMinimum',
 'GetNoDataValue',
 'GetOffset',
 'GetOverview',
 'GetOverviewCount',
 'GetRasterCategoryNames',
 'GetRasterColorInterpretation',
 'GetRasterColorTable',
 'GetScale',
 'GetStatistics',
 'GetTiledVirtualMem',
 'GetTiledVirtualMemArray',
 'GetUnitType',
 'GetVirtualMem',
 'GetVirtualMemArray',
 'GetVirtualMemAuto',
 'GetVirtualMemAutoArray',
 'HasArbitraryOverviews',
 'ReadAsArray',
 'ReadBlock',
 'ReadRaster',
 'ReadRaster1',
 'SetCategoryNames',
 'SetColorInterpretation',
 'SetColorTable',
 'SetDefaultHistogram',
 'SetDefaultRAT',
 'SetDescription',
 'SetMetadata',
 'SetMetadataItem',
 'SetNoDataValue',
 'SetOffset',
 'SetRasterCategoryNames',
 'SetRasterColorInterpretation',
 'SetRasterColorTable',
 'SetScale',
 'SetStatistics',
 'SetUnitType',
 'WriteArray',
 'WriteRaster',
 'XSize',
 'YSize',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattr__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__swig_getmethods__',
 '__swig_setmethods__',
 '__weakref__',
 '_s',
 'this']

读取波段的行列数目

band.XSize  # 波段的列数目
6122
band.YSize  # 波段的行数目
4669

读取波段的数值类型

band.DataType  # 波段的数值类型
3

读取影像波段的无效值

print(band.GetNoDataValue())  # 获取波段无效值大小
None

读取影像波段的最大最小值

# 获取波段最大值与最小值
band.GetMaximum()
band.GetMinimum()
band.ComputeRasterMinMax()
(-1.0, 66.0)

获取栅格数据像元信息

filepath = r'E:\codes_lib\QGIS\GIS_Dev\gdata\geotiff_file.tif'
rds = gdal.Open(filepath)  # 打开栅格数据
band = rds.GetRasterBand(1)

访问栅格数据集的像素级数据

GDAL提供ReadRaster()和ReadAsArray()两个函数访问影像的像素值

ReadRaster():以二进制的形式读取影像数据

ReadAsArray():以数组的形式读取影像数据

注:两函数的参数如下:

xoff,yoff:指定读取部分影像原点位置在整张影像中相对于全图原点的位置(以像元为单位)

xsize,ysize:指定要读取部分影像的宽和高(以像元为单位)

buf_xsize,buf_ysize:对指定要读取部分影像进行缩放(均值重采样),该两参数定义了缩放后的影像宽和高

buf_type:可对读取数据进行类型转换

band_list:适用于多波段影像,可指定要读取的波段

# ReadAsArray()函数的使用
band.ReadAsArray(100,100,5,5,10,10)
array([[236, 236, 237, 237, 237, 237, 237, 237, 227, 227],
       [236, 236, 237, 237, 237, 237, 237, 237, 227, 227],
       [235, 235, 232, 232, 233, 233, 234, 234, 225, 225],
       [235, 235, 232, 232, 233, 233, 234, 234, 225, 225],
       [242, 242, 235, 235, 232, 232, 233, 233, 224, 224],
       [242, 242, 235, 235, 232, 232, 233, 233, 224, 224],
       [254, 254, 244, 244, 238, 238, 237, 237, 229, 229],
       [254, 254, 244, 244, 238, 238, 237, 237, 229, 229],
       [246, 246, 246, 246, 248, 248, 250, 250, 235, 235],
       [246, 246, 246, 246, 248, 248, 250, 250, 235, 235]], dtype=uint8)
# ReadRaster()函数的使用
band.ReadRaster(100,100,5,5,10,10)
bytearray(b'\xec\xec\xed\xed\xed\xed\xed\xed\xe3\xe3\xec\xec\xed\xed\xed\xed\xed\xed\xe3\xe3\xeb\xeb\xe8\xe8\xe9\xe9\xea\xea\xe1\xe1\xeb\xeb\xe8\xe8\xe9\xe9\xea\xea\xe1\xe1\xf2\xf2\xeb\xeb\xe8\xe8\xe9\xe9\xe0\xe0\xf2\xf2\xeb\xeb\xe8\xe8\xe9\xe9\xe0\xe0\xfe\xfe\xf4\xf4\xee\xee\xed\xed\xe5\xe5\xfe\xfe\xf4\xf4\xee\xee\xed\xed\xe5\xe5\xf6\xf6\xf6\xf6\xf8\xf8\xfa\xfa\xeb\xeb\xf6\xf6\xf6\xf6\xf8\xf8\xfa\xfa\xeb\xeb')

注意:在读取影像数据时,不要超出影像范围大小

创建与保存栅格数据集

GDAL创建数据集主要有两种方法:Create()、CreateCopy()

全部驱动类型都支持CreateCopy()方法,而只有部分驱动类型支持Create()方法,需要查看驱动元数据信息

使用CreatCopy()方法创建影像

filename_1 =  r'E:\codes_lib\QGIS\GIS_Dev\gdata\geotiff_file.tif'
filename_2 =  r'E:\codes_lib\QGIS\GIS_Dev\gdata\test\test_file.tif'
dataset_1 = gdal.Open(filename_1)
dataset_2 = driver.CreateCopy(filename_2,dataset_1,0,["INTELEAVE=PIXEL"])

CreateCoopy()函数创建的test_file.tif栅格数据:
请添加图片描述

使用Create()方法创建影像

# 使用Create()方法创建并写入一副多波段影像
filename_3 = r'E:\codes_lib\QGIS\GIS_Dev\gdata\test\test_file_2.tif'
img_wigth = dataset_1.RasterXSize
img_heigth = dataset_1.RasterYSize
datas = dataset_1.ReadAsArray(0,0,img_wigth,img_heigth)
to_img = driver.Create(filename_3,img_wigth,img_heigth,3,options=["INTELEAVE=PIXE"])
to_img.WriteRaster(0,0,img_wigth,img_heigth,datas.tobytes(),img_wigth,img_heigth,band_list=[1,2,3])
# to_img.FlushCache()
0
to_img.FlushCache()

Create()函数创建的test_file_2.tif栅格数据:请添加图片描述

注意:并未对所创建影像进行空间投影处理

参考资料:《Python与开源GIS——数据处理、空间分析与地图制图》 卜坤老师

本文作者对有意向学习GIS开发的朋友推荐该书,如有侵权,请联系作者

;