【VC++开源代码栏目提醒】:本文主要为网学会员提供“OGR入门[1] - 技术总结”,希望对需要OGR入门[1] - 技术总结网友有所帮助,学习一下!
OGR门 入 陈 泰 生 2008.8 1 3前 言 OGR是一个读取和处理GIS矢量数据的
开源代码库。
它可以读取和处理多种流行的矢量数据如ESRI的Shapefile、S-57、SDTS、PostGIS、Oracle Spatial、以及Mapinfo的mid/mif和TAB格式本文将讲解OGR库的安装、OGR的数据模型以及主要类的函数功能最后将通过几个实例具体的讲述如何调用OGR的函数来满足我们的需求。
作者简介陈泰生男江苏姜堰人南京师范大学虚拟地理环境教育部重点实验室GIS博士研究生ts_chenyahoo.cn1 OGR库安装 OGR是GDAL的配套库它是GDAL库的一个部分只要你安装了GDAL库就已经拥有了OGR库。
1.1 Windows下的安装 官方安装
文档在这里。
下面是我自己的实践步骤 ① 先去http://www.gdal.org/dl/下一个版本解压。
打开控制台输入“C:Program FilesMicrosoft Visual Studio 8VCbinvcvars32.batquot 注册
VC的编译环境。
② 打开gdal文件夹下的nmake.opt修改GDAL_HOME quotC:warmerdabldquot把路径改到需要把gdal安装的地方。
不改也可以。
这里需要添加python支持所以修改PY_INST_DIR GDAL_HOMEpymod把路径改成python下的Libsite-packages文件夹下。
PYDIR quotC:SoftwarePython24quot 改成python的安装路径。
下面的参数想改什么就把前面的删除要看您有没有那些库的源码注意一下路径就可以了。
后面就依次运行。
nmake /f makefile.
vc nmake /f makefile.
vc install nmake /f makefile.
vc devinstall ③ 去GDAL_HOME目录下的bin文件夹下把gdal14.dll拷贝到PY_INST_DIR路径下这样就完成安装gdalpython的
工作。
最后需要注意一下gdal在
vc.net2005下只能顺利编译1.21.3系列的版本不能顺利编译有一个地方指针转换出错。
可能是2005的编译器比以往的严厉一点吧。
但是
vc.net2005却可以正常编译1.4版本不过要支持Python需要改一个地方打开Pymod目录下的makefile.
vc然后找到link这两行 link /dll /def:_gdal.def OBJ ../gdal_i.lib /LIBPATHPYDIR/libs /outPYGDAL_DLL 然后在下面添加一行 If exist PYGDAL_DLL.manifest mt -manifest PYGDAL_DLL.manifest -outputresource:PYGDAL_DLL2 如果不加这行会出现一个“找不到MSVCR80.DLL”的错误这个错误是由于VS.net2005强制进行manifest验证造成的。
而且这个manifest的问题相当棘手对发布也有极坏的影响。
另外安装了QGIS对编译也有一些影响主要是proj库的冲突导致一个找不到quotd:/program.objquot文件的错误如果你有静态编译过proj那么你可以打开nmake.opt修改有关proj的设置如果搞不定就卸载QGIS然后编译编译后再安装QGIS。
51.2 Linux下的安装 Linux下的安装比较简单只要依次运行下面几步即可。
cd gdal ./configure make su make install exit 第一步需要看是否依赖的库都安装了。
如果缺少就去安装一个。
如果对configure的条件不理解可以用./configure—help查看帮助。
1.3 GEOS辅助库的安装 GEOSGeometry Engine Open Source是一个集合形状的拓扑关系操作实用库简单的说即判断两个几何形状之间关系和对两个几何形状进行操作以形成新的几何形状的库。
1.3.1 GEOS库的安装 GEOS开源库在Linux上面安装比较简单可以参照其官方
文档所以此处将只介绍它在Windows下面的安装方法将其分为以下几步。
① 去GEOS的官方网站上下载geos的geos-3.0.0版解压假设解压路径下面都表示为GEOSHOME。
② 打开控制台输入“C:Program FilesMicrosoft Visual Studio 8VCbinvcvars32.batquot
注册VC的编译环境。
值得注意的是GEOS库不支持
VC6.0编译。
③ 进入GEOSHOMEsource运行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中其路径可以在控制台的该出错信息上得知。
类似情况同理在此不再累赘。
④ 进入GEOSHOMEswigpython目录运行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格式定义。
8dumpReadable函数未知。
flattenTo2D函数将几何对象转换为二维即将Z值均设为0。
exportToGML函数将几何对象数据导为GML格式。
exportToGEOS函数将几何对象转换为GEOS类型。
closeRings函数将几何对象—环强制闭合即首尾为同一个点。
setCoordinateDimension函数设置几何对象的坐标维数。
assignSpatialReference函数给几何对象分配一个空间坐标系。
getSpatialReference函数获取几何对象的空间坐标系。
transform函数对几何对象进行任意的坐标转换并不需要几何对象已经有空间坐标系。
transformTo函数将几何对象转换到新的坐标系当中需要几何对象已经有坐标系。
Intersects函数判断几何对象是否相交。
Equals函数判断几何对象是否相等。
Disjoint函数判断几何对象是否脱节。
Touches函数判断几何对象是否接触。
Crosses函数判断几何对象是否交叉。
Within函数判断是否内含即几何对象A的线是否在几何对象B内部。
Contains函数判断是否包含几何对象B的线是否都在几何对象A内部。
Overlaps函数判断几何对象是否重叠。
getBoundary函数获取几何对象的边界。
Distance函数获取几何对象间的距离。
ConvexHull函数凸壳分析获取几何对象的凸壳。
Buffer函数缓冲区分析获取几何对象的缓冲区第一个参数为缓冲区距离第二个参数为缓冲区的平滑度即生成的边界逼近真实缓冲区边界的程度可参考默认值。
Intersection函数交叉分析对两个几何对象求交。
Union函数联合分析对两个几何对象求并。
Difference函数差异分析。
SymmetricDifference函数对称差异分析。
该类中的空间分析函数均是使用另一个开源库中的函数其支持空间关系计算以及叠加分析操作。
空间关系计算主要支持以下几种计算 相等Equals 几何形状拓扑上相等。
脱节Disjoint 几何形状没有共有的点。
相交Intersects 几何形状至少有一个共有点区别于脱节 9接触Touches 几何形状有至少一个公共的边界点但是没有内部点。
交叉Crosses 几何形状共享一些但不是所有的内部点。
内含Within 几何形状A的线都在几何形状B内部。
包含Contains 几何形状B的线都在几何形状A内部区别于内含 重叠Overlaps 几何形状共享一部分但不是所有的公共点而且相交处有他们自己相同的区域。
另外一种是空间叠加分析操作。
主要有下面几个操作 缓冲区分析Buffer 包含所有的点在一个指定距离内的多边形和多多边形。
凸壳分析ConvexHull 包含几何形体的所有点的最小凸壳多边形就是外包多边形啦 交叉分析Intersection 交叉操作就是多边形AB中所有共同点的集合。
联合分析Union AB的联合操作就是AB所有点的集合。
差异分析Difference AB形状的差异分析就是A里有B里没有的所有点的集合。
对称差异分析SymDifference AB形状的对称差异分析就是位于A中或者B中但不同时在AB中的所有点的集合 10 2.1.2 点 2.1.2.1 OGRPoint OGRPoint为几何形状——点该类由OGRGeometry继承而来。
它由x、y、z坐标组成。
主要函数及其功能如下 getX函数获取该点的x坐标。
getY函数获取该点的y坐标。
getZ函数获取该点的z坐标。
setX函数设置该点的x坐标。
setY函数设置该点的y坐标。
setZ函数设置该点的z坐标。
112.1.3 线 2.1.3.1 OGRCurve OGRCurve为几何形状——曲线该类由OGRGeometry继承而来是抽象类不能被实例化。
其继承图如下所示。
该类的主要函数及其功能如下 get_Length函数获取曲线的长度。
StartPoint函数获取曲线的起点。
EndPoint函数获取曲线的终点。
get_IsClosed函数判断曲线是否闭合。
Value函数沿曲线获取特定距离的点。
2.1.3.2 OGRLineString OGRCurve为几何形状——线多点组成该类由OGRCurve继承而来。
其继承图如下所示。
12该类的主要函数及其功能如下 setNumPoints函数设置线中点的数目。
setPoint函数设置线中某一点的坐标。
setPoints函数设置线中所有点的坐标。
addPoint函数添加新的点 getPoints函数获取线中所有的点。
addSubLineString函数在线中添加子线子线中的点依次添加在原线的末尾。
2.1.3.3 OGRLinearRing OGRLinearRing为几何形状——环首尾相连的线该类由OGRLineString继承而来。
其继承图如下所示。
该类的主要函数及其功能如下 isClockwise函数判断环是否为顺时针方向。
closeRings函数强制闭合线环。
get_Area函数获取环的面积。
isPointInRing函数判断点是否在环的内部。
2.1.4 面 2.1.4.1 OGRSurface OGRCurve为几何形状——面该类由OGRGeometry继承而来是抽象类不能被实例化。
其继承图如下所示。
13 该类的主要函数及其功能如下 get_Area函数获取面的面积。
Centroid函数获取面的中心点。
PointOnSurface函数未知。
2.1.4.2 OGRPolygon OGRPolygon为几何形状——多边形它是由单个或多个闭合的环组成单个多边形中只有一个外环即多边形的外边界但可以有多个内环即岛。
该类由OGRSurface继承而来继承图如下所示。
该类的成员变量 int nRingCount多边形中环的数目。
OGRLinearRing papoRings存放多边形环的指针数组 该类的主要函数及其功能如下 addRing函数添加新的环。
如果多边形为空则新加入的环为外边界否则为岛。
addRingDirectly函数添加新的环。
getExteriorRing函数获取多边形的外环即外边界。
getNumInteriorRings函数获取多边形内环的数目即岛的数目。
getInteriorRing函数获取多边形某一个内环。
closeRings函数强制性闭合多边形内任意不闭合的环。
142.1.5 几何对象集 2.1.5.1 OGRGeometryCollection OGRGeometryCollection为几何形状——几何对象集它可以由多个几何对象组成该类由OGRGeometry继承而来其继承图如下所示。
该类的成员变量 int nGeomCount几何对象集中几何对象的数目。
OGRGeometry papoGeoms存放几何对象的指针数组。
int nCoordinateDimension坐标的维数。
该类的主要函数及其功能如下 getNumGeometries函数获取几何对象集中几何对象的数目。
getGeometryRef函数获取几何对象集中某一个几何对象。
addGeometry函数添加新的几何对象。
addGeometryDirectly函数添加新的几何对象。
removeGeometry函数删除几何对象集中某个几何对象。
2.1.5.2 OGRMultiPoint OGRMultiPoint为几何形状——点集由多个点组成该类由OGRGeometryCollection继承而来其继承图如下所示。
15该类的成员函数请参考其基类的函数说明。
2.1.5.3 OGRMultiLineString OGRMultiLineString为几何形状——线集由多个线组成它由OGRGeometryCollection继承而来其继承图如下所示。
该类的成员函数请参考其基类的函数说明。
2.1.5.4 OGRMultiPolygon OGRMultiPolygon为几何形状——多边形集它可以由多个多边形组成该类从OGRGeometryCollection继承而来其继承图如下所示。
该类的成员函数请参考其基类的函数说明。
2.2 SpatialReference介绍 SpatialReference即空间参考系它是参照OGC相关标准定义包括地理坐标系以及投影坐标系空间参考的数据模型采用的是OpenGIS的WKT格式。
同时可以利用PROJ.4另外的一个
开源代码库来进行坐标
系统之间的转换。
OGRSpatialReference的使用方法可以参考OGR的官方网站。
162.3 Feature介绍 Feature即要素它包括几何对象Geometry与要素属性。
要素集或字段的属性可以通过OGRFeatureDefn类来读取。
其中FID是图层中要素的唯一标识一个要素一般对应属性表中的一行。
2.3.1 OGRFeature OGR中表达Feature的类为OGRFeature该类中主要包括一些读取要素的几何形状以及字段属性的函数 其主要的成员变量如下 int nGeomCount几何对象集中几何对象的数目。
long nFID图层中要素的唯一标识。
OGRFeatureDefn poDefn要素集或要素层的定义。
OGRGeometry poGeometry要素的几何形状。
OGRField pauFields要素的字段。
该类的主要函数及其功能如下 GetDefnRef函数获取要素集或要素层的定义。
SetGeometryDirectly函数设置要素的几何形状。
SetGeometry函数设置要素的几何形状。
GetGeometryRef函数获取要素的几何形状。
StealGeometry函数从要素中取走几何形状清除该几何形状与要素的关系。
Clone函数复制要素。
Equal函数判断两个要素是否相同。
GetFieldCount函数获取要素的字段个数。
GetFieldDefnRef函数获取要素某个字段的定义。
GetFieldIndex函数根据要素中某个字段的名称获取该字段的索引。
IsFieldSet函数判断某个字段是否赋了值。
UnsetField函数清空某个字段。
GetRawFieldRef函数获取某个字段。
GetFieldAsInteger函数获取某个整型字段值。
GetFieldAsDouble函数获取某个双精度字段值。
17GetFieldAsString函数获取某个字符串字段值。
GetFieldAsIntegerList函数获取某个整型数列字段值。
GetFieldAsDoubleList函数获取某个双精度数列字段值。
GetFieldAsStringList函数获取某个字符串数列字段值。
GetFieldAsBinary函数获取某个二进制字段值。
GetFieldAsDateTime函数获取某个日期与时间字段值。
SetField函数设置某个字段的值。
GetFID函数获取要素的唯一标识。
SetFID函数设置要素的唯一标识。
DumpReadable函数未知。
SetFrom函数将当前要素设置为另外的一个要素。
RemapFields函数未知。
GetStyleString函数获取要素的特征字符串。
SetStyleString函数设置要素的特征字符串。
SetStyleStringDirectly函数设置要素的特征字符串。
GetStyleTable函数获取要素的特征表。
SetStyleTable函数设置要素的特征表。
SetStyleTableDirectly函数设置要素的特征表。
CreateFeature函数创建新的要素。
DestroyFeature函数销毁要素。
2.3.2 OGRFeatureDefn OGRFeatureDefn类是关于一个要素集或要素层的定义其中包含了要素集的架构信息schema information一个OGRFeatureDefn就是一个图层。
此外该类还包括一些要素集的元数据如名称、geometry的类型等。
其主要的成员变量如下 int nRefCount计数。
int nFieldCount字段数。
OGRFieldDefn papoFieldDefn字段定义。
OGRwkbGeometryType eGeomType几何形状Geometry类型。
char pszFeatureClassName要素集名称。
18该类的主要函数及其功能如下 GetName函数获取要素集的名称。
GetFieldCount函数获取字段数。
GetFieldDefn函数获取字段定义。
GetFieldIndex函数由字段名获取该字段的索引。
AddFieldDefn函数添加字段定义。
GetGeomType函数获取几何形状Geometry类型。
SetGeomType函数设置几何形状Geometry类型。
Clone函数复制要素定义。
Reference函数计数加1。
Dereference函数计数减1。
GetReferenceCount函数获取计数的总数。
Release函数释放该要素对象的计数。
CreateFeatureDefn函数创建要素定义。
DestroyFeatureDefn函数删除要素定义。
2.3.3 OGRFieldDefn OGRFieldDefn为单个OGRFeatureDefn属性的定义主要指单个字段的描述信息如字段类型、宽度以及精度等。
其主要的成员变量如下 char pszName字段名称。
OGRFieldType eType字段类型。
OGRJustification eJustify字段的justification。
int nWidth字段宽度。
int nPrecision字段的精度。
OGRField uDefault字段的默认值。
该类的主要函数及其功能如下 SetName函数设置字段名称。
GetNameRef函数获取字段名称。
GetType函数获取字段类型。
19SetType函数设置字段类型。
GetFieldTypeName函数获取字段类型的名称。
GetJustify函数获取字段的justification。
SetJustify函数设置字段的justification。
GetWidth函数获取字段宽度。
SetWidth函数设置字段宽度。
GetPrecision函数获取字段精度。
SetPrecision函数设置字段精度。
Set函数设置字段的属性。
SetDefault函数设置默认的字段值。
GetDefaultRef函数获取默认的字段值。
2.4 Layer介绍 Layer即图层OGR中的OGRLayer图层.