GDAL 是读写大量的栅格空间数据格式的广泛应用的开源库。GDAL 是 Geospatial Data Abstraction Library 的缩写, 最开始的时候是一个用来处理栅格空间数据的类库,OGR 则是则是来处 理矢量数据的。 后来,这两个库合并成为合并成为一个,在下载安装的时候,都是使用GDAL 这一个名字。
1.GDAL模型介绍
GDAL数据模型包括很多部分,每一部分都支持上述的库的基本设计理念。在GDAL模型里面,重要的有三个概念:数据集、栅格波段与颜色表。 其中数据集、栅格波段与 颜色表则与GIS的概念无关,只是定义了栅格数据如何以颜色进行显示的。
1.1GDAL数据集
一个数据集(GDAL数据集类为代表)是相关的栅格波段的和一些相关的信息的集合。 该数据集栅格大小适用于所有的波段。 该数据集还负责所有波段的地理参考定义和坐标系统定义。 数据集本身也有相关联的元数据,以字符串的形式存储在名称/值列表中。GDAL数据集和栅格波段数据模型是基于OGC格式定义的。
坐标系统
GDAL数据集坐标系统以OGC WKT字符串表示。包含:
上述预定义的坐标系统方面大部分代码来自欧洲石油调查组(EPSG)( http://www.epsg.org/ )。
1.2仿射地理转换
GDAL数据集在表示栅格位置(像素或者是行坐标)和地理参考坐标之间的关系有两种方法。 最常使用的仿射变换。 仿射变换包括六个参数,由GDALDataset::GetGeoTransform()
返回, 采用下面的关系把像素/行坐标转换到地理参考空间:
Xgeo=GT(0)+Xpixel⋅GT(1)+Yline⋅GT(2)
Ygeo=GT(3)+Xpixel⋅GT(4)+Yline⋅GT(5)
旋转角度,在“向北”的图像中,GT(2) and GT(4) 系数为0, GT(1) 是像素宽度, GT(5)是像素高度。 (GT(0),GT(3)) 位置是栅格左上角像素的左上角。Xpixel/Yline为图像的x/y坐标,Xgeo/Ygeo为对应的投影坐标.上面的像素/行坐标是从左上角像素的左上角 (0.0, 0.0) 到右下角像素的右下角.
1.3 地理控制点
GDAL描述栅格数据集地理参考的其中一种方法是使用地理控制点(GCP)。 使用这种方法,一个数据集将会有一套控制点,关联栅格位置和地理参考系统的一个或者多个位置。 所有的控制点共享一个地理参考坐标系统(由GDALDataset::GetGCPProjection()
返回)。 每个控制点(GDAL-GCP类描述)包括下面的部分(C语言中):
pszid字符串是数据集中控制点集中GCP的唯一标识符(通常但非总是数值)。 通常pszinfo是一个空串,但可以包含任何与控制点相关的用户定义的文本。 潜在的,这也可以包含对GCP状态机的机器可分析信息, 虽然这是个功能目前尚未实现。像素,线的位置是控制点在栅格的位置。 X,Y,Z的位置是相关的地理参考位置(Z值往往是零)。
1.4元数据
GDAL的元数据是辅助的格式,应用程序特定的文本数据保存为名称/值对列表。 名称需要标记好(没有空格或者奇怪的字符)。 值可以是任意长度,可以包含除了嵌入的null(ASCII0)之外的任何值。一些格式支持一些用户定义的的元数据, 而其他格式的驱动器将会把特殊格式的字段映射到元数据名称中。
1.5子数据集域
子数据集域包含一系列的子集。 通常这是用来提供那些多图像文件(HDF或者NITF)存储的图像序列的指针。以NAME结尾的字符串可以传递到GDALOpen()来访问这些文件。 以DESC结尾的值是用户友好的字符串,可以向用户显示一个选择的列表。
1.6栅格波段
GDAL栅格波段的表达是用GDALRasterBand类。 它代表一个栅格波段,通道或者是层。 它通常不代表一整幅影像。 例如一个24位的RGB图像通常被表示为三个波段,红、绿、蓝。一个栅格波段具有以下属性:
1.7颜色表
一个颜色表包含0个或者多个颜色,在C代码中用结构表示:
颜色表中显示了一个调色板解释值(GDAL PaletteInterp), 是下面的值之一,表示颜色表中的值如何解释。值是灰色,RGB,CMYK和HLS。
让栅格像素与颜色相连,像素值被用作颜色表的下标。这意味着,颜色总是从零开始,升序。在查看颜色表之前没有提供预调整机制。
2.使用GDAL
2.1导入GDAL
保持兼容性,可以使用下面的语句来导入:
>>> try:
>>> import gdal
>>> except:
>>> from osgeo import gdal
除了gdal包,还有一个gdalconst
包最好也导入。 gdalconst也是osgeo的一个包,它只是在代码中对GDAL中用到的一些常量进行了绑定。 其中gdalconst中的常量都加了前缀,力图与其他模块冲突最小。 所以对gdalconst你可以直接这样导入:
>>> from osgeo.gdalconst import *
2.2. 驱动
要读取某种类型的数据,必须要先载入数据驱动,也就是初始化一个对象,让它“知道”某种数据结构。 可以使用下面语句一次性注册所有的数据驱动,但是只能读不能写:
>>> gdal.AllRegister()
单独注册某一类型的数据驱动,这样的话可以读也可以写,可以新建数据集(这最终还要取决于GDAL是否已经进行了实现)。下面的语句注册了Erdas的栅格数据类型。
>>> driver = gdal.GetDriverByName('HFA')
>>> driver.Register()
可以使用下面的语句判断driver是否注册成功。
>>> driver = gdal.GetDriverByName('GeoTiff')
>>> driver == True
False
上面的注册就失败了,因为不存在名称为“GeoTiff”的数据格式(正确的格式为“GTiff”)。
查看系统支持的数据格式
2.3查看系统支持的数据格式
除了使用GetDriverByName(), GDAL还可以使用GetDriver()来获得驱动。 下面的代码获取了系统支持的所有的驱动的名称。
>>> from osgeo import gdal
>>> drv_count = gdal.GetDriverCount()
>>> for idx in range(drv_count):
>>> driver = gdal.GetDriver(idx)
>>> print( "%10s: %s" % (driver.ShortName, driver.LongName))
部分截图: