开源GIS工程:GDAL深度剖析
目录
一、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版本信息。
一、简单的编译
1、使用VisualStudio IDE编译
首先进入GDAL的源代码目录,可以看到有几个sln为后缀的文件名,比如makegdal10.sln,makegdal80.sln,makegdal71.sln,makegdal90.sln 。这些文件是VisualStudio的工程文件,后面的数字对应的VS的版本号,71表示的VS2003,80表示VS2005,90表示VS2008,还有10表示VS2010等。根据自己电脑安装的VS版本,打开对应的文件,如下图所示(使用VS2008SP1版本,打开makegdal90.sln文件):
图3 VS2008打开编译GDAL1.8.1
然后在左侧解决方案右键,弹出菜单中选择“生成”或者“重新生成”命令,然后GDAL就会开始编译,等待输出窗口中提示,执行完成,生成成功等信息后,就表示GDAL已经完成编译。同时会在GDAL的源代码目录中会出现gdal.lib,gdal_i.lib,gdal18.dll等文件,如果你没有修改GDAL中的nmake.opt文件的话,那么同时会在你的C盘中会出现一个叫“C:\warmerda\bld”的文件夹,里面会包含三个文件夹,分别是bin,data和html。其中bin文件夹中存放的是编译出来的GDAL的可执行程序,包括GDAL提供的十几个工具集;data文件夹就是在第一节中的介绍的data文件夹;html文件夹中存放的是各种数据格式的说明文档。
2、使用cmd命令行编译
使用cmd命令行编译,首先在“开始菜单\所有程序\Microsoft Visual Studio 2008\Visual Studio Tools\ Visual Studio 2008命令提示”,点击“Visual Studio 2008 命令提示”会弹出下面的界面:
然后使用cd命令,切换到GDAL的源代码目录,如下图所示:
切换到GDAL的源代码目录后,依次敲入下面的命令行后回车,等待编译结束即可。
nmake -f makefile.vc
nmake -f makefile.vc install
nmake -f makefile.vc devinstall
同时还有其他的命令,如:
nmake -f makefile.vc clean
nmake -f makefile.vc MSVC_VER=1400clean
nmake -f makefile.vc MSVC_VER=1400DEBUG=1
上面六行的命令含义依次是:
编译GDAL库
编译GDAL库,并安装(这里安装的意思就是将生成的dll,exe等文件拷贝到C:\warmerda\bld目录),
编译GDAL库,并安装开发者模式(安装的意思同上,开发者模式意思是将开发用的include文件夹中的头文件和lib文件一同拷贝到C:\warmerda\bld目录,此时会在C:\warmerda\bld目录中多出来两个文件夹,分别是include和lib,分别存放的是GDAL的头文件和lib文件,用于调用GDAL库使用)。
清理GDAL库,同时会删除编译GDAL库所生成的临时文件,作用相当于在VS环境中的清理命令。
作用同上,但是添加了一个MSVC_VER=1400,表示使用VS2005编译。
编译GDAL库的debug模式,可以用来调试GDAL源码。
二、自定义编译
GDAL的强大之处不单单在于可以读取栅格和矢量数据,同时它的强大之处还在于下面几个方面,第一可以进行矢量图形之间的一些常用操作,比如:求交,求并,缓冲区等等。第二可以进行投影和坐标转换。如果使用GDAL默认的编译方式,那么上述的两个非常强大的功能您将不能使用,因为GDAL这两大功能是基于另外的两个开源库GEOS(Geometry Engine, Open Source)库和PROJ4库来实现的。下面对这两大库分别做一个简单的说明,以及如何修改编译文件,让GDAL能够拥有这两大功能。
1、集成GEOS
关于GEOS库的说明,网上有很多,同时在GEOS的官网http://geos.osgeo.org有详细的说明,简单的来说,GEOS提供了OGC规范中简单几何要素对象操作的C++语言的实现。在地理信息系统领域,拓扑模型是重要的,其计算方法简单但是很难得以实现。使得GEOS不同于其他项目的也正是“空间谓词”与“空间操作”。空间谓词是比较两个空间对象并返回一个布尔变量值作为结果,它表明了存在于两个空间对象之间特殊的关系。比如典型的空间谓词有Contains(), Intersects(), Touches(), andCrosses()函数等。GEOS项目中对该些函数的实现是异常强壮的,即使是奇异几何对象或是临时的坐标系统运算也不能使其运算不正常或计算错误。目前绝大多数的商业软件仍然在最基础的空间谓词处理上相对成熟,这正是GEOS项目的重要意义。“空间操作”则主要是对两个几何对象进行计算并且返回一个新的几何实体。比较典型的操作函数如Difference(), Union()以及Buffer()等。GEOS中的操作算法已经被广泛的经过了测试。GEOS类库被各类开源空间信息软件项目广泛应用,使用GEOS,它们可以基于最新的规范的几何实体来完成,同时也拥有了复杂空间方法的实现。
关于GEOS的说明和编译,后面会单独写一篇文件进行介绍,这里假设已经下载的是编译好的GEOS库。
首先使用记事本或者其他的文本编辑器打开GDAL源代码目录下的nmake.opt文件,找到“# Uncomment for GEOS support”这句,大概在405行左右,将下面三行代码:
#GEOS_DIR=C:/warmerda/geos
#GEOS_CFLAGS =-I$(GEOS_DIR)/capi -I$(GEOS_DIR)/source/headers -DHAVE_GEOS
#GEOS_LIB =$(GEOS_DIR)/source/geos_c_i.lib
修改为:
GEOS_DIR=F:\Work\3rdPart\geos-3.2.2
GEOS_CFLAGS =-I$(GEOS_DIR)/capi -I$(GEOS_DIR)/source/headers -DHAVE_GEOS
GEOS_LIB = $(GEOS_DIR)/source/geos_c_i.lib
其中F:\Work\3rdPart\geos-3.2.2是我本机的GEOS存放的主目录,后面两行设置的是GEOS的头文件目录和lib文件路径。设置好后保存即可。对比结果如下图如下:
保存完nmake.opt之后,按照第一步中的编译方式进行编译即可。编译后的GDAL就将会支持图形之间的操作等处理。函数主要是在OGR库中,后面会在OGR库中进行详细的介绍说明。编译后,千万别忘记将geos_c.dll文件拷贝到gdal18.dll的同级目录下,否则会提示你找不到geos_c.dll文件。
2、集成Proj4
Proj4是一套开源的坐标投影转换类库,它可以完成在两套不同制图投影系统之间的转换,同样不同的椭球体或大地基准面之间也可以成功的完成转换。GDAL中用到的坐标转换,投影转换,几何纠正,正射纠正等算法,都离不开坐标转换,也就是说要使用这些算法,必须有proj4库的支持才行。同GEOS库的配置方法,在nmake.opt文件中,找到proj4库的位置,大概在352行左右。将下面的三行代码:
#PROJ_FLAGS =-DPROJ_STATIC
#PROJ_INCLUDE =-Id:\projects\proj.4\src
#PROJ_LIBRARY =d:\projects\proj.4\src\proj_i.lib
修改为:
#PROJ_FLAGS =-DPROJ_STATIC
PROJ_INCLUDE =-IF:\Work\3rdPart\proj-4.7.0\src
PROJ_LIBRARY =F:\Work\3rdPart\proj-4.7.0\src\proj_i.lib
其中第一行表示是否使用静态链接的方式,第二行的路径表示,proj库存放的位置,第三行为proj库的lib文件所在路径。修改后保存即可,对比结果如下图如下:
同GEOS库一样,保存完nmake.opt之后,按照第一步中的编译方式进行编译即可。对于Proj库的使用后面会在有一篇文章对其做一个简单的介绍说明。编译后,同样千万别忘记将proj.dll文件拷贝到gdal18.dll的同级目录下,否则会提示你找不到proj.dll文件。
3、集成HDF数据读取
通过上面GEOS和PROJ库的介绍,相信对gdal的配置文件,nmake.opt有一个比较初步的了解了吧,那么下面对于使用GDAL支持hdf数据的读取也是同样,先下载好hdf4和hdf5的库,我用的是HDF4.2.6和HDF5-1.8.7两个库,在hdf的官方网上有编译好的库,直接下载编译好的库即可,对于hdf库的编译,我没有进行编译过,应该和其他的开源库都是差不多吧。同时官网提供了32位的库和64位的库,这里都是按照32位的库进行介绍,后面会有一个gdal的64位库的编译介绍。
将下载好的HDF4.2.6和HDF5-1.8.7两个库解压,然后修改nmake.opt文件中的278行左右,代码如下:
# Uncomment thefollowing and update to enable NCSA HDF Release 4 support.
#HDF4_PLUGIN = NO
#HDF4_DIR = D:\warmerda\HDF41r5
#HDF4_LIB = /LIBPATH:$(HDF4_DIR)\lib Ws2_32.lib
# Uncomment thefollowing and update to enable NCSA HDF Release 5 support.
#HDF5_PLUGIN = NO
#HDF5_DIR = c:\warmerda\supportlibs\hdf5\5-164-win
#HDF5_LIB = $(HDF5_DIR)\dll\hdf5dll.lib
修改为下面的代码:
# Uncomment thefollowing and update to enable NCSA HDF Release 4 support.
HDF4_PLUGIN = NO
HDF4_DIR = F:\Work\3rdPart\HDF4.2.6_win_x86
HDF4_LIB = $(HDF4_DIR)\dll\hd426m.lib$(HDF4_DIR)\dll\hm426m.lib \
$(HDF4_DIR)\lib\hd426.lib$(HDF4_DIR)\lib\hm426.lib Ws2_32.lib
# Uncomment thefollowing and update to enable NCSA HDF Release 5 support.
HDF5_PLUGIN = NO
HDF5_DIR = F:\Work\3rdPart\HDF5-1.8.7_win_x86
HDF5_LIB = $(HDF5_DIR)\dll\hdf5dll.lib
对比代码如下图:
保存,然后编译gdal即可,同时将hdf库中的dll文件夹下的dll文件拷贝到gdal18.dll的同级目录下。
三、其他方面
1、makegdal_gen.bat使用
对于makegdal_gen.bat的作用,在上一篇文章中已经进行了介绍,下面对怎么使用该文件生成VS的工程文件做一个说明。
首先打开cmd命令行窗口,使用cd命令切换到GDAL源代码目录,然后输入makegdal_gen.bat回车,会得到该工具的一个简单实用帮助,如下图所示:
该工具的使用方法是带有命令行参数的一个批处理工具,(在后面对GDAL工具集的介绍中会对带有参数的命令行程序,以及编写带有命令行的程序有一个比较详细的说明)。通过上图可以看出该工具的基本语法是:
makegdal_gen 7.10 >makegdal71.vcproj
makegdal_gen 8.00 >makegdal80.vcproj
通过上面的示例可以看出,该工具的命令行参数分别是,首先是VS的版本号,具体版本号参考本文第一小节,然后跟一个大于号“>”,最后是输出的VS的工程的名字。那么现在我要使用该命令行生成一个VS2008版本的工程文件,我可以输入下面的命令,然后回车即可:
makegdal_gen 9.00 >makegdal90.vcproj
2、编译64位系统下的GDAL
对于GDAL的64位系统的编译,基本和32位系统的编译一样,首先在VS的工程中,打开配置管理器,然后再活动解决方案平台的下拉列表中选择新建,然后弹出,新建解决方案平台对话框,选择新平台为x64(需要在安装VS的时候安装64位的编译环境),然后点击确定即可。最后在VS中选择X64进行编译即可。如下图所示:
对于使用cmd命令行编译,基本同本文开始,不一样的只有,在开始菜单选择的不是“Visual Studio 2008 命令提示”而是“Visual Studio 2008 x64 兼容工具命令提示”,剩下的编译步骤跟前面的一样。
在编译开始之前,还需要打开nmake.opt文件,找到131行处的“#WIN64=YES”,将前面的“#”去掉,保存,然后开始编译。如果就这样编译过去的话,那么恭喜你,如果不能顺利编译过去的,那么需要按照下面的步骤进行一点点设置。
1:在GDAL目录下的nmake.opt文件中,找到SYM_PREFIX的定义,应该在438行左右
将SYM_PREFIX=_ 改为SYM_PREFIX= 就是将最后的下划线去掉
2:在GDAL目录下的makefile.vc文件中,找到46行左右的代码,如下:
BASE_INCLUDE =/INCLUDE:_GDALSimpleImageWarp@36 \
/INCLUDE:_GDALReprojectImage@48 \
/INCLUDE:_GDALComputeMedianCutPCT@32 \
/INCLUDE:_GDALDitherRGB2PCT@28 \
/INCLUDE:_OCTNewCoordinateTransformation@8$(VB6_SAFEARRAYSYM)
修改为:
BASE_INCLUDE =/INCLUDE:$(SYM_PREFIX)GDALSimpleImageWarp \
/INCLUDE:$(SYM_PREFIX)GDALReprojectImage \
/INCLUDE:$(SYM_PREFIX)GDALComputeMedianCutPCT\
/INCLUDE:$(SYM_PREFIX)GDALDitherRGB2PCT \
/INCLUDE:$(SYM_PREFIX)OCTNewCoordinateTransformation $(VB6_SAFEARRAYSYM)
就是将后面的@开始,后面的数字删除。现在开始编译吧。
一、Swig编译
1、Swig介绍
SWIG全称是Simplified Wrapper and Interface Generator,官方网站:http://www.swig.org/。SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中也包括非脚本编译语言,例如C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。SWIG还能够导出XML或Lisp s-expressions格式的解析树。SWIG可以被自由使用,发布,修改用于商业或非商业中。[摘自SWIG官网http://www.swig.org/translations/chinese/index.html]。
下载安装Swig的时候注意下载Swigwin(我下的是swigwin-2.0.4.zip),不要下载源代码,否则不能在windwos下用。下载后解压,将swigwin-2.0.4的解压目录也添加到环境变量Path中去,否则会出现一些些该配置文件的麻烦。检验swig是否成功设置到环境变量Path中的最简单的方式就是在运行中输入swig后回车,如果提示windows找不到swig,那么说明没有设置成功;如果出现一个黑屏一闪而过,那么说明你设置成功了。
2、编译C#版本GDAL
首先,打开nmake.opt文件,找到SWIG=swig.exe这一句,假如没有将swig的目录添加到环境变量中,那么将这句后面的swig.exe修改为swig.exe的全路径,如F:\Work\3rdPart\swigwin-2.0.4\swig.exe。如果设置了环境变量,那么就不需要进行修改了。
然后按照第二篇中的使用cmd命令编译GDAL的方式来进行编译,打开“Visual Studio 2008命令提示”并定位到GDAL源代码目录,然后依次执行下面三行命令:
[python] view plaincopyprint?
- nmake /f makefile.vc
- nmake /f makefile.vc install
- nmake /f makefile.vc devinstall
执行完之后会在GDAL_HOME的目录下生成编译好的dll和exe文件以及include、lib等文件夹。接下来,使用cd命令,进入swig\csharp文件夹中:
[python] view plaincopyprint?
- cd swig\csharp
- #nmake /f makefile.vc interface #这句话暂时不需要
- nmake /f makefile.vc
- nmake /f makefile.vc install
执行完上面两句后,会在csharp文件夹下生成8个dll文件,并将这8个dll文件拷贝到GDAL输出目录下的csharp文件夹中。然后就可以在C#工程中引用这几个dll了,需要注意的是,在使用这几个dll的时候需要将gdal18.dll以及其依赖的其他dll都要拷贝到同一个目录中才能正常运行。
3、编译Java版本GDAL
首先需要JDK环境,没有的可以下载安装一个。然后打开nmake.opt文件,找到大概86行左右的位置:
[python] view plaincopyprint?
- JAVA_HOME = C:\Program Files\Java\jdk1.6.0_26
将后面的路径修改为JDK的目录后保存。在打开的命令行中使用cd命令定位到swig目录后,输入下面的命令即可:
[python] view plaincopyprint?
- nmake /f makefile.vc java
4、编译Python版本GDAL
首先在编译Python版本之前,确保自己的电脑中安装了Python,相信大家都装ArcGIS了吧,那么恭喜你,你不用安装Python了,因为在安装ArcGIS的时候必须要安装Python的,同样,将Python的bin目录添加到环境变量Path中去。确保这步完成之后,接下来就是编译Python版本的GDAL。
打开nmake.opt文件,找到大概76行左右的:
[python] view plaincopyprint?
- PYDIR = “C:\Python26”
将后面的路径修改为Python的安装路径后保存。使用cd命令将命令行定位到swig\python目录后,依次输入:
[python] view plaincopyprint?
- python setup.py build
- python setup.py install
执行完上述命令后,会在python的site-packages目录看到多了gdal和ogr的文件以及一个osgeo的文件夹。我本机的目录是C:\Python26\Lib\site-packages。然后将编译出来的gdal18.dll以及它依赖的所有的dll都拷贝到site-packages文件夹中的osgeo文件夹中,最后就可以在Python中使用imort gdal来使用GDAL了。测试Python版本的gdal是否安装成功,可以使用下面命令:
[python] view plaincopyprint?
- from osgeo import gdal
- from osgeo.gdalconst import *
- dataset=gdal.Open(“F:\Work\Data\envi.img”,GA_ReadOnly)
- dataset.GetDriver().ShortName
- #’ENVI’ #图像格式
- dataset.GetProjectionRef()
- #’PROJCS[“unnamed”,GEOGCS[“NAD83”,DATUM[“North_American_Datum_1983”,SPHEROID[“GRS 1980”,6378137,298.257222101,AUTHORITY[“EPSG”,”7019″]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[“EPSG”,”6269″]],PRIMEM[“Greenwich”,0,AUTHORITY[“EPSG”,”8901″]],UNIT[“degree”,0.0174532925199433,AUTHORITY[“EPSG”,”9108″]],AUTHORITY[“EPSG”,”4269″]],PROJECTION[“Transverse_Mercator”],PARAMETER[“latitude_of_origin”,30],PARAMETER[“central_meridian”,-84.16666666666667],PARAMETER[“scale_factor”,0.9999],PARAMETER[“false_easting”,2296587.926509186],PARAMETER[“false_northing”,0],UNIT[“Foot (International)”,0.3048]]’ #图像投影信息
注意,上面命令中开头为#号的表示的是Python输出的。如果能输出上面的信息,那么GDAL for Python就安装成功了。
二、开发帮助文档生成
1、Doxygen介绍
以下内容摘自维基百科,地址http://zh.wikipedia.org/wiki/Doxygen。
Doxygen 是一个 C++, C, Java, Objective-C、Python、IDL (CORBA 和 Microsoft flavors)、Fortran、VHDL、PHP、C#和D语言的文档生成器。可以运行在大多数类Unix系统,以及Mac OS X操作系统和Microsoft Windows 。 初始版本的Doxygen借鉴了一些老版本DOC++的代码;随后,Doxygen源代码由Dimitri van Heesch重写。
Doxygen是一个编写软件参考文档的工具。 该文档是直接写在代码中,因此比较容易保持更新。 Doxygen 可以交叉引用文档和代码,使文件的读者可以很容易地引用实际的代码。
KDE 使用Doxygen作为其部分文档且 KDevelop 具有内置的支持。 Doxygen的发布遵守GNU General Public License,并且是自由软件。
需要注意的是在使用doxygen的时候,会自动生成一些类图,以及函数调用关系图,如果要生成这些图,还需要另外一个很牛叉的开源库Graphviz。Graphviz (Graph Visualization Software的缩写)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。它也提供了供其它软件使用的库。Graphviz是一个自由软件,其授权为Common Public License。其Mac版本曾经获得2004年的苹果设计奖。更多关于Graphviz的介绍参考其官方网站:http://www.graphviz.org/。
2、生成GDAL开发帮助文档
首先下载安装Doxygen和Graphviz,安装完之后最好将Doxygen和Graphviz的bin目录添加到系统环境变量Path中去。负责要设置一些参数,比较麻烦,还是放到Path中方便。
安装完Doxygen后,会在开始菜单中有个doxywizard.exe的程序,打开,然后在File->Open…菜单中选择GDAL源代码目录下的Doxyfile文件,然后,切换到Run标签,点击Run Doxygen按钮,接下来就会自动提取源代码中的注释生成一份gdal的帮助文档,默认的输出目录是GDAL目录下的html目录。等待生成结束后,点击左下角的Show Html Output后会打开生成的帮助文档。如下图:
再次,基本上GDAL的帮助文档生成完成,打开后会发现和GDAL的官方网站一模一样。但是还有个问题,这里只是生成的是GDAL的帮助文档,没有OGR的帮助文档,同样按照上面的步骤,打开GDAL目录下的OGR文件夹下的Doxyfile。然后点击生成,生成的目录默认为ogr文件夹下有个html文件夹,将该文件夹重命名为ogr,然后整个拷贝到上一层的html中,同时将GDAL目录中的doc文件夹中的文件除dox文件以外的文件全部拷贝到html文件夹中。
最后,还记得编译GDAL后生成的html文件夹吗?将这两个文件夹中的内容进行合并,然后你就得到了一份完完整整的GDAL的帮助文档。首页是html文件夹下的index.html。如下图:
3、Doxygen脚本配置以及代码注释书写规范
对于Doxygen的脚本配置,可以打开doxywizard后,在Wizard和Expert 标签中在每一项中,鼠标移动到上面,在左下角的试图区域会显示很详细的帮助信息(英文的,不是很难),这里有篇说明文档《 Doxygen配置使用指南》,http://read.pudn.com/downloads151/doc/653112/Doxygen_Using_Manual.pdf。文档中包含了所有的东西,很不错的东西。
转载请注明出处。GIS帝国网站报道中出现的商标及图像版权属于其合法持有人,只供传递信息之用,非商务用途。