矢量数据模型

本文档旨在记录OGR类。OGR类的目的是泛型(不特定于OLE DB或COM或Windows),而是用作实现OLE DB提供程序支持的基础,以及用于SFCOM的客户端支持。目的是,这些相同的OGR类可以被SFCORBA的实现所使用,或者直接使用C++程序,它们希望使用OpenGIS简单特征启发API。

由于OGR是基于OpenGIS简单特征数据模型建模的,因此对SFCOM或其他简单特征接口规范(可从Open Geospatial Consortium网站检索)进行审查非常有帮助。数据类型和方法名是根据接口规范中的数据类型和方法名建模的。

班级概况

  • 几何图形 (ogr_geometry.h ):几何类 (OGRGeometry 等)封装OpenGIS模型矢量数据,并提供一些几何操作,以及转换为众所周知的二进制和文本格式。几何图形包括空间参考系(投影)。

  • 空间参考 (ogr_spatialref.h ):一个 OGRSpatialReference 封装投影和基准的定义。

  • 特征 (ogr_feature.h ):的 OGRFeature 封装整个特征的定义,即一个几何体和一组属性。

  • 要素类定义 (ogr_feature.h ):的 OGRFeatureDefn 类捕获一组相关功能(通常是整个层)的架构(字段定义集)。

  • 层 (ogrsf_frmts.h ): OGRLayer 是一个抽象基类,表示GDALDataset中的功能层。

  • 数据集 (gdal_priv.h ):一 GDALDataset 是表示包含一个或多个OGRLayer对象的文件或数据库的抽象基类。

  • 司机(gdal_priv.h):A GDALDriver 表示特定格式的转换器,打开GDALDataset对象。所有可用的驱动程序都由GDALDriverManager管理。

几何图形

几何类表示各种矢量几何。所有几何类派生自 OGRGeometry 它定义了所有几何图形的公共服务。几何类型包括 OGRPointOGRLineStringOGRPolygonOGRGeometryCollectionOGRMultiPolygonOGRMultiPointOGRMultiLineString .

这些几何类型用具有 OGRCircularStringOGRCompoundCurveOGRCurvePolygonOGRMultiCurveOGRMultiSurface 类。

附加的中间抽象基类包含最终可以由其他几何类型实现的功能。其中包括OGRCurve(OGRLineString的基类)和OGRSurface(OGRPolygon的基类)。在简单特征抽象模型和SFCOM中建模的一些中间接口目前还没有在OGR中建模。在大多数情况下,这些方法被聚合到其他类中。

这个 OGRGeometryFactory 用于将已知文本和已知二进制格式的数据转换为几何图形。这些是预定义的ASCII和二进制格式,用于表示所有类型的简单特征几何图形。

以SFCOM中的几何对象为基础,几何测量包括对 OGRSpatialReference 对象,定义该几何体的空间参考系。这通常是对共享空间参考对象的参考,使用它的每个几何测量对象的参考计数。

许多空间分析方法(如计算重叠等)目前还没有用于几何测量。

虽然理论上可以从现有的几何类中导出其他或更具体的几何类,但这并不是一个经过深思熟虑的方面。特别是,可以使用ogrgometryFactory创建专门的类,而不必修改它。

非线性几何的兼容性问题

引入了通用机制,以便在不支持非线性几何图形的驱动程序层中创建或修改具有非线性几何图形的特征,将该几何图形转换为最接近的匹配线性几何图形。

另一方面,当从OGR C API检索数据时 OGRSetNonLinearGeometriesEnabledFlag() 可以使用函数,以便在必要时将返回的几何图形和图层几何类型转换为其线性近似值。

空间参考

这个 OGRSpatialReference 类用于存储OpenGIS空间参照系统定义。目前支持本地、地理和投影坐标系。最近的GDAL版本也支持垂直坐标系、地心坐标系和复合(水平+垂直)坐标系。

空间坐标系数据模型继承了OpenGIS的文本格式。简单特性规范中定义了一种简单的形式。在坐标变换规范中可以找到更复杂的形式。OGRSpatialReference是基于坐标转换规范的特性构建的,但旨在与早期的简单特性表单兼容。

还有一个关联 OGRCoordinateTransformation 类,该类封装了使用PROJ在不同坐标系之间进行转换。有一个教程可以描述如何使用OGRSpatialReference类。

特征/特征定义

这个 OGRGeometry 捕获矢量特征的几何图形。。。特征的空间位置/区域。这个 OGRFeature 包含此几何图形,并添加要素属性、要素id和要素类标识符。可以将多个几何图形与OGR功能关联。

