Skip to content

使用 GDAL 读取地理空间栅格文件

地理空间栅格数据是地理信息系统(GIS)和摄影测量中大量使用的产品。栅格数据通常可以表示影像和数字高程模型(DEM)。加载 GIS 影像的标准库是地理数据抽象库 (GDAL)。在本示例中,我们将展示使用 OpenCV 原生函数加载 GIS 栅格格式的技术。此外,我们还将展示一个示例,说明 OpenCV 如何将这些数据用于新颖而有趣的用途。

本教程的主要目标:

  • 如何使用 OpenCV 的 imread 来加载卫星影像。
  • 如何使用 OpenCV 的 imread 来加载 SRTM 数字高程模型。
  • 给定影像和 DEM 的角点坐标,将高程数据与影像关联起来,以找到每个像素的高程。
  • 展示一个基本、易于实现的地形热力图示例。
  • 展示一个将 DEM 数据与正射校正影像结合使用的基本示例。

为实现这些目标,以下代码以一个数字高程模型以及一幅旧金山的 GeoTIFF 影像作为输入。对影像和 DEM 数据进行处理后,生成该影像的地形热力图,并标注出海湾水位上涨 10、50 和 100 米时会被影响到的城市区域。

代码见下方示例

本演示使用默认的 OpenCV imread 函数。主要区别在于,要强制 GDAL 加载影像,你必须使用相应的标志。 加载数字高程模型时,每个像素的实际数值至关重要,不能被缩放或截断。例如,对于影像数据,一个用 double 表示、值为 1 的像素,与一个用 unsigned char 表示、值为 255 的像素,在外观上是相同的。而对于地形数据,像素值表示以米为单位的高程。为了确保 OpenCV 保留原始值,请在 imread 中将 GDAL 标志与 ANYDEPTH 标志一起使用。 如果你事先知道自己要加载的 DEM 模型类型,那么使用断言或其他机制来测试 Mat::type() 或 Mat::depth() 可能是一个稳妥的做法。NASA 或 DOD 的规范文档提供了各种高程模型的输入类型。主要的类型 SRTM 和 DTED 都是有符号短整型。

经纬度(地理)坐标通常应避免使用

Section titled “经纬度(地理)坐标通常应避免使用”

地理坐标系是一种球面坐标系,这意味着将其用于笛卡尔数学运算在技术上是不正确的。本演示使用它们是为了提高可读性,并且精度足以说明问题。更好的坐标系应是通用横轴墨卡托投影(Universal Transverse Mercator)。

查找影像角点坐标的一个简便方法是使用命令行工具 gdalinfo。对于已正射校正且包含投影信息的影像,你可以使用 USGS EarthExplorer。

Terminal window
$> gdalinfo N37W123.hgt
Driver: SRTMHGT/SRTMHGT File Format
Files: N37W123.hgt
Size is 3601, 3601
Coordinate System is:
GEOGCS["WGS 84",
DATUM["WGS_1984",
... more output ...
Corner Coordinates:
Upper Left (-123.0001389, 38.0001389) (123d 0' 0.50"W, 38d 0' 0.50"N)
Lower Left (-123.0001389, 36.9998611) (123d 0' 0.50"W, 36d59'59.50"N)
Upper Right (-121.9998611, 38.0001389) (121d59'59.50"W, 38d 0' 0.50"N)
Lower Right (-121.9998611, 36.9998611) (121d59'59.50"W, 36d59'59.50"N)
Center (-122.5000000, 37.5000000) (122d30' 0.00"W, 37d30' 0.00"N)
... more output ...

gdal_output.jpg gdal_heat-map.jpg gdal_flood-zone.jpg

以下是程序的输出。将第一幅图像作为输入。对于 DEM 模型,请从 USGS 下载位于此处的 SRTM 文件: http://dds.cr.usgs.gov/srtm/version2_1/SRTM1/Region_04/N37W123.hgt.zip