地理网络数据模型

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

GNM类的主要目的是:为不同的现有网络格式提供一个抽象,比如GDAL(以前的OGR)为空间向量格式提供一个抽象;为那些根本没有它的空间格式提供一个网络功能。

一般概念

任何现实世界中的网络都可以表示为一组矢量数据,而矢量数据本身可以用GDAL表示为一个GDAL data set。在GNM中,这些数据由两部分组成。网络的拓扑(图)、网络的元数据(名称/描述)、特殊特征标识符集等属于“网络部分”,而GDAL层、特征、几何图形的公共部分则属于“空间/属性部分”。为了处理不同格式的数据集,在GNM中设计了以下类。

网络

GNMNetwork 表示抽象网络。事实上,网络数据和空间/属性数据在某种格式的数据集中是不可分离的(只是附加的层/字段/标记),而GNMNetwork的具体实现“知道”整个数据集中的哪些数据是指“网络部分”,并能够对其进行操作。GNMNetwork允许用户执行以下操作:

-设置/取消设置连接。这些构建网络拓扑的通用方法(自动和手动)以通用的方式接收正在连接的特征的标识符,而具体的实现知道在何处以及如何存储和构建拓扑;读取连接。泛型方法以公共方式返回连接;—添加/删除层/特征。将要素或图层添加到网络时,可以启动一些操作(图中的权重更改、连接要素中的级联更改)。具体的GNMNetwork描述了它是如何完成的。-定义网络的业务逻辑或行为。它可以用网络规则或约束/限制来表示。每个规则都可以从一个字符串中设置,每个具体的GNMNetwork将把它转换为内部外观。

格式

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

网络格式

添加 native 支持已有的网络格式(如PostGIS pgRouting、Oracle Spatial Networks、GML中的拓扑结构等)到GNM,开发人员应实现相应的GNMDriver GNM network接口。但也有能力使用 generic 网络格式,它已经作为一个特殊的类在GNM中实现了。当需要创建和使用一个最初没有“网络部分”(如ESRI Shapefile)的格式的网络时,它非常有用。

GNMGenericNetwork

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

GNMGenericNetwork描述现实世界网络的方法是一种通用的方法,因为:-使用了最通用的图类型,它保存了所有有用的信息:边的方向(有向/无向)、边的代价(加权/未加权)。此图存储为关联列表:源顶点特征id、目标顶点特征id、边特征id、直接成本、反向成本、边的方向;-具有任何几何图形的任何特征都可以是图中的顶点或边。此外,它可能根本不是连接边缘下的特征(实际上,虚拟边缘是为这种情况创建的)。所有这一切意味着用户使用特征标识符进行操作,而GNMGenericNetwork保证了特征之间的连接完整性;-网络中的任何特征都将获得唯一标识符-全局特征标识符(GFID),它允许在一个网络下统一任意数量的“类层”;-GNMGenericNetwork使用自己的方法来确定网络的业务逻辑。见 GNMGenericNetwork::CreateRule() 了解更多详细信息。

GNMGenericNetwork 类文档了解更多详细信息。

通用格式的网络还具有以下重要特征:-网络中使用单一空间参考系统,这意味着网络中出现的每个特征都将转换为此SRS;-网络始终创建为空,并且需要导入或创建特征;-无法删除“网络部分“从数据集-只删除整个网络的所有数据。删除是逐层进行的,只删除在网络中注册的系统层和类层。

网络分析

GNM中的网络分析在 GNMNetwork 对象。

GNMGenericNetwork holds the graph in memory in STL containers and provides basic algorithms which return the results in the array-form (e.g. std::vector full of path's edges and vertices GFIDs). But the caller get a result as OGRLayer there features get from layers consist the network. Also some additional fields created (VERTEX/EDGE indicator field, GFID, layer name, etc.). The caller have to free the result OGRLayer via GDALDataset::ReleaseResultSet()