RFC 48:地理网络支持
作者:Mikhail Gusev,Dmitry Baryshnikov
联系方式:gusevmihs,邮箱:gmail.com,polimax@mail.ru
状态:采用,在GDAL2.1中实现
介绍
本文建议将GSoC 2014项目“GDAL/OGR地理网络支持”的结果集成到GDAL库中。GNM(Geographical Network Model)旨在提供在GDAL空间数据上创建、管理和分析网络的能力。
GSoC项目描述: http://trac.osgeo.org/gdal/wiki/geography_network_support
带所有后备箱变化的GDAL叉子: https://github.com/MikhanGusev/gdal
GSoC博客: http://gsoc2014gnm.blogspot.ru/
目的和说明
需要在GDAL中有一个工具,它一方面为不同的现有网络格式(pgRouting、OSRM、GraphHopper、SpatiaLite networks等)提供抽象,就像GDAL(以前的OGR)为空间矢量格式提供抽象一样,另一方面,为那些根本没有空间格式的空间格式(shapefile)提供网络功能。
这样的工具被实现为一组独立的C++类,称为GNM。它们中的两个主要代表一个抽象网络(GNMNetwork类)和一个“GDAL native”或泛型格式的网络(GNMGenericNetwork类)。抽象网络是用户用来管理网络数据的公共接口。底层格式特定类的列表可以像GDAL驱动程序列表一样随时扩展,以支持更多的网络格式。“GDAL native”格式实现了抽象网络,并用于为GDAL已经支持的空间格式提供网络功能。这种格式的所有网络数据与空间数据一起存储在一个空间数据集中的特殊层集中(在内部广泛使用GDALDataset和OGRLayer)。
使用网络的接口包括:
* Creating/removing networks
* Creating network topology over spatial data manually or automatically
* Reading resulting connections in a common way
* Adding/removing spatial layers/features to the network
* Defining business logic of the networks (e.g. the way of apply or deny connections with different layer features)
* Several methods of network analysis
请参阅类架构文档(gdal/gnm/gnm_arch.dox)以了解更多详细信息以及这组类在内部是如何工作的。
绑定
C API包装函数在gdal/gnm/gnm_API.h中声明。所有当前的python绑定都在swig接口文件中实现并使用这些C函数。
应用程序集
建议将以下两个使用GNM的应用程序包含到GDAL源代码树中:
* gnmmanage. Similar to gdalmanage purposes. Manages the networks of “GDAL-native” format: creates, removes networks, builds topology manually and automatically (as the GNMNetwork inherited from GDALDataset, the gdalmanage can be used with GNMNetwork)
* gnmanalyse. Uses the analysing capabilities of GNM. Currently: shortest path(s) and connected components searches
有关更多详细信息,请参阅“根据文档”中对这些应用程序的描述。
实施
github上已存在拉取请求 (https://github.com/OSGeo/gdal/pull/60 _)实现了这个RFC。
在GNM支持下构建GDAL
默认情况下,GNM支持的构建被禁用。要构建GNM支持,必须添加——使用GNM键来配置或取消注释nmake.opt中的相应行。
测试集
在自动测试gnm测试中测试gnm网络的所有公共方法。增加了GNMGenericNetwork的几个测试。在autotest/utilities中测试的控制台应用程序(gnmmanage和gnmanalyse)。
所有测试都是根据一般规则实现的:它们是在Python上编写的,位于/autotest文件夹中:
* GNM basic tests. Tests the basic “GDAL-network” functionality, using some small test shapefiles
* GNM utilities tests. Simple tests of the gnmmanage and gnmanalyse utilities, similarly to ogrinfo tests
文件结构
所有新方法和GNM类都被记录在案。必要时更新GDAL文档。
/gnm和/apps目录中的以下新Doxyfiles将自动构建到自动生成的主html中的“相关页面”部分。它们都类似于OGR文档:
* GNM Architecture. The purpose and description of all GNM C++ classes
* GNM Tutorial. The guide how to use the C++ GNM classes
* GNM Utility Programs. The references to two GNM utilities
* gnmmanage. Description and usage of gnmmanage utility
* gnmanalyse. Description and usage of gnmanalyse utility
源代码树组织
正在添加的内容:
整合将导致 附加 包含头文件、源文件、制造商文件和文档文件的新文件夹:
* gcore/gdal.h - add new driver type GNM
* gdal/gnm – the main folder of GNM
* Source code and documentation files of applications at gdal/apps
* Testing python scripts at autotest/gnm and autotest/utilities
* Two testing shapefiles at autotest/gnm/data (~7 Kb)
* Swig interface file at gdal/swig/include
正在修改的内容:
这个 改变 已经存在的GDAL文件 将是微不足道的 :
* GNUMakefile, makefile.vc and their configurations at /gdal and /gdal/apps
* /autotest/run_all.py to add gnm tests
* /autotest/pymod/test_cli_utilities.py to add the utility testing command
* /autotest/utilities/test_gnmutils.py
* /swig/python/setup.py and setup.cfg to add gnm module
* GNUMakefile and makefile.vc at /swig/java
未来的想法
我看到许多有用和有趣的GNM扩展方式:
支持更多格式。重要的是,它必须在未来首先实现,而GNM打算使用尽可能多的网络格式。它不仅包括对GNMGdalNetwork格式的支持,也包括对其他GDAL空间格式的测试(目前只测试shapefile和PostGIS)。例如:
GNMPGRoutingNetwork公司。使用pgRouting表。一些想法:
GNMPGRoutingNetwork::ConnectFeatures()将通过OGRFeature::setField()根据值添加到“source”和“target”列中
GNMPGRoutingNetwork::AutoConnect()将在内部调用pgr_createTopology方法
GNMSQLiteNetwork。适用于SpatiaLite虚拟网络。一些想法:
将所有网络数据写入Roadsu netu数据表以及相应的NodeFrom和NodeTo列
GNMGML网络。使用GML拓扑。一些想法:
将网络数据写入 gml::TopoComplex , gml::Node 和 gml::Edge 直接地
更有效的GDAL网络拓扑构建算法。当前的一个被实现为任何网络格式的默认值,可以连接任意数量的线和点图层,但效率不高-大型网络连接时间太长。GNMGenericNetwork可以有更有效的默认算法。
GDAL网络中的更多规则,即描述以下内容的更复杂语法:
从线的几何长度中提取的成本
特征的转向限制作用
更复杂的连接规则:设置可以连接的特征的限制和更复杂的表达式
应用。可能是可以用GNM构建的最有用的应用程序之一 网络2网络 ,它将数据集的网络和空间数据从一种格式转换为另一种格式(例如从pgRouting转换为Oracle spatial networks);
分析。支持不同的图形类型和与之一起工作的算法,用于不同的路由甚至工程目的。例如:
Boost库
压缩层次技术(用于大型图)
投票历史
+1名来自JukkaR,TamasS和Ever