GDAL Document

可能你不玩GIS,不懂这个库到底有什么用,或者和python有什么关系。 但是你要玩GIS,RS,你就应当知道这个库的价值。就算你不玩GIS,我想这个库对你也应该有致命的吸引力。为什么?看下面的介绍吧!

简单地说,GDAL是一个操作各种栅格地理数据格式的库。 包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持)。 它使用了一个单一的抽象数据模型就支持了大多数的栅格数据(GIS对栅格,矢量,3D数据模型的抽象能力实在令人叹服)。 当然除了栅格操作,这个库还同时包括了操作矢量数据的另一个有名的库[http://ogr.maptools.org/ ogr](ogr这个库另外介绍), 这样这个库就同时具备了操作栅格和矢量数据的能力,买一送一,这么合算的买卖为什么不做^^。 最最最重要的是这个库是跨平台的,开源的!如今这个库对各种数据格式的支持强大到令人啧啧的地步了。 如果你对他的强大有什么怀疑的话,看看[http://www.gdal.org/formats_list.html 这里]一大串的GDAL所支持格式清单,吓到了吧! 再看看它的主页最后那些使用了它作为底层数据处理的软件列表吧! 其中你可以不知道GRASS,你也可以不知道Quantum GIS (QGIS),但是你总该知道 Google Earth吧! 不知道?赶快下一个去玩玩--会当临绝顶,一览众山小!

有人说我又不玩GIS。不错,但是,你即使不玩GIS,这个库也是满有用的。 首先,哪个库支持这么多栅格(图片)格式,哪个库在C/C++/python/ruby/VB/java/C#(这个暂时不完全支持)下都能用, 而且都一样用?退一步讲,3S软件又不一定要用在3S下(很多医学影像就是用PCI软件来处理的)。 再退一步,你的生活即使和3S一点关系都没有,栅格数据又不单单只有GIS下才用到。你大可用这个库来读取jpg,gif,tif,xpm等格式。 而且对各种格式支持得不是一般的好,很大一部分非标准格式照样支持得非常好

这个库的python版和其他的python库结合的很好。 最直接、明显的支持是使用Numeric库来进行数据读取和操作。各种矩阵魔术可以发挥得淋漓尽致(图像其实就是矩阵)。 而且按我的观点,python对矩阵的操作比其他的语言有明显的优势。写出来的东西比其他语言写出来的短小的多,而且好看得多。 并且python的弱类型在处理栅格数据格式类型的时候代码量比强类型的语言少了数倍(不用double,byte,short等等分开处理,这简直就是先天上的优势)。 所以我就喜欢用python做图像的处理。所以就连GIS界的微软ESRI也直接在ARCGIS9中用python来作栅格数据的导入导出。一句话,真是太方便啦!

Geospatial Data Abstraction Library (GDAL)是使用C/C++语言编写的用于读写空间数据的一套跨平台开源库。 现有的大部分GIS或者遥感平台,不论是商业软件ArcGIS,ENVI还是开源软件GRASS,QGIS,都使用了GDAL作为底层构建库。

GDAL库由OGR和GDAL项目合并而来,OGR主要用于空间要素矢量矢量数据的解析,GDAL主要用于空间栅格数据的读写。 此外,空间参考及其投影转换使用开源库 PROJ.4进行。

目前,GDAL主要提供了三大类数据的支持:栅格数据,矢量数据以及空间网络数据(Geographic Network Model)。

GDAL提供了C/C++借口,并且通过SWIG提供了Python,Java,C#等的调用借口。 当我们在Python中调用GDAL的API函数时,其实底层执行的是C/C++编译的二进制文件。

GDAL不但提供了API借口方便开发人员自定义自己的功能,而且还提供了一系列实用工具(Command Line Tools)可以实现方便快速的空间数据处理。 我们可以使用这些实用工具,结合Linux Shell脚本或者Windows批处理脚本进行大批量空间数据的批量处理。

GDAL 1.x版本以前,对于栅格和矢量数据的读写API借口设计是相对分离的,从2.x版本开始,栅格和矢量数据的API进行了集成,对开发者更加友好。

栅格数据组织

GDAL中使用dataset表示一个栅格数据(使用抽象类GDALDataset表示),一个dataset包含了对于栅格数据的波段,空间参考以及元数据等信息。一张GeoTIFF遥感影像,一张DEM影像,或者一张土地利用图,在GDAL中都是一个GDALDataset。

# 坐标系统(使用OGC WKT格式表示的空间坐标系统或者投影系统) # 地理放射变换(使用放射变换表示图上坐标和地理坐标的关系) # GCPs(大地控制点记录了图上点及其大地坐标的关系,通过多个大地控制点可以重建图上坐标和地理坐标的关系) # 元数据(键值对的集合,用于记录和影像相关的元数据信息) # 栅格波段(使用GDALRasterBand类表示,真正用于存储影像栅格值,一个栅格数据可以有多个波段) # 颜色表(Color Table用于图像显示)

地理放射变换

放射变换使用如下的公式表示栅格图上坐标和地理坐标的关系:

Xgeo=GT(0)+Xpixel∗GT(1)+Yline∗GT(2)
Ygeo=GT(3)+Xpixel∗GT(4)+Yline∗GT(5)

(Xge0, Yge0)表示对应于图上坐标(Xpixel, Yline)的实际地理坐标。 对一个上北下南的图像,GT(2)和GT(4)等于0, GT(1)是像元的宽度, GT(5)是像元的高度。(GT(0),GT(3))坐标对表示左上角像元的左上角坐标。

通过这个放射变换,我们可以得到图上所有像元对应的地理坐标。

矢量数据组织

GDAL的矢量数据模型是建立在OGC Simple Features规范的基础之上的, OGC Simple Features规范规定了常用的点线面几何体类型,及其作用在这些空间要素上的操作。

OGR矢量数据模型中比较重要的几个概念:

# Geometry(OGRGeometry类表示了一个空间几何体,包含几何体定义,空间参考,以及作用在几何体之上的空间操作,几何体和OGC WKB,WKT格式直接的导入导出) # Spatial Reference(OGRSpatialReference类表示了空间参考信息,各种格式的空间参考的导入导出) # Feature(OGRFeature类表示空间要素,一个空间要素是一个空间几何体及其属性的集合) # Layer(OGRLayer表示一个图层,一个图层中可以包含很多个空间要素) # Dataset(GDALDataset抽象类表示一个矢量数据,一个Dataset可以包含多个图层)

总结一下:一个数据集(Dataset)可以包含多个图层(Layer),一个图层中可以包含多个空间要素(Feature), 一个Feature由一个空间几何体(Geometry)及其属性构成