pgrouting
概览
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 1510 | pgrouting | 否 | 是 | 否 | 是 | 否 | 是 | - |
| 相关扩展 | plpgsql postgis postgis mobilitydb h3 pg_polyline q3c pointcloud qdgc pg_geohash pg_sphere pg_eviltransform |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PGDG | 4.0.1 | 1817161514 | pgrouting | plpgsql, postgis |
| RPM | PGDG | 4.0.1 | 1817161514 | pgrouting_$v | - |
| DEB | PGDG | 4.0.1 | 1817161514 | postgresql-$v-pgrouting | - |
安装
您可以直接安装 pgrouting 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:
使用 pig 或者是 apt/yum/dnf 安装扩展:
创建扩展:
用法
pgRouting 扩展 PostGIS/PostgreSQL 地理空间数据库,提供地理空间路径规划和其他网络分析功能。
该库包含以下特性:
- 全对最短路径(Floyd-Warshall、Johnson)
- A* 算法(含双向变体)
- Dijkstra 算法(代价、代价矩阵、行驶距离、K 条最短路径、经由路由、最近点)
- 双向 Dijkstra
- 旅行商问题(TSP)
- 网络流(最大流、Boykov-Kolmogorov、Edmonds-Karp、预流推进)
- 生成树(Kruskal、Prim 及其 BFS/DFS/行驶距离变体)
- 图组件(连通分量、强连通分量、双连通分量、关节点、桥)
- 转弯限制最短路径(TRSP)
- WithPoints 路由(边上任意位置)
- 图压缩与实用函数
快速开始
启用扩展(需要 PostGIS):
图的表示
pgRouting 使用返回边数据的 SQL 查询来表示图。标准边查询格式:
| 列 | 类型 | 说明 |
|---|---|---|
id | ANY-INTEGER | 边标识符 |
source | ANY-INTEGER | 起始顶点标识符 |
target | ANY-INTEGER | 终止顶点标识符 |
cost | ANY-NUMERICAL | 权重(source 到 target);负值表示排除该边 |
reverse_cost | ANY-NUMERICAL | 权重(target 到 source);默认 -1(不存在) |
无几何体的简单示例
创建一个图并查找最短路径:
函数族
Dijkstra - 最短路径
核心路由函数。支持一对一、一对多、多对一、多对多及组合签名。
返回:(seq, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)
一对一:
一对多:
多对多(无向):
组合:
Dijkstra 代价
仅返回聚合代价,不含路径详情:
返回:(start_vid, end_vid, agg_cost)
Dijkstra 代价矩阵
为一组顶点生成代价矩阵:
Dijkstra 经由
按有序顶点序列规划路径:
Dijkstra 最近点
查找距离一组目标最近的顶点:
A* - 最短路径
使用 A* 启发式算法。需要边查询中包含额外的坐标列(x1、y1、x2、y2)。
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
directed | BOOLEAN | true | 图方向 |
heuristic | INTEGER | 5 | 距离启发式(0-5) |
factor | FLOAT | 1 | 单位换算因子 |
epsilon | FLOAT | 1 | 近似因子 |
另有:pgr_aStarCost、pgr_aStarCostMatrix
双向算法
双向变体从两端同时搜索:
pgr_bdDijkstra、pgr_bdDijkstraCost、pgr_bdDijkstraCostMatrixpgr_bdAstar、pgr_bdAstarCost、pgr_bdAstarCostMatrix
K 条最短路径(Yen 算法)
查找两个顶点之间的 K 条最短路径:
返回:(seq, path_id, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)
行驶距离
查找给定距离内可达的所有顶点:
返回:(seq, depth, start_vid, pred, node, edge, cost, agg_cost)
旅行商问题
基于矩阵的 TSP:
返回:(seq, node, cost, agg_cost)
欧几里得 TSP(直接使用坐标):
网络流
计算最大流及相关属性:
网络流的边 SQL 使用 capacity 和 reverse_capacity 替代 cost/reverse_cost。
生成树
Kruskal 算法:
Prim 算法:
图组件
转弯限制最短路径(TRSP)
带禁止路径限制的路由:
限制条件 SQL 格式:
| 列 | 类型 | 说明 |
|---|---|---|
path | ARRAY[ANY-INTEGER] | 禁止的边 ID 序列 |
cost | ANY-NUMERICAL | 禁止路径的代价 |
WithPoints - 任意位置路由
在边上任意点(不仅是顶点)之间路由:
点 SQL 格式:
| 列 | 类型 | 默认值 | 说明 |
|---|---|---|---|
pid | ANY-INTEGER | 点标识符 | |
edge_id | ANY-INTEGER | 最近的边 | |
fraction | ANY-NUMERICAL | 在边上的位置(0-1) | |
side | CHAR | b | r(右侧)、l(左侧)、b(两侧) |
图压缩
通过压缩顶点简化图:
实用函数
使用几何体
构建路由拓扑
从空间边中提取顶点并构建拓扑:
基于几何体长度设置代价
获取路径几何体
将路由结果与边几何体结合:
性能优化
将查询限制在感兴趣的区域内,减少处理的边数:
全对最短路径
用于计算所有顶点对之间的距离:
返回:(start_vid, end_vid, agg_cost)