GDAL源码剖析(转载)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GDAL源码剖析(转载)相关的知识,希望对你有一定的参考价值。

GDAL源码剖析(一)

GDAL

前言:一直在使用和研究GDAL的相关东西,发现网上对GDAL的内容倒是不少,但是很少有系统的介绍说明,以及内部的一些结构说明,基于这些原因,将本人的一些粗浅的理解放在此处,形成一个系列,暂时名为《GDAL源码剖析》(名称有点大言不惭,欢迎大家口水吐之,板砖拍之),供大家交流参考,有什么错误之处,望大家不吝指正,本系列对于GDAL的使用均是在Windows平台下,对于Linux平台下的不在此系列讨论范围之内。此外,转载本博客内容,请注明出处,强烈鄙视转载后不注明出处的“类剽窃”行为。

 

一、GDAL简介

    GDAL官方网站http://www.gdal.org/,本文章中的基本内容都是参照官网中的信息,如有错误或者与官网中的内容冲突,以官网中的为正确。

在开始文章之前,我想先提出几个问题,什么是GDAL?GDAL能做什么?GDAL怎么使用?GDAL内部结构是怎么组织的?GDAL提供的算法原理是什么?对于上面的几个问题,希望大家看完该系列文章后能对上面的几个问题少点疑惑,希望能对感兴趣的童鞋们有所帮助。本人不才,文章中难免会出现问题,希望大家不吝指正。

什么是GDAL?这个问题比较简单,通俗的讲,GDAL是一个读写空间数据(这里的空间数据包括栅格数据和矢量数据)的开源库(但不仅限于此,此外还提供了一些非常常用的算法和工具)。严格的讲,大家可以参考GDAL首页上的介绍。

 GDAL is a translator library for raster geospatial dataformats that is released under an X/MIT style Open Source license by the Open Source Geospatial Foundation. As alibrary, it presents a singleabstract data model to the calling application for allsupported formats. It also comes with a variety of usefulcommandline utilities fordata translation and processing. TheNEWSpage describes the July 2011 GDAL/OGR 1.8.1 release.

The related OGR library(which lives within the GDAL source tree) provides a similar capability forsimple features vector data.

 

二、GDAL目录结构

    首先对于GDAL的目录结构进行一个简单的介绍。GDAL源代码下载地址:http://trac.osgeo.org/gdal/wiki/DownloadSource,或者安装svn从源代码服务器下载,svn地址是:http://svn.osgeo.org/gdal/trunk

    如果是使用下载的压缩包,其目录结构如下图:

技术分享

 

图1 GDAL源码压缩包文件目录结构

    如果使用svn下载的源代码,目录结构如下:

技术分享

 

图2 GDAL SVN源码文件目录结构

从上面两张图中可以看出,GDAL的目录结构不管是用什么方式获取的源代码,它的目录结构都是一样的,下面就针对目录结构中的每个文件夹和文件做一个简单的说明。(按照字母顺序来进行说明)

   下面先对文件夹进行说明:

1、alg文件夹:alg文件夹中存放的是GDAL库中提供的一些算法的源代码,这些算法包括但不限于:DEM生成等高线算法;图像纠正算法(几何纠正,TPS纠正,正射RPC纠正);栅格矢量化算法;矢量栅格化算法;格网计算算法;PCT和RGB互转算法;分类图的小碎斑块去除算法等。

2、apps文件夹:apps文件夹中存放的是GDAL库中提供的一些命令行工具集的源代码,这些工具集的介绍可以参考http://gdal.org/gdal_utilities.html,将来我会对这些工具做一个简单的说明。其中有些工具非常的有用,比如gdalinfo,可以使用该工具来查看图像的元数据信息等。

3、bridge文件夹:bridge文件夹中存放的是用来连接GDAL抽象类的定义以及GDAL自己的结构体定义和实现的源代码。具体到后面涉及到GDAL的实现原理时会对该文件夹作一个比较详细的介绍。

