GDAL 遥感影像数据读取-plus

49 阅读6分钟

^ 关注我,带你一起学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开发 相关内容,欢迎关注 


    

GeoTools 开发合集(全)

OpenLayers 开发合集

地图海报生成项目定位方式修改

关于 PyQT5 和 GDAL 导入顺序引发程序崩溃的解决记录

关于浏览器无法进入断点的解决记录

GDAL 实现影像裁剪

GDAL 实现影像合并

小小声说一下GDAL的官方API接口

《云南省加快构建现代化产业体系推进产业强省建设行动计划》发布ArcGIS Pro 添加底图的方式

为什么每次打开 ArcGIS Pro 页面加载都如此缓慢?

ArcGIS 波段合成操作

ArcGIS Pro 实现影像波段合成

GDAL 创建矢量图层的两种方式

GDAL 实现矢量数据转换处理(全)

GDAL 实现投影转换