NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
打开地图时最常回答的一些问题可能是“我们在哪里?”、“我们如何从 A 点到达 B 点?”、“我们应该走 I-84 还是 I-95?”、“ 哪条小径可以让我们在徒步旅行中看到最好的景色?”。 这些问题可以通过根据映射路径绘制最佳路线来回答。
使用纸质地图,找到最佳路线是一个手动过程,以及使用口耳相传的建议(“你打算在高峰时间走布朗克斯高速公路吗?你疯了!”)。 如今,地图应用程序使用路由引擎来告诉我们从 A 点到 B 点的最佳方式。
我们也可以使用开源软件自行完成此操作。 在本指南中,我们将探索 pgRouting,这是一种开源路由引擎,可以根据 OpenStreetMap 数据进行最低成本路径分析和计算路由。
1、图数据结构和路由快速介绍
在进入实际应用之前,让我们先了解一下图(Graph)数据结构的基础知识。 图数据结构旨在模拟沿一组路径的运动。 这已广泛用于公共交通和导航中的路由,但已扩展到生物医学研究、社交媒体和机器学习等领域。 图数据结构的核心是由节点(Node)和边(Edge)两个基本单元组成。
- 节点
节点是表示通过路由网络连接一条或多条可能路径的交汇点。 想一想连接多个路段的交叉路口。 节点是我们在路线上停下来并决定下一步转弯的地方。 节点不能独立存在,必须连接到一条或多条边。
- 边
边是连接两个或多个节点的线段,表示它们之间的距离。 边可以是有向的(在一个方向上移动)或无向的(在任何方向上移动),并且必须有明确的开始和结束节点。 沿边的“距离”由属性值表示,这些属性值反映了跨越给定边从一个节点到另一个节点的行进成本。
- 成本
PgRouting 包含几个用于路由的最低成本路径算法。 顾名思义,这些算法沿着图形网络找到一条从 A 点到 B 点的路径,使总成本最小化。 成本是描述图中每条边和/或节点的某些属性的属性值。 成本可以是任何数值参数,最常见的是行程距离,其次是行程时间。 成本还可以反映每条边的坡度或沿边的风景等级。
- 路由算法
路由算法是一组用于确定最佳路径的规则。
显示边和节点的图形拓扑的图表显示了基于总聚合成本的最低成本路径。
2、安装 PgRouting & OSM 工具
现在我们对通过图形数据结构进行路由有了基本的了解,让我们来看一个例子。 PgRouting 包含在最近的 PostGIS 发行版中。 如果你按照本指南安装了环境,那么应该可以开始了。
打开 pgAdmin 4 并突出显示包含在上一个 PostGIS 指南中加载的 OSM 数据的数据库。 从浏览器工具栏打开 SQL 窗口。
使用以下命令启用 PostGIS 和 pgRouting 扩展。
CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
检查上述扩展正确安装和启用:
SELECT PostGIS_full_version();
SELECT * FROM pgr_version();
3、预处理 OSM 数据
我们已经有了来自葡萄牙里斯本市的 OSM 数据集,使用osm2pgsql将其导入到空间数据库中。 OSM 数据包含点和线的集合,但这些还没有准备好以原始形式与 pgRouting 一起运行。 在本节中,我们将提取 OSM 数据的一个子集,并对其进行预处理以获得使用osm2po进行路由的正确拓扑。
osm2po工具抽取原始 OSM 数据并输出一个 SQL 文件,该文件可以导入空间数据库并与 pgRouting 一起运行。
下载“osm2po”的 5.5.5 版本、osm2po-5.5.5.zip,或从 这里下载最新版本。 将 zip 文件解压缩到方便的位置。 这就是安装“osm2po”所需要做的全部工作。
在运行该工具之前,我们需要调整一些配置。 打开“osm2po.config”文件并进行以下编辑:
- 将第 190 行更改为“wtr.finalMask = car,foot,bike”。 这会将 OSM 数据过滤为具有这些标签的段。
- 第 341 行“postp.0.class = de.cm.osm2po.plugins.postp.PgRoutingWriter”取消注释(删除开头的“#”)。 这将具有我们可以使用 pgRouting 读取的格式的“osm2po”输出拓扑。
注意:此处的编辑基于“osm2po.config”版本 5.5.5。 其他版本的行号和配置参数可能不同。
保存配置文件并使用以下语法从命令行中的源目录执行“osm2po”:
java -jar <osm2po jar file> cmd=c prefix=<results folder> <OSM .pbf filepath>
这是在适用于 Linux 的 Windows 子系统上使用的命令:
java -Xmx512m -jar osm2po-core-5.5.5-signed.jar cmd=c prefix=lisbon /mnt/c/osm2pgsql_guide/Lisbon.pbf
作业完成后,结果将保存在名为“lisbon”(或您定义为前缀的任何内容)的文件夹中。 我们现在将输出的 .sql 文件导入 Postgres,并运行 pgRouting。
4、运行 pgRouting
使用以下命令将“osm2po”.sql 文件加载到包含上一教程中导入的 OSM 数据的 PostgreSQL 数据库中。
psql -host localhost -port 5432 -U postgres -d postgres -q -f lisbon_2po_4pgr.sql
注意:如果你在运行“psql”时遇到问题,请尝试更新环境变量
现在应该在 pgAdmin 中可以看到一个新表已添加到数据库中。
查看 Lisbon_2po_4pgr 表的内容,我们看到每条记录都有源节点、目标节点和整数分类的属性。 此外,每条记录都有一个关联成本,可用于查找成本最低的路径。 默认情况下,成本是基于“osm2po.config”文件中定义的距离 (km) 和速度 (kmh) 的行程时间。
“osm2po”输出的路由表内容
最后,让我们试试 pgRouting! 我们将利用 pgRouting 中包含的 Dijkstra 最短路径算法。 路由功能所需的参数是路由表、起始节点和结束节点。
pgr_dijkstra(Edges SQL, start_vid, end_vid)
下面的代码将输入起点和终点的纬度和经度,并在路由表中找到最近的节点。 对于这个例子,我们将找到一条从历史悠久的圣乔治城堡到里斯本市中心爱德华七世公园的路线。 你可以通过右键单击轻松获取 Google 地图中的坐标。 可以在下面找到与谷歌地图路线中的点大致匹配的复制坐标。
找到离起点最近的节点:
WITH start AS (
SELECT topo.source
FROM lisbon_2po_4pgr as topo
ORDER BY topo.geom_way <-> ST_SetSRID(
ST_GeomFromText(‘POINT (-9.1333334 38.7133289)’), 4326)
LIMIT 1
),
找到离端点最近的节点:
destination AS (
SELECT topo.source
FROM lisbon_2po_4pgr as topo
ORDER BY topo.geom_way <-> ST_SetSRID(
ST_GeomFromText(‘POINT (-9.1545999491376 38.73023147131511)’), 4326)
LIMIT 1
)
使用 Dijsktra 最小成本路径算法并加入几何图形:
SELECT ST_Union(geom_way) as route
FROM pgr_dijkstra(‘
SELECT id,
source,
target,
ST_Length(ST_Transform(geom_way, 3857)) AS cost
FROM lisbon_2po_4pgr’,
array(SELECT source FROM start),
array(SELECT source FROM destination),
directed := false) AS di
JOIN lisbon_2po_4pgr AS pt
ON di.edge = pt.id;
注意:代码修改自本指南。
该脚本的输出应该是一行二进制几何数据。
突出显示第一行,然后单击结果左上角的地图图标以使用 pgAdmin 几何查看器在地图上显示几何。
5、结束语
在本指南中,我们介绍了图数据结构的基础知识,它们如何用于最小成本路径路由,如何使用“osm2po”预处理 OpenStreepMap 数据以进行路由分析,以及如何使用“pgRouting”运行路由算法。 用其他一些点自己尝试一下,并进一步探索数据集。
本指南仅涉及最低成本路径路由的基本应用。 可以调整许多参数以匹配任何特定用例。 例如,这里的成本值是基于时间的,但你可以调整成本值以优先考虑风景、坡度、步行性、自行车安全等。
原文链接:Getting Started with PgRouting
BimAnt翻译整理,转载请标明出处