4、data文件夹:data文件夹中存放的是GDAL库中需要用到的一些“配置文件”(此处用配置文件可能不太准确),这些文件主要有ESRI的投影文件,ESPG的投影文件,PCI的投影和椭球体文件,autoCAD的头文件,以及其他的一些文件。在GDAL库中有很多时候会自动读取该文件夹中的文件,一般是通过环境变量来查找该文件夹,环境变量的名字叫GDAL_DATA,值就是data文件夹的路径,或者可以在你的程序中使用函数 CPLSetConfigOption("GDAL_DATA","C:\GDAL\data");来进行设置该文件夹的目录,如果没有设置GDAL会自动从环境变量中查找,如果还是没有找到,那么GDAL可能会提示错误,比如如果不设置GDAL_DATA,那么在写如atuocad的dxf格式的时候就提示创建不成功,后面遇到的话会再进行说明。

5、doc文件夹:doc文件夹存放的是用来生产GDAL帮助文档的一些dox文件,dox文件是使用doxygen工具来进行生成的,后面会对doxygen工具作一个简单的介绍和说明,以及在自己的工程中怎么使用doxygen生成自己的程序的开发帮助文档等。总之一句话,这个文件夹就是用来生成GDAL库的帮助文档的一些东西。后面会告诉大家如何生成一份GDAL的帮助文档,当然你也可以把gdal.org整个网站抓下来,J

6、frmts文件夹:这个文件夹可以说是GDAL代码中东西最多的一个文件夹了,每次更新GDAL的版本后都会发现这个文件夹中会多出几个文件夹,同时GDAL也会中支持的文件格式中多出来几个新的文件格式。没错,这个文件夹存放的就是GDAL针对每种不同的特定的图像格式解析的源代码,可以举几个简单的例子,比如bmp文件夹就是解析BMP图像的,hfa文件夹就是用来解析Erdas的img图像格式,raw文件夹用来读取ENVI的hdr文件,还有pcidsk文件夹就是读取PCI的pix格式的等等。所以这个文件夹存放的是解析各个文件格式的源代码。

7、gcore文件夹:通过名字大家也应该知道这个文件夹是做什么的了,叫core的肯定都是很核心的东西了,这个文件夹就是GDAL的灵魂所在,主要存放的GDAL抽象类的数据集,波段,图像读写接口等都在这个里面实现的。如果要知道GDAL的抽象类是怎么对图像格式进行抽象的,可以看看这个里面的代码。

8、html文件夹:html文件夹如果使用压缩包的话,里面应该是空的,这个文件夹主要是用来存放GDAL的生成的帮助文档的地方,主要是使用前面介绍的doc文件夹中的dox脚本,使用doxygen工具生成的GDAL帮助文档会出现在这个文件夹中。后面会和doc文件夹一起进行一个详细介绍。

9、m4文件夹:m4文件夹存放的有好几个已m4为后缀名的文件,m4文件叫MacroProcessor Library,m4文件是编译基础中最核心的文件,这个文件主要是用autoconf来产生configure配置文件,继而自动生成Makefile文件。这个文件夹中Windows平台下貌似没什么作用,可能是我还不知道吧,在此略过。

10、man文件夹:man文件夹貌似是用来生成linux或者其他平台下的帮助文件,估计是可以使用linux下的man帮助吧。Windows平台下貌似也没什么用,略过。

11、ogr文件夹:用过GDAL的肯定知道ogr库吧,在很久很久以前,GDAL和OGR是两个库,GDAL专门负责读取栅格数据,OGR库负责读取矢量数据,然后可能是因为两个库分开有些不方便,比如GDAL的算法库中经常会用到矢量数据的读取,或者还有别的原因吧,现在将这两个库整合在了一起,目前OGR库就是GDAL库的一个子集。其实OGR库还是可以单独编译出来的。Ogr文件夹就是存放OGR库源代码的文件夹。这个文件夹里面也是有很多东西的,后面再详细进行介绍。

12、port文件夹:port文件夹中存放的是port库的东西,port库对于GDAL库来说是一个底层的支持库,port库中定义了一些字符串的操作,文件处理,网页请求,数据库连接,哈希表,字符加密文件压缩等基础的函数。比如GDAL中所有的导出函数符号CPL_DLL就是在这个port文件夹中定义的,还有frmts文件夹中,打开文件,打开数据库,打开网络路径等都是用的port库,以及字符串的处理等。

