GDAL地理网络数据模型

本文旨在描述地理网络模型类的目的和结构。GNM是GDAL的一部分,提供了创建、管理和分析地理网络的方法。

GNM类的主要目的:

  • 为不同的已存在网络格式提供抽象,就像GDAL(之前是OGR)为空间矢量格式提供了抽象一样。
  • 为那些根本没有网络功能的空间格式提供网络功能。

总体概念

任何现实世界的网络都可以表示为一组矢量数据,这些数据本身可以在GDAL中表示为GDALDataset。在GNM中,这些数据包括两个部分。网络的拓扑结构(图形)、网络的元数据(名称/描述)、一组特殊要素标识符等属于“网络部分”,而通常用于GDAL的图层、要素、几何体属于“空间/属性部分”。为了能够处理不同格式的数据集,GNM中设计了以下类。

网络

GNMNetwork表示一个抽象的网络。实际上,在某种格式的数据集中,网络数据和空间/属性数据实际上可能是不可分割的(只是额外的图层/字段/标签),而GNMNetwork的具体实现“知道”整个数据集中哪些数据属于“网络部分”,并且能够操作它。GNMNetwork允许用户执行以下操作:

  • 设置/取消连接。这些通用的构建网络拓扑结构的方法(自动和手动)以通用方式接收要连接的要素的标识符,而具体的实现知道在何处以及如何存储和构建拓扑结构。
  • 读取连接。通用方法以通用方式返回连接。
  • 添加/删除图层/要素。当要素或图层添加到网络时,可能会触发一些操作(图中的权重更改,连接要素的级联更改)。具体的GNMNetwork描述了如何执行这些操作。
  • 定义网络的业务逻辑或行为。这可以通过网络规则或约束/限制来表达。预期每个规则可以从字符串设置,并且每个具体的GNMNetwork将将其转换为内部格式。

格式

GNMNetwork继承了GDALDataset,类似于OGRDatasource,但具有额外的功能。有一组用于网络的GDAL驱动程序。在GDAL中的通用网络实现提供了附加功能,如规则、虚拟边缘和顶点。此外,在编辑要素时,网络会控制网络规则和其他特定内容,并且可以拒绝保存编辑。其他网络驱动程序(如pgRouting、OSRM、GraphHopper等)应通过GNMNetwork类提供基本功能。

网络格式

要为已存在的网络格式(如PostGIS pgRouting、Oracle Spatial Networks、GML中的拓扑等)添加本机支持到GNM,开发人员应实现相应的GNMDriver-GNMNetwork接口。但也可以使用已在GNM中实现为特殊类的“通用”网络格式。当需要创建和使用最初没有“网络部分”的格式(如ESRI Shapefile)的网络时,这将非常有用。

GNMGenericNetwork

GNMGenericNetwork是GNMNetwork的具体实现。GNMGenericNetwork旨在支持大多数GDALDataset驱动程序(取决于相应驱动程序的功能)。从技术上讲,网络格式的抽象是通过GDAL的数据集和图层方法来实现的。GNMGdalNetwork聚合了一个GDALDataset实例,其中“网络部分”表示为一组“系统图层”(wkbNone几何体,特定属性字段),而空间/属性数据被视为一组“类图层”或“类”(具有几何体和属性的图层,与通常一样)。GNMGenericNetwork自动创建和维护“网络部分”,并提供了用于处理它的方法。

GNMGenericNetwork用于描述现实世界网络的方式旨在是通用的,因为:

  • 使用了最通用类型的图形,保存了每一个有用的信息:边的方向(有向/无向)、边的成本(加权/未加权)。这个图形以关联列表的形式存储:源顶点要素ID、目标顶点要素ID、边要素ID、直接成本、反向成本、边的方向。
  • 网络中的任何要素、任何几何体都可以是图中的顶点或边。还可以完全没有“连接”边下的要素(实际上为此情况创建了虚拟边)。所有这些意味着用户操作要素标识符,而GNMGenericNetwork保证要素之间的连接完整性。
  • 网络中的任何要素都将获得唯一的全局要素标识符(GFID),它允许统一任意数量的“类图层”到一个网络下。
  • GNMGenericNetwork使用自己的方式确定网络的业务逻辑。有关更多详细信息,请参阅GNMGenericNetwork::CreateRule()

有关更多详细信息,请参阅[GNMGenericNetwork](https://gdal.org/user/../api/gnm_cpp.html#_CPPv417GNMGenericNetwork “GN

MGenericNetwork”)类的文档。

通用格式的网络还具有以下重要特点:

  • 网络中使用单一的空间参考系统,这意味着出现在网络中的每个要素都将被转换为此SRS。
  • 网络始终以空的方式创建,需要导入或创建要素。
  • 无法从数据集中删除“网络部分” – 只能删除整个网络和所有数据。删除是逐层进行的,只删除在网络中注册的系统和类图层。

网络分析

在GNM中,网络分析是在GNMNetwork对象中实现的。

GNMGenericNetwork在内存中以STL容器的形式保存图形,并提供基本算法,以数组形式返回结果(例如,充满路径的边和顶点GFID的std::vector)。但调用者将结果作为OGRLayer,其中的要素来自构成网络的图层。还创建了一些附加字段(VERTEX/EDGE指示字段、GFID、图层名称等)。调用者必须通过GDALDataset::ReleaseResultSet()释放结果OGRLayer。