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);