13、swig文件夹:swig文件夹主要是存放swig的脚本。Swig全称叫SimplifiedWrapper and Interface Generator,网址是www.swig.org,          swig的作用就是可以将C/C++写的库封装为Python,C#,Java,Perl和 Ruby等其他语言的访问接口。网上GDAL的C#版本就是使用swig来编译出来实现的,很强大吧。后面有时间的话,会写一篇关于swig编译GDAL的文章。

14、vb6文件夹:这个文件夹中用来将GDAL编译成一个VB6的模块,对于里面具体的文件说明,以及如何编译参考文件夹中的readme.txt,由于我对VB6的使用,还是仅限于拖个按钮,写个单击事件的基础,对于模块之间的调用,实在是不太懂,所在就不说明了。想用VB6使用GDAL的可以自己研究一下,应该也不是很难。

15、wince文件夹:顾名思义,这个文件夹中的东西就是用来编译Windows CE平台下的GDAL库用的,具体编译请参考其中的说明文档。

文件夹介绍完了,下面对文件进行一个大概说明:

1、aclocal.m4:同上面的m4文件夹

2、autogen.sh:Linux平台下的shell文件,用来调用autoconf来产生configure配置文件的。

3、COMMITERS:该文件中的内容是GDAL开发人员的信息,姓名,联系邮箱以及各自负责开发的模块说明等。

4、config.guess,config.sub,configure,configure.in:这四个文件貌似都是linux平台下的配置文件,中Windows下没啥用,略过。

5、Doxyfile:Doxyfile就是前面doc文件夹中说明提到的doxygen的工程文件,用来生成帮助文档用的,后面在介绍doxygen的使用是会对该文件进行一个说明。

6、GDALmake.opt.in:这个文件是linux平台下的GDAL库编译配置文件,功能在后面的nmake.opt中介绍。

7、gdalnightlysvn.sh:Linux平台下调用svn获取GDAL源代码的一个shell脚本。

8、GNUmakefile:GNU的make文件。

9、HOWTO-RELEASE:GDAL发布版本的一些说明。

10、    install-sh:GDAL的安装shell脚本,Linux平台下。

11、    LICENSE.TXT:GDAL的许可说明文件。

12、    ltmain.sh:libtool的shell脚本,Linux平台下,Windows下貌似没用到。

13、    makefile.vc:GDAL的编译文件,用来将源代码编译成dll文件,后面会在GDAL编译中作一个介绍。

14、    makegdal_gen.bat:用来生成VS的工程文件的一个批处理文件,后面在GDAL编译中会对该文件的使用方式做一个说明。

15、    makegdal10.sln:文件夹中所有的sln文件都是VS的项目文件,文件名后的数字代表的是VS的版本号。

16、    makegdal10.vcxproj和makegdal71.vcproj:VS的工程文件,该文件可以由makegdal_gen.bat文件自动生成,后面详细介绍。

17、    mkbindist.sh,mkgdaldist.sh和mktestdist.sh:三个shell脚本文件,Windows下没用,略过。

18、    NEWS:GDAL的新增功能,以及修复的bug记录等。

19、    nmake.opt:GDAL编译选项配置文件,在编译GDAL中,可以指定GDAL绑定的其他库等都在这个里面进行设置。在后面的GDAL编译中会详细介绍说明。

20、    nmake-wince.opt:编译wince版本的编译选项配置文件。

21、    PROVENANCE.TXT:GDAL目录说明文件,如果上面说明的不够清楚,可以参考这个文件。

22、    submake.bat:一个编译的批处理文件,目前没啥用。

23、    svnkeywords.sh:又是svn的一个shell脚本。

24、    VERSION:GDAL版本信息。

以上是关于GDAL源码剖析(转载)的主要内容,如果未能解决你的问题,请参考以下文章

转:Java集合源码剖析LinkedList源码剖析

转:Java集合源码剖析HashMap源码剖析

转:Java集合源码剖析ArrayList源码剖析

转:Java集合源码剖析Hashtable源码剖析

转:Java集合源码剖析Vector源码剖析

Spring源码剖析依赖注入实现