PostgreSQL码农集散地

重新发现PostgreSQL之美 - 无中生有,脑补路径

背景

视频回放: https://www.bilibili.com/video/BV17K4y197J8/

场景:

  • 路径规划: 大型商业综合体, 自动驾驶, 虚拟现实.

  • 共享出行(拼车), 配送调度(餐饮、包裹).

  • 刑侦: 轨迹相遇分析

    • 《重新发现PostgreSQL之美 - 11 时空轨迹系统 新冠&刑侦&预测》

挑战:

  • 传统数据库不支持路网数据, 需要move data到应用端进行计算.

  • 现实中轨迹存在缺失点, 当需要分析轨迹相遇事件时, 准确度下降.

  • 在共享出行拼单, 包裹和餐饮配送中存在一到多, 多到多的路径规划, 非常复杂传统数据库不支持.

PG 解决方案:

  • 支持路网数据存储: 点, 线. 支持道路正、反权重来表示路段通畅度.

  • 内置多重路径规划算法, 支持one to one,one to many,many to one,many to many等算法.

pgrouting

https://docs.pgrouting.org/latest/en/index.html

https://workshop.pgrouting.org/

数据库路由优点:

  • 兼容更多客户端, 都可以修改数据和属性,例如QGIS通过 JDBC、ODBC 或直接使用 Pl/pgSQL。客户端可以是 PC 或移动设备。

  • 数据更新后, 全网可见. 无需预先计算。

  • 路径规划中的变量: “成本”、“路段” 参数可以通过 SQL 动态计算,其值可以来自多个字段或表。

    • 例如路段施工、路段拥堵都可以实时反馈.

核心功能, pgRouting 库包含以下功能(算法):

  • All Pairs Shortest Path, Johnson’s Algorithm

  • All Pairs Shortest Path, Floyd-Warshall Algorithm

  • Shortest Path A*

  • Bi-directional Dijkstra Shortest Path

  • Bi-directional A* Shortest Path

  • Shortest Path Dijkstra

  • Driving Distance

  • K-Shortest Path, Multiple Alternative Paths

  • K-Dijkstra, One to Many Shortest Path

  • Traveling Sales Person

  • Turn Restriction Shortest Path (TRSP)

例子

某个轨迹信息:

point1, ts  
point2, ts
...
pointn, ts

绘图后发现缺失某些点, 出现飞行轨迹, 怎么办?

Image

以下是路网情况, cost可以表示为当时的道路通过耗时

pointx1, pointy1, cost, reverse_cost  
pointy1, pointz1, cost, reverse_cost
...
point??, point??, cost, reverse_cost

无中生有:
采用one to one的算法的到缺失路径

https://docs.pgrouting.org/latest/en/pgr_dijkstra.html

pgr_dijkstra(Edges SQL, start_vid,  end_vid  [, directed])  
pgr_dijkstra(Edges SQL, start_vid, end_vids [, directed])
pgr_dijkstra(Edges SQL, start_vids, end_vid [, directed])
pgr_dijkstra(Edges SQL, start_vids, end_vids [, directed])
pgr_dijkstra(Edges SQL, Combinations SQL [, directed]) -- Proposed on v3.1
RETURNS SET OF (seq, path_seq [, start_vid] [, end_vid], node, edge, cost, agg_cost)
OR EMPTY SET

Example

  • From vertex to vertex on a directed graph

SELECT * FROM pgr_dijkstra(  
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 3
);
seq | path_seq | node | edge | cost | agg_cost
-----+----------+------+------+------+----------
1 | 1 | 2 | 4 | 1 | 0
2 | 2 | 5 | 8 | 1 | 1
3 | 3 | 6 | 9 | 1 | 2
4 | 4 | 9 | 16 | 1 | 3
5 | 5 | 4 | 3 | 1 | 4
6 | 6 | 3 | -1 | 0 | 5
(6 rows)

参考

https://locatepress.com/pgrouting

https://pgrouting.org/

https://www.openstreetmap.org/#map=4/36.96/104.17

欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.  

近期正在写公开课材料, 未来将通过视频号推出. 

更专业的GIS内容可以参考Ganos 老师分享的《为什么需要专业的时空数据库》: