首页 > 范文大全 > 正文

开源库GDAL及其在影像拼接中的应用

开篇:润墨网以专业的文秘视角,为您筛选了一篇开源库GDAL及其在影像拼接中的应用范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

[摘 要]本文概要介绍了网上优秀的GIS开源gdal的来龙去脉与主要功能,然后针对遥感影像处理中的经常用到的数据拼接处理问题,用示例说明了GDAL库进行GIS系统开发的方法与过程。

[关键词]GDAL OGR 影像拼接

[中图分类号]TP[文献标识码]A[文章编号]1007-9416(2010)02-0088-02

1 引言

目前,越来越多的开源GIS系统出现在互联网上,这些开源的源代码系统有IBM、GDAL、SharpMap、QGIS等一些重量级的软件公司和一些软件开放基金会的支持,其中的很多软件经过众多软件爱好者与志愿者的千锤百炼,具有很好的软件质量,这些开源的GIS系统是GIS开发者一个巨大的知识与财富宝库,是全人类的共同财富,包括ESRI、Google等公司的很多算法与模块都来自于这些开源库。中国也已经成为地学开源软件基金会(OSGeo)的成员[1]。很好地使用这些开源资源,对于我国GIS开发者学习掌握成熟、高效的GIS常用算法,提高我国GIS软件的原创水平具有重要的意义。在这众多的开源GIS系统中,GDAL是公认的佼佼者之一。GDAL库有多个版本,其中包括C++、C#、JAVA、.NET等。可以用来用于操作各种栅格地理数据格式。当然除了栅格操作,这个库还同时包括了另外一个库OGR,OGR包括了操作矢量数据的所有方法,这样这个库就同时具备了操作栅格和矢量数据的能力。同时,GDAL还是一个跨平台的开源库。

影像拼接是将两张或多张(具有重叠显示的连续影像)拼接显示的过程[2]。影像拼接是GIS软件的基本功能之一,它包括影像数据读取、显示、拼接、裁切等一系列操作,是遥感影像处理软件的入门但常用功能,本文通过对该功能的实现,提供了用GDAL进行系统开发的简单范例,展示了GDAL的强大功能和方便的开发步骤。

2 GDAL库介绍

1998年末,加拿大的Frank Warmerdam 开始了GDAL(Geospatial Data Abstraction Library)项目的编写工作[3]。该项目得到了许多个人和团体的支持,主要的赞助团体有Cadcorp、Safe Software、SRC、i-cubed、Ingres Corporation等。GDAL是一个独立的专业的开源库,并且是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式,还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。有很多著名的GIS类产品包括ESRI的ArgGIS 9.2,Google Earth和跨平台的GRASS GIS系统都使用了GDAL/OGR开源库的若干模块。利用GDAL/OGR库,可以使基于Linux的地理空间数据管理系统提供对矢量和栅格文件数据的支持[4]。

2.1 GDAL的类框架

GDAL提供对多种栅格数据的支持,包括Arc/Info的ASCII Grid(asc),GeoTiff (tiff),Erdas Imagine Images(img),ASCII DEM(dem) 等格式。GDAL使用抽象数据模型(abstract data model)来解析它所支持的数据格式,抽象数据模型包括数据集(dataset)、坐标系统、仿射地理坐标转换(Affine Geo Transform)、大地控制点(GCPs)、元数据(Metadata)、栅格波段(Raster Band)、颜色表(Color Table)、子数据集域(Subdatasets Domain)、图像结构域(Image_Structure Domain)、XML域(XML:Domains)等。

GDAL的核心类结构设计如图1所示:

其中的类说明如下:

GDALMajorObject类:带有元数据的对象。

GDALDdataset类:通常是从一个栅格文件中提取的相关联的栅格波段集合和这些波段的元数据;GDALDdataset也负责所有栅格波段的地理坐标转换(georeferencing transform)和坐标系定义。

GDALDriver类:文件格式驱动类,GDAL会为每一个所支持的文件格式创建一个该类的实体,来管理该文件格式。

GDALDriverManager类:文件格式驱动管理类,用来管理GDALDriver类。

2.2 GDAL的主要功能

GDAL作为一个优秀的开源库,它提供了标准的二次开发接口,包括读取、写入、转换、处理多种栅格数据格式,同时它提供完全公开的源代码,为用户进行二次开发和底层的功能扩展提供了很高的起点。GDAL使用了一个单一的抽象数据模型来支持大多数类型的栅格数据[5],GDAL支持的数据格式有"BMP"、"JPEG"、" GTiff"、" HFA"、"BT"、" ECW"、"FITS"、"GIF"、"HDF4"、"EHdr"等。这也是GDAL的一个最重要的功能。

在打开GDAL所支持的光栅数据之前需要注册驱动。这里的驱动是针对GDAL支持的所有数据格式。通常可以通过调用GDALAllRegister()函数来注册所有已知的驱动。然后需要根据不同的数据格式获取相应的驱动。例如:

GDALDriver * driver=NULL;

CString format = “dataformat”;

if (format == "bmp")

driver = GetGDALDriverManager()->GetDriverByName("BMP");

else if (format == "jpg")

driver = GetGDALDriverManager()->GetDriverByName("JPEG");

else if (format == "tif")

driver = GetGDALDriverManager()->GetDriverByName("GTiff");

else if (format == "img")

driver = GetGDALDriverManager()->GetDriverByName("HFA");

………………………….

