OGR 门 入
陈 泰 生
2008.8
1
前 言
OGR 是一个读取和处理 GIS 矢量数据的开源代码库。它可以读取和处理多种流行的矢
量数据(如 ESRI 的 Shapefile、S-57、SDTS、PostGIS、Oracle Spatial、以及 Mapinfo 的 mid/mif
和 TAB 格式),本文将讲解 OGR 库的安装、OGR 的数据模型以及主要类的函数功能,最后
将通过几个实例具体的讲述如何调用 OGR 的函数来满足我们的需求。
作者简介:陈泰生,男,江苏姜堰人,南京师范大学虚拟地理环
境教育部重点实验室 GIS 博士研究生,ts_chen@yahoo.cn
3
1 OGR库安装
OGR 是 GDAL 的配套库,它是 GDAL 库的一个部分,只要你安装了 GDAL 库,就
已经拥有了 OGR 库。
1.1 Windows下的安装
官方安装文档在这里。下面是我自己的实践步骤:
① 先去 http://www.gdal.org/dl/下一个版本,解压。打开控制台,输入:“C:\Program
Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat" 注册 VC 的编译环境。
② 打开 gdal 文件夹下的 nmake.opt 修改 GDAL_HOME = "C:\warmerda\bld"把路径改到
需要把 gdal 安装的地方。不改也可以。这里需要添加 python 支持,所以修改 PY_INST_DIR
= $(GDAL_HOME)\pymod 把路径改成 python 下的 Lib\site-packages 文件夹下。PYDIR =
"C:\Software\Python24" 改成 python 的安装路径。下面的参数想改什么就把前面的#删除(要
看您有没有那些库的源码),注意一下路径就可以了。后面就依次运行。
nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
③ 去 GDAL_HOME 目录下的 bin 文件夹下把 gdal14.dll 拷贝到 PY_INST_DIR 路径下,
这样就完成安装 gdal(python)的工作。
最后需要注意一下,gdal 在 vc++.net2005 下只能顺利编译 1.2,1.3 系列的版本不能顺
利编译,有一个地方指针转换出错。可能是 2005 的编译器比以往的严厉一点吧。但是
vc++.net2005 却可以正常编译 1.4 版本,不过要支持 Python,需要改一个地方:打开 Pymod
目录下的 makefile.vc,然后找到 link 这两行:
link /dll /def:_gdal.def $(OBJ) ../gdal_i.lib /LIBPATH(PYDIR)/libs \
/out(PYGDAL_DLL)
然后在下面添加一行:
If
$(PYGDAL_DLL).manifest mt
exist
-manifest
$(PYGDAL_DLL).manifest
-outputresource:$(PYGDAL_DLL);2
如果不加这行,会出现一个“找不到 MSVCR80.DLL”的错误,这个错误是由于
VS.net2005 强制进行 manifest 验证造成的。而且这个 manifest 的问题相当棘手,对发布也有
极坏的影响。另外,安装了 QGIS,对编译也有一些影响,主要是 proj 库的冲突,导致一个找
不到"d:/program.obj"文件的错误,如果你有静态编译过 proj,那么你可以打开 nmake.opt 修
改有关 proj 的设置,如果搞不定,就卸载 QGIS,然后编译,编译后再安装 QGIS。
5
1.2 Linux下的安装
Linux 下的安装比较简单,只要依次运行下面几步即可。
cd gdal
./configure
make
su
make install
exit
第一步需要看是否依赖的库都安装了。如果缺少,就去安装一个。如果对 configure 的
条件不理解,可以用./configure—help 查看帮助。
1.3 GEOS辅助库的安装
GEOS(Geometry Engine, Open Source)是一个集合形状的拓扑关系操作实用库,简单
的说,即判断两个几何形状之间关系和对两个几何形状进行操作以形成新的几何形状的库。
1.3.1 GEOS库的安装
GEOS开源库在Linux上面安装比较简单,可以参照其官方文档,所以此处将只介绍它在
Windows下面的安装方法,将其分为以下几步。
① 去 GEOS 的官方网站上下载 geos 的 geos-3.0.0 版,解压,假设解压路径下面都表
示为$GEOSHOME。
② 打开控制台,输入:“C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"
注册 VC 的编译环境。值得注意的是:GEOS 库不支持 VC6.0 编译。
③ 进入$GEOSHOME\source,运行 nmake /f makefile.vc,若成功编译,恭喜!geos 的
C++版已经可以用,您可以自由的使用 GEOS 的动态库了!如果失败,不要气馁,切忌急
躁,仔细查看控制台上的出错原因。下面将本人所遇到的几个问题罗列出来,以供大家参考。
⒈ 缺少dirlist.mk文件。您可以到GEOS的SVN网站上查看该文件的内容,然后新建它,
将网上的该文件内容拷贝其中,并放在对应的路径下。
2.无法找到 version.h.vc 文件。可以将下载的 GEOS3.0.0 压缩包中的 version.h 文件改
为后缀是 vc 的 version.h.vc 文件,platform.h.vc 同理。
3.无法找到AssertionFailedException.cpp文件。同样可以到GEOS的SVN网站上查看该
CPP文件的代码,然后新建一个文本文件,将代码拷贝其中,再把该文本文件的名称及文件
类型改为AssertionFailedException.cpp即可。值得注意的是,新建的文件需要在正确的路径
6
中,其路径可以在控制台的该出错信息上得知。类似情况同理,在此不再累赘。
④ 进 入 $GEOSHOME\swig\python 目 录 , 运 行 swig -c++ -python -modern -o
geos_wrap.cxx ../geos.i (注意,这里的前提是你有 swig,没有去下一个 swig for windows,然
后把 swig.exe 所在目录加入 path 环境变量。打开 setup.py,去掉有 stdc++.lib 的那行,然后
把 libgeos.a 改成 geos.lib,运行 python setup.py build,运行 python setup.py install。
至此,GEOS 的安装已经完成。
1.3.2 让GEOS作为OGR的辅助支持
在 OGR 中添加 GEOS 支持比较简单,可以用到 GEOS 的功能,先参考上面的步骤编译
出 geos.lib 静态库。然后打开 gdal 主目录下的 nmake.opt 修改:
GEOS_CFLAGS = -IC:/warmerda/geos-3.0.0/source/headers -DHAVE_GEOS
GEOS_LIB = C:/warmerda/geos-3.0.0/source/geos.lib
这两行,把前面的“#”号去掉,然后把两个路径修改成 geos 下对应的目录。注意:第一
个需要修改的是从-I 开始到-D 结束,写得是 GEOS 头文件所在的 headers 目录,而且-D 前
面有空格。第二个是从=开始,到行末,写的是 geos.lib 所处路径。然后重新编译 gdal 库。
如果出现一些链接错误(LINK 问题),可以执行 nmake /f makefile.vc clean 命令清除之
前编译生成的文件,再重新编译。若是 geos.pdb 文件出问题,则将它删除再重编。如果成
功再 nmake /f makefile.vc install 安装后就可以用 GEOS 支持了。其实 geos 支持本来就应该
在编译 gdal 时直接添加了。
2 OGR库数据模型
OGR数据模型是基于OpenGIS的标准来设立的,相关的接口规范请参考OGC的官方网站
。纵观OGR的类结构,它主要的类如下面所示。
Geometry
SpatialReference
Feature
FeatureDefn
Layer
DataSource
Driver
2.1 Geometry介绍
Geometry 指的是几何形状,这个类中包含矢量数据模型(由 OGC 相关标准定义)、相
关的几何操作以及数据的导入、导出(wkb/wkt 形式)等函数。值得注意的是 Geometry 同
7
时包含空间参考系统(投影)信息。其类的继承图如下所示:
图 2.1 Geometry 的类结构图
由图 2.1 所示的类结果图可知,所有 Geometry 类均是由 OGRGeometry 继承而来,
OGRGeometry 中定义了一些支持所有 Geometry 形状的公共操作。Geometry 的类型包括点
(OGRPoint)、线(OGRLineString)、多边形(OGRPolygon)、几何形状集合(OGRGeometryCol-
-lection)、点集(OGRMultiPoint)、线集(OGRMultiLineString)以及多边形集(OGRMulti-
-Polygon)。
2.1.1 几何形状基类
2.1.1.1 OGRGeometry
OGRGeometry 是几何形状的基类,所有的几何形状,如点、线、面均是由该类继承而
来。该类中包含了一些空间分析的虚函数。主要函数及其功能如下:
getDimension 函数:获取几何对象的维数,如点为 0,线为 1,面为 2。
getCoordinateDimension 函数:获取几何对象的坐标维数,如二维与三维。
IsEmpty 函数:判断几何对象是否为空。
IsSimple 函数:判断几何对象是否为简单几何形状。
empty 函数:清空几何对象中的数据。
clone 函数:复制几何对象。
getEnvelope 函数:获取几何对象的外包矩形。
WkbSize 函数:获取用 wkb 格式来表达几何对象数据时所需的字节数大小。
importFromWkb 函数:由 wkb 格式导入几何对象的数据。
exportToWkb 函数:将几何对象的数据导出为 wkb 格式。
importFromWkt 函数:由 wkt 格式导入几何对象的数据。
exportToWkt 函数:将几何对象的数据导出为 wkt 格式。
getGeometryType 函数:获取几何对象的类型。返回的是几何类型的编码。
getGeometryName 函数:获取几何对象类型的名称,该名称由 wkt 格式定义。
8