The set of attributes (OGRFieldDefn), their types, names and so forth is represented via the OGRFeatureDefn class. One OGRFeatureDefn normally exists for a layer of features. The same definition is shared in a reference counted manner by the feature of that type (or feature class).

要素的要素id(FID)旨在成为其所属图层内要素的唯一标识符。独立要素或尚未写入图层的要素可能具有空(OGRNullFID)要素id。要素id在OGR中建模为64位整数;但是,这不足以表达某些格式的自然要素id。例如,GML特性id是一个字符串。

要素类还包含该要素类所允许的几何图形类型的指示器(从返回的OGRwkbGeometryType OGRFeatureDefn::GetGeomType() ). 如果这是wkbUnknown,则允许任何类型的几何图形。这意味着,给定图层中的要素可能具有不同的几何类型,尽管它们始终共享一个公共属性模式。

Several geometry fields (OGRGeomFieldDefn) can be associated to a feature class. Each geometry field has its own indicator of geometry type allowed, returned by OGRGeomFieldDefn::GetType(), and its spatial reference system, returned by OGRGeomFieldDefn::GetSpatialRef().

OGRFeatureDefn还包含要素类名(通常用作图层名)。

OGRLayer 表示数据源中的要素层。OGRLayer中的所有特性共享一个公共模式,并且是相同的 OGRFeatureDefn . OGRLayer类还包含从数据源读取功能的方法。OGRLayer可以看作是从底层数据源(通常是文件格式)读取和写入功能的网关。在SFCOM和其他基于表的简单功能实现中,OGRLayer表示空间表。

OGRLayer包括顺序和随机读写的方法。读取访问(通过 OGRLayer::GetNextFeature() 方法)通常按顺序逐个读取所有特征;但是,通过在OGRLayer上安装空间过滤器(通过 OGRLayer::SetSpatialFilter() 方法)。

当前OGR架构中的一个缺陷是空间过滤器直接设置在OGR layer上,OGRLayer是数据源中给定层的唯一代表。这意味着不可能一次激活多个读取操作,每个操作上都有不同的空间过滤器。这个方面在将来可能会被修改以引入OGRLayerView类或类似的东西。

另一个可能出现的问题是为什么OGRLayer和OGRFeatureDefn类是不同的。OGRLayer总是与OGRFeatureDefn有一对一的关系,所以为什么不合并这些类呢。有两个原因:-正如现在定义的OGRFeature和OGRFeatureDefn不依赖于OGRLayer,因此它们可以独立地存在于内存中,而不考虑数据存储中的特定层。-SF-CORBA模型不像SFCOM和SFSQL模型那样有一个具有单一固定模式的层的概念。功能属于可能与其当前功能分组不直接相关的功能集合这一事实对于使用OGR实现SFCORBA支持可能很重要。

OGRLayer类是一个抽象基类。每个实现的文件格式驱动程序都应该有一个实现的子类。OGRLayers通常由 GDALDataset ,不会直接实例化或销毁。

数据集

A GDALDataset 表示一组OGRLayer对象。这通常表示单个文件、一组文件、数据库或网关。一个GDALDataset有一个 OGRLayer 它拥有但可以返回引用的。

GDALDataset是一个抽象基类。每个实现的文件格式驱动程序都应该有一个实现的子类。GDALDataset对象通常不是直接实例化的,而是在 GDALDriver . 删除GDALDataset将关闭对底层持久数据源的访问,但通常不会导致删除该文件。

GDALDataset有一个名称(通常是一个文件名),可用于使用GDALDriver重新打开数据源。

GDALDataset还支持执行特定于数据源的命令,通常是SQL的一种形式。这是通过 GDALDataset::ExecuteSQL() 方法。当一些数据源(如PostGIS和Oracle)将SQL传递到底层数据库时,OGR还支持对任何数据源计算SQL SELECT语句的子集。

驱动程序

A GDALDriver 对象是为支持的每个文件格式实例化的。GDALDriver对象在GDALDriverManager中注册,GDALDriverManager是一个通常用于打开新数据集的单例类。

它旨在实例化一个新的GDALDriver对象,并为要支持的每个文件格式(以及特定于文件格式的GDALDataset和OGRLayer类)的Identify()、Open()等操作定义函数指针。

在应用程序启动时,通常为每个所需的文件格式调用注册函数。这些函数实例化适当的GDALDriver对象,并向GDALDriverManager注册它们。当要打开数据集时,驱动程序管理器通常会依次尝试每个GDALDataset,直到一个成功,返回一个GDALDataset对象。