^ 关注我,带你一起学GIS ^
前言
❝
遥感影像数据作为GIS的重要数据源,在GIS开发中具有重要意义。在日常开发中,需要熟练掌握GDAL读取栅格数据的方式方法。
由于本文由一些前置知识,在正式开始之前,需要你掌握一定的Python开发基础和GDAL的基本概念。在之前的文章中讲解了如何使用GDAL或者ogr2ogr工具将txt以及csv文本数据转换为Shp格式,可以作为基础入门学习。
GDAL系列开始之前的一篇文章已经讲解过如何使用**GDAL读取遥感数据**,但是内容不太精确和完整,所以才有了现在这篇文章,属于GDAL读取遥感影像数据的plus版本。
本篇教程在之前一系列文章的基础上讲解如何使用GDAL 实现遥感影像数据读取-plus。
如果你还没有看过,建议从以上内容开始。
1. 开发环境
本文使用如下开发环境,以供参考。
时间:2026年
系统:Windows 11
Python:3.11.11
GDAL:3.11.1
2. 数据准备
俗话说巧妇难为无米之炊,数据就是软件的基石,没有数据,再美好的设想都是空中楼阁。因此,第一步需要下载遥感影像数据。
但是,影像数据在哪里下载呢?别着急,本文都给你整理好了。
数据下载可参考文章:GIS 影像数据源介绍
如下,这是我在【地理空间数据云】平台下载的landsat8遥感影像。
3. 查看数据支持格式
GDAL支持的栅格数据格式包括常见和非常见的足足有几百种,可谓是非常之多。
(一)常见数据格式
- CAD:AutoCAD DWG raster layer
- COG:Cloud Optimized GeoTIFF generator
- JPG:JPEG JFIF File Format
- PNG:Portable Network Graphics
- GTiff:GeoTIFF File Format
- WEBP:WEBP
- ...........
(二)非常见数据格式
- ACE2:ACE2
- BAG:Bathymetry Attributed Grid
- COASP:DRDC COASP SAR Processor Raster
- DDS:DirectDraw Surface
- HEIF:ISO/IEC 23008-12 High Efficiency Image File Format
- NTv2:NTv2 Datum Grid Shift
- ...........
可以通过以下地址查看GDAL支持的栅格数据格式。
https://gdal.org/en/stable/drivers/raster/
为了查看你使用的GDAL支持哪些数据格式,可以通过工具gdalinfo进行查看。
如果你不知道gdalinfo工具安装在哪里的话,可以使用搜索工具everything进行查找。
如果找到gdalinfo.exe程序的话,在命令行窗口中执行以下语句。
gdalinfo --formats
如果找不到gdalinfo.exe程序,可以寻找gdalinfo.py脚本,在命令行窗口中执行以下语句。
python gdalinfo.py --formats
如下是我的本地输出结果。
4. 导入依赖
直接使用from osgeo import gdal语句导入GDAL数据驱动。
from osgeo import gdal
5. 注册数据驱动
在使用之前需要注册驱动,而数据驱动的名称可在https://gdal.org/en/stable/drivers/raster/进行查找。
使用AllRegister方法一次性注册所有数据驱动。
# 注册数据驱动
gdal.AllRegister()
也可以通过GetDriverByName方法获取驱动名称进行单个注册。
# 根据驱动名称进行注册
driver = gdal.GetDriverByName("GTiff")
driver.Register()
6. 读取栅格数据集
在数据驱动注册之后,直接使用Open方法打开数据源,该方法将会返回一个栅格栅格数据集。
# 根据驱动名称进行注册
driver = gdal.GetDriverByName("GTiff")
if driver is None:
print("当前版本的gdal不支持此栅格数据格式!!")
driver.Register()
tiff_image = "file.tif"
datasource = gdal.Open(tiff_image,0)
if datasource is None:
print(f"{tiff_image} 数据源打开失败,请检查")
6.1. 读取栅格信息
在数据源中,栅格数据按照行和列存储栅格信息,可以使用数据源属性读取栅格数据的总行数、总列数以及波段数。
# 读取行列以及波段数据
rows = datasource.RasterYSize
cols = datasource.RasterXSize
bands = datasource.RasterCount
6.2. 读取地理信息
使用数据源方法GetGeoTransform 获取栅格坐标数据,该方法返回一个包含6个元素的元组数据。在
GeoTransform中,具有左上角起点坐标、行和列分辨率以及旋转参数。
# 获取地理信息
geotransform = datasource.GetGeoTransform()
origion_x = geotransform[0]
origion_y = geotransform[3]
pixel_width = geotransform[1]
pixel_height = geotransform[5]
"""
geotransform[0] /* top left x */
geotransform[1] /* w-e pixel resolution */
geotransform[2] /* rotation, 0 if image is "north up" */
geotransform[3] /* top left y */
geotransform[4] /* rotation, 0 if image is "north up" */
geotransform[5] /* n-s pixel resolution *
"""
坐标信息输出结果如下。
6.3. 计算像素偏移
使用当前点的x坐标减去起点x坐标,再除以像素宽度,可得到目标点在x方向上的像素偏移量;同理,使用y坐标减去起点y坐标,再除以像素高度,可得到目标点再y方向上的像素偏移量。
使用以下代码将地理坐标转换为像素坐标。
# 计算坐标偏移
x_offset = int((x-origion_x)/pixel_width)
y_offset = int((y-origion_y)/pixel_height)
6.4. 获取单个像素值
通过GetRasterBand方法获取目标波段数据,该方法接收一个索引参数,用于指定读取波段。使用 ReadAsArray方法将数据转换为二维数组。data = band.ReadAsArray(xOffset,yOffset,1,1)
# 读取波段数据
band = datasource.GetRasterBand(1)
data = band.ReadAsArray()
然后需要指定偏移量获取特定位置的值。
value = data[0,0]
6.5. 读取整个影像数据
将偏移量设置为0,并且将栅格数据的行和列数传递给ReadAsArray方法。
data = band.ReadAsArray(0, 0, cols, rows)
使用[yoff,xoff]读取单个像素值,注意,是[row,col],不是[col,row]
获取第十五列,第十行像素值。
# 获取第十五列,第十行像素值
col_15_row_10 = data_all[9,14]
7. 内存管理
在数据读取完成之后记得将变量设置为None,特别是在读取大型数据的时候非常重要。
# 关闭内存
band = None
datasource = None
图片效果
❝
OpenLayers示例数据下载,请在公众号后台回复:vector
全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试
❝
GIS之路 公众号已经接入了智能 助手,可以在对话框进行提问,也可以直接搜索历史文章进行查看。
都看到这了,不要忘记点赞、收藏 + 关注 哦 !
本号不定时更新有关 GIS开发 相关内容,欢迎关注
关于 PyQT5 和 GDAL 导入顺序引发程序崩溃的解决记录