GDAL/OGR C# FAO(不定期更新)

GDAL/OGR(以下简称GDAL)是用C++写成的读写、处理矢量、栅格数据的开源库,用起来十分方便。GDAL是用C++写成,对于像我一样使用C#作为开发语言的人来说还是略显高深,幸好GDAL/OGR发展到现在已经比较成熟,可以支持多种语言,有我们经常使用的C++,C#,也有Python, R等脚本语言。废话不多说,开这个帖子的目的是将自己在使用GDAL编程过程中遇到的问题整理到一块,好让大家在遇到同样的问题时能够免去耗时费力的搜寻。

 

一、安装使用篇

1. 我不想自己编译GDAL/OGR,有没有可以直接使用的GDAL/OGR库供引用?

很好,我们一样懒。自编译GDAL是一项费时的工作,而且自己编译出来的库在使用时会存在一些限制,不如用别人已经编译好的、功能完善的GDAL库。目前可供直接使用的GDAL C#引用库如下:

1)FWTools:包含了GDAL C#,另外还有Python, Proj4, Mapserver等多种开源GIS工具。

2)OSGeo:是最为全面的开源GIS工具集成体系,如果想一劳永逸的安装几乎所有开源GIS软件,那就装OSGeo吧。

3)定时更新发布的GDAL编译库http://vbkto.dyndns.org:1280/sdk/Default.aspx。

使用方法大家可能都了解:在VS工程中添加对4个为*_csharp.dll的引用,同时在系统环境变量Path中添加对 bin 文件夹(包含gdal.dll)的引用(否则会报初始化错误的问题)。我开始使用的是FWTools,很好很强大,但安装FWTools毕竟还是要占用70MB以上的空间,不便于程序部署,所以改用3)中所说定期发布的GDAL编译好的库,注意使用这个库仅按照前面所说的两条可能报错,我的解决方法是将Csharp文件夹中的所有文件拷贝到bin中,让环境变量Path找起来方便。对OSGeo的使用则主要是为了安装QGIS。

2. 我还是想自己从头编译GDAL C#库,应该怎么操作?

好吧,很有探索精神。这部分网上有很多贴专门论述,特转一个讲的比较全的。

准备一个C++编译器。建议使用Visual studio2005。

下载源代码:http://download.osgeo.org/gdal/gdal150.zip。

把gdal150.zip解压至“C:\gdal-1.5.0”,当然放在其它文件夹也可以。

修改源代码中的错误。源文件“C:\gdal-1.5.0\frmts\leveller\levellerdataset.cpp”的第171行的内容如下:

{ "?, kPI / 180.0, UNITLABEL_DEGREE },

在?号后面加上双引呈",改成如下形式:

{ "?", kPI / 180.0, UNITLABEL_DEGREE },

你可以使用任何一种文本文件的编辑工具来进行修改。

创建安装的目标文件夹“C:\gdal-runtime”,稍后的编译配置中,我们将配置GDAL把编译后将会安装到这个文件夹内。

修改编译配置文件夹“C:\gdal-1.5.0\nmake.opt”。以下是第41至第43行的内容:

!IFNDEF GDAL_HOME

GDAL_HOME = "C:\warmerda\bld"

!ENDIF

默认的情况下,GDAL将会安装到"C:\warmerda\bld"文件夹内,为了更好地了解安装过程,我们把第42行修改成如下内容:

GDAL_HOME = "C:\gdal-runtime"

编译源文件。使用“Visual Studio 2005 命令提示”工具来进行,(该工具位于“开始\程序\Microsoft Visual Studio 2005\Visual Studio Tools”内)。

打开“Visual Studio 2005 命令提示”工具,键入"cd C:\gdal-1.5.0",进入源文件所在的文件夹,再键入"nmake /f makefile.vc"执行编译。编译过程可能需要一些时间,主要取决于机器的性能。

如果没有第4步的修改,将会出现大量的编译错误,累积至100个后,VS2005将自动停止编译。

安装文件。

键入“nmake /f makefile.vc install”,执行完毕后,"C:\gdal-runtime"文件夹下增加了bin,data,及html文件夹。

键入“nmake /f makefile.vc devinstall”执行完毕后,"C:\gdal-runtime"文件夹下增加了lib,include文件夹。这两个文件夹主要用于C及C++的开发。

在"C:\gdal-runtime\bin"文件夹内已经生成了gdal15.dll文件,这是GDAL库的核心,不管采用何种开发方式,最终都由这个DLL文件来执行实质性的操作。

编译C#源文件。

键入“cd C:\gdal-1.5.0\swig\csharp”,进入C#源文件所在的文件夹。

键入“nmake /f makefile.vc”,编译完毕后生成8个DLL文件:gdal_csharp.dll、gdalconst_csharp.dll、ogr_csharp.dll、osr_csharp.dll和gdal_wrap.dll、gdalconst_wrap.dll、ogr_wrap.dll、osr_wrap.dll。前面4个文件名中都含有"csharp",用法与另外4个稍有不同,稍后详细讨论。

把8个DLL文件复制到安装文件夹"C:\gdal-runtime\bin"。

创建环境变量。

把路径C:\gdal-runtime\bin添加到系统变量Path,如果没有该变量,则应新建一个。如果你不能确定是否已经生效,可以在doc窗口内输入“echo %path%”,如果显示的内容中包含了"C:\gdal-runtime\bin",则表示修改已经生效。如果你还是无法确定,那就重启吧,这是最安全的方式。

在VS2005 CSharp项目中添加对GDAL的引用。新建一个CShapr应用程序项目,然后添加对C:\gdal-runtime\bin中4个含有"csharp"的DLL文件的引用。

这篇帖子虽然很详细,但还是漏了一条,就是在nmake.opt文件中对SWIG路径的修改,下载安装SWIG,修改SWIG = c:\dev\GDAL\gdal-1.5.0\swig.exe。

3. 自己编译的GDAL C#库存在什么问题么?

前面说过,我一直偷懒用别人编写的GDAL库,主要就是因为自己编译的GDAL有很多缺陷。我们都知道,GDAL具有很强大的功能,很重要的原因就是它集成了很多开源类库,而这些开源类库在下载的GDAL安装包中是没有的,如果需要这些功能,就需要下载这些开源软件包,并在GDAL编译的过程中加入对它们的引用,同时修改nmake.opt文件。例如,读写HDF4,HDF5文件格式的功能就需要在编译过程中集成对HDF读写库的引用。我在做课题的过程中为了加入对HDF文件格式的支持煞费心思,折腾了半天,加入了对HDF4的支持,HDF5的始终搞不定。但也有其它成功的例子,例如我成功加入了对Oracle GeoRaster的引用(1.6后的新功能)。自己编译的GDAL除了在可读写的文件格式上有缺陷外,在功能上也有不足。例如后面对矢量要素Geometry的关系运算就不支持,类似Disjoint,Intersect等都是不能操作的。说到底,还是用别人编译好的库吧,如果你的目的是为了应用GDAL解决实际问题,而不是去研究GDAL本身。

二、读写数据篇

1. OGR.SetSpatialFilter()月OGR.SetAttributeFilter

类似于ArcGIS的Select by Location和Select by Attribute两个功能。

三、数据处理篇

四、与其它库/程序交互篇

五、资源篇

你可能感兴趣的:(GDAL/OGR C# FAO(不定期更新))