GDAL - 通用的地理数据转换工具

GDAL 介绍

概述

GDAL 全称是 Geospatial Data Abstraction Library,地球空间数据抽象库。它就像地理数据的 Pandoc,可以用来转换上百种栅格数据格式。GDAL 既是一个库,也是一组命令行工具。GDAL 的开发始于1998年,最初的开发者只有 Frank Warmerdam 一人。从1.3.2版本开始,GDAL 的开发和维护任务被转交给 GDAL/OGR 项目管理委员会。

格式转换需要考虑的因素

GDAL 从不同的格式中读取信息,存储为通用的内部格式,再将其转译成其他的格式。对某些格式,GDAL 支持直接按需生成带有地理索引信息的文件。这一内部格式应当能够描述栅格格式空间数据使用的抽象化方式,包括座标和投影系统、地理位置和栅格上像素位置的对应变换关系、同一像素上不同的波段或层、子图像、元数据等等。

数据模型和结构

GDAL 的栅格数据格式基于 OpenGIS 的网格覆盖描述。数据模型中,最上层的结构被称为数据集(Dataset),包括一个或多个波段的栅格图像以及它们共用的信息。在一个数据集中,各个波段的栅格需要有共同的大小和座标系统,这些信息都存储在栅格数据之外。另外数据集还支持以名字/值成对的方式存储元数据。

栅格形式存储的地理数据往往带有关于每个像素点如何与地球上的位置对应的信息,GDAL 的数据格式也必须能够描述这些信息。根据输入文件描述这种对应关系的方法的不同,GDAL 用仿射变换和地面控制点两种方式来描述地理位置和像素座标之间的换算关系,以适应尽可能多的数据格式。

仿射变换方式用共含有6个参数的两个方程来分别表示像素(x,y)的地理座标。在最简单的上方为正北的图像中,只要确定像素对应地面尺寸的宽和高以及左上角像素的左上角对应的地理位置,就可以确定6个参数。

GCP 方式则通过已知地理位置和像素位置的若干个控制点来推算其他像素的地理位置。GDAL 在这种情况下只储存控制点座标,而把推算的工作留给调用它的软件。

GDAL 提供了函数,用于通过仿射变换方程的参数或者控制点的位置信息,获取图像的投影和座标系信息。这些信息在 GDAL 数据集中,以 OpenGIS Well Known Text (WKT) 的形式存储。

数据集中的元数据被分为若干个区块,描述不同类型的数据特性。默认的区块描述元数据的格式类型,特殊数据的表示形式,像素点代表采样点还是区域平均等等;子数据集区块描述多图像文件中每帧图像的位置和编号、卫星编号、云覆盖比例等信息;RPC(有理多项式系数)区块记录了计算像素对应地理位置所需的系数,主要用于 GeoTIFF 格式的处理;图像结构区块则描述了图像是否经过压缩、图像的位数、图像数值是否带正负号等信息。

GDAL 数据中的图像本身是一系列栅格波段的集合。栅格波段中除了具体的图像数据,还存储了该波段数据的属性,包括数值的位数类型、存储是扫描线方式还是瓦片方式、有效最大最小值等等。描述图像对应哪种颜色的色彩表信息也储存在这里。

每个波段还可以附带一个概览波段,可以理解成通过采样生成的缩略图,它的像素数比原波段少,但覆盖的区域理论上说是与原波段相同的。

GDAL 的这种数据结构允许用户通过编写 XML 文件,从不同的数据集中选取信息,生成虚拟(VRT)格式数据集,以更加灵活和可编程的方式处理大量地理信息数据,并与他人共享。

应用

GDAL 被应用于 ArcGIS、GRASS GIS、QGIS 等多种 GIS 系统,以及 MapServer 这样的空间数据展示软件中。Python、R、JavaScript 等多种编程语言都为 GDAL 提供了接口。

ArcGIS 9.3 使用略经修改的 GDAL 库,允许开发者用 MS Visual C++ 编写处理其他栅格格式的“驱动”。在 ArcGIS 10.x 中,开发者则可以用插件调用 GDAL,或者利用 ArcGIS 自带的 Python 和 GDAL 的 Python 接口编写脚本。

Virtual Terrain Project 利用 GDAL 处理遥感图像数据,生成具有真实观感和准确位置的虚拟地形。

命令行工具

GDAL 的发布版本中附带了一系列命令行工具和脚本,用于对栅格文件进行编辑和转换,甚至直接创建新的带有地理位置信息的文件。这些工具在对大量文件的批量操作中尤其能发挥作用。GDAL 的作者还将 GDAL 与其他常用的开源 GIS 工具捆绑成一个叫 FWTools 的套件发布。

开发社区

GDAL 是开源地理空间基金会(OSGeo)的创始项目之一。按照基金会的方针,GDAL 的开发从 1.3.2 版本后由项目控制委员会/项目管理委员会领导。这个委员会负责确定指导软件开发的目标共识,方法是对 gdal-dev 邮件列表上提出的议题进行投票。