在获取相应驱动后,通过GDALDriver类提供的函数进行创建GDALDataset,然后利用GDALDataset类进行数据的读写和地理参数的设置。一个GDALDataset包含了光栅数据的一系列的波段信息。同时它还包含元数据、一个坐标系统、投影类型、光栅的大小以及其他许多信息。其中地理参数包含以下几个方面:

adfGeoTransform[0]/* 左上角 x */

adfGeoTransform[1]/* 东西方向一个像素对应的距离*/

adfGeoTransform[2]/* 旋转, 0表示上面为北方*/

adfGeoTransform[3]/* 左上角 y */

adfGeoTransform[4]/* 旋转, 0表示上面为北方*/

adfGeoTransform[5]/* 南北方向一个像素对应的距离*/

3 影像拼接

像数据应用的过程中,人们获得的原始数据通常是分片的,在构建应用中,常常需要对这些分片的原始数据进行拼接,然后根据不同要求把瓦片数据拼接成一幅或多幅影像数据。影像镶嵌的目标就是要产生一个视觉可行的全景图像,便于更好地统一处理、解译、分析和研究[6]。本文所用实例就是在GDAL库的基础上进行影像数据拼接的一个应用。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

本文影像拼接所用数据大小均为256×256瓦片,它们的名称均采用Google QRST命名规则。

本文实例应用所用技术主要有以下几点:

(1)根据数据块的名称,设计算法求出该数据块在整个图幅中的行列号,同时根据数据块名称的长度求得该图层在所在金字塔中的级数。

Void FindRowAndCol(CString filename, int &row, int &col, int &level)

{

char tempchar; static int length = 0;

filename = filename.MakeLower();

tempchar = filename.GetAt(0);//获取文件名的第一个字母

if(length == 0){

length = filename.GetLength();

level = length - 1;

}

filename = filename.Right(filename.GetLength()-1);

if(tempchar == 't')//判断文件名的第一个字母是否为't'

{

row = 2*row; col = 2*col;

FindRowAndCol( filename, row, col, level );//递归查找

}else if(tempchar == 's') //判断文件名的第一个字母是否为's'

{

row = 2*row ;

col = 2*col + 1;

FindRowAndCol( filename, row, col, level ); //递归查找

}else if(tempchar == 'q') //判断文件名的第一个字母是否为'q'

{

row = 2*row + 1;

col = 2*col;

FindRowAndCol( filename, row, col, level ); //递归查找

}else if(tempchar == 'r') //判断文件名的第一个字母是否为'r'

{

row = 2*row + 1;

col = 2*col + 1;

FindRowAndCol( filename, row, col, level ); //递归查找

}

}

(2)根据①中的算法遍历所有数据块,求出所有数据块的最大最小行列号,从而得出整个图幅的范围。然后根据需要拼接图幅的大小把整个图幅划分成多个子图幅,然后根据各个子图幅的范围创建不同的数据集。主要函数有:

GDALAllRegister(); //注册所有已知的驱动

GDALDriver*GetGDALDriverManager()->GetDriverByName(const char*)//获取驱动

GDALDataset *GDALDriver->Create( const char * pszName,int nXSize, int nYSize,intnBands,GDALDataType eType,char ** papszOptions);//创建数据集

(3)遍历每一个数据块,通过数据块的名称求出应该插入到子图幅的索引号以及在子图幅中的偏移量。最后把该数据块写入到子图幅所对应的数据集。主要函数有:

Int getMergeImageBlockIndex(Cstring filename,int &rowoffsetInImageBlock,Int &coloffsetInImageBlock) ;//获取子图幅的索引号以及在子图幅中的偏移量

bool isMergeImageBlockExist(int index) ;//判断子图幅数据集是否存在

bool createMergeImageBlockExist(int index);//若子图幅不存在创建子图幅数据集

GDALRasterBand GDALDataset->GetRasterBand( int );//获取一个影像波段

GDALRasterBand->RasterIO(GDALRWFlag, int, int, int, int, void *, int, int, GDALDataType,int, int );//读写栅格数据的方法

GDALClose(GDALDataset); //关闭数据集

图2为遥感影像拼接前的数据块,图3为遥感影像拼接后的图幅。

4 结语

本文通过影像拼接模块的开发实例介绍了开源软件GDAL的功能与开发方法。GDAL不仅在栅格数据处理上有很强的功能,在矢量数据处理方面也有不俗的表现,由于篇幅有限,针对OGR的主要功能在此不做详细阐述。希望本文能对GDAL开源库在国内的广泛应用起到抛砖引玉的作用。

[参考文献]

[1] 陈荣国,孙剑.OSGeo在中国[J].软件世界,2006.10.20,40-41.

[2] ER Mapper.使用指南[EB/OL].(2007-1-11).

www.省略/ermapper/gb/support/user-guide/user-guide.htm

[3] Frank Warmerdam.GDAL - Geospatial Data Abstraction Library[EB/OL].(1998-).

www.省略/.

[4] Frank Warmerdam.FAQ-Generar[EB/OL].(1998-).

trac.省略/gdal/wiki/FAQGeneral#WhatisGDAL

[5] 李林.GDAL库介绍[EB/OL].(2008-07-26).

wiki.省略.cn/moin/lilin/gdal-introduce.

[6] 温红艳,周建中.基于灰关联分析的遥感影像无缝拼接[J].计算机应用研究,2009-9,26(9):3534-3535.

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文