博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

gdal - ogr简单对象模型

Posted on 2010-12-05 11:55  淡如水wp  阅读(4970)  评论(0编辑  收藏  举报

ogr是gdal的一部分,主要是处理gis的矢量数据。

ogr的地理数据模型符合OGC的简单数据对象模型标准,如下图:

最顶层是Geometry类,下面的点(Point),曲线(Curve),表面(Surface)分别继承于它。然后geometry与投影相关的类成关联关系。

线串(LineString)继承于曲线(Curve),且线串(LineString)由点(Point)聚焦而成,一对连续的点决定一个线段。

线(Line)与环线(LinearRing)同时继承于线串(LineString)。

线(Line)是只有两个点的线串(LineString)。

环线(LinearRing)是一种特殊的线串(LineString),如下图所示:

a,b,c,d四个LineString中,只有c是LineRing,因为只有c是简单(即不自交)且闭合的。

 

表面(Surface) 是二维的地理对象。

多面体表面(PolyhedralSurfaces)与多边形(Polygon)承继与它。
多面体表面(PolyhedralSurfaces)是由多个简单表面(Surface)构成的。如下图所示:

多边形(Polygon)是一个平面表面,有一个外部边界及0或多个内部边界,每一个内部边界叫做多边形的一个洞。如下图所示:

而三角形(Triangle)继承于多边形(Polygon),三角形是由3个不同的,且非共同线顶点构成的,没有内部边界。

多曲线(MultiCurve)是有多个Curve构成的集合。如下图所示:

MultiCurve是一个抽象类,给子类定义了很多接口。且有以下性质:

MultiCurve当且仅当所有子Curve都是简单(无自交)才是简单的多曲线;两个子曲线的边界都是他们的交点。

MultiCurve的边界的确定采用除2原则:A Point is in the boundary of a MultiCurve if it is in the boundaries of an odd number of elements of the MultiCurve。

a的边界是{s1,e2},b的边界是{s1,e1},c的边界是空。

如果MultiCurve的子Curve都是闭合的,那它也是闭合的,此时边界总为空。MultiCurve是定义成拓扑闭合的。

 

MultiSurface是Surface的集合,但是PolyhedralSurface并不是MultiSurface。

因为它违反了MultiSurface的规则:子Polygon的边界相交于有限有点。

---------------------------------------------------------------------------------------

具体类的说明:

Geometry (ogr_geometry.h): geometry类(OGRGeometry等) 定义了所有矢量数据类(如下图),一些空间分析功能,wkt,wkb的转换,以及投影的引用。

OGRGeometryFactory类用来转换将wkb/wkt与geometry的对象互相转换。

OGRGeometry类中有一个OGRSpatialReference类的对象,用来定义投影的相关信息。

OGRSpatialReference(ogr_spatialref.h):)支持地理坐标系统,投影坐标系统。但纵坐标系统,地心坐标系统和复合(水平+垂直)坐标系统不支持。

坐标系统间的转换在OGRCoordinateTransformation类中调用了proj.4的东西。

  

OGRGeometry的成员文档:http://www.gdal.org/ogr/classOGRGeometry.html

 

OGRFeature(ogr_feature.h):OGRFeature类里描述了OGRGeometry的空间信息,属性信息,fid,以及类的标识。

OGRFeatureDefn类里描述了一个图层的字段信息,包括字段名称,字段类型,字段属性。

fid是空间数据的主键,定义成长整型,gml内是string型,oracle里的rowid是大于4bytes的.

OGRFeatureDefn::GetGeomType()).返回空间数据的类型(OGRwkbGeometryType),wkbUnknown的话则任意类型都可以。

 

OGRLayer (ogrsf_frmts.h):表示数据源中的一层空间数据,可以认为OGRLayer是从底层数据源读取数据的一个中继。

OGRLayer::GetNextFeature()可以随机或顺序读取 .

 

一个OGRLayer和一个OGRFeature是一一对应的。

 

OGRDataSource (ogrsf_frmts.h): 一个OGRDataSource对象表示一个文件或数据库,含有多个OGRLayer对象。

 

 

 

OGRSFDriver(ogrsf_frmts.h): OGRSFDriver翻译各种矢量数据类型,是打开各种数据对象的驱动。

所有的数据驱动在 OGRSFDriverRegistrar类中管理。

 

-----------------------------------------------------------

读取一个shp的步骤

  1,

      //注册数据驱动--ALL所有格式

    OGRRegisterAll();

 2,

      //打开数据源

 

    OGRDataSource *poDS = OGRSFDriverRegistrar::Open("E:\\exercise\\qt\\qmapcui-build-desktop\\debug\\ZW0817P.shp");
 
 3, 

    //获取图层

    OGRLayer *poLayer = poDS->GetLayer(0);

  4,

   //获取数据

   OGRFeature *poFeature = poLayer->GetFieldAsString(0);

 

5,通过poFeature的各种函数就可以读出数据了。

 

6,关闭数据源。

OGRDataSource::DestroyDataSource(poDS);