分析结果在QGIS可视化
常见的网络分析
如何输出几何图形
- 一般使用分析函数以
pgr_dijkstra
,分析出的结果如下是一张表,无法用直观的图形显示:
select * from pgr_dijkstra(
'select id, source, target, cost from road',
1,9,false
);
-
通过
postgis
函数将其转换为图形:- 分析这张表可以看出
edge
表示边的编号,那么只需要将其与带空间geom
列的表关联即可得到空间属性
select * from pgr_dijkstra( 'select id, source, target, cost from road', 1,9,false) as res join road as pt on res.edge = pt.id;
- 如果只需要如何一个几何图形,使用
postgis
的ST_Union
函数合并几何即可
select ST_Union(geom) as route from pgr_dijkstra( 'select id, source, target, cost from road', 1,9,false ) as res join road as pt on res.edge = pt.id;
- 分析这张表可以看出
分析函数
pgr_dijkstra
:基于迪杰斯特拉算法的最短路径分析
- 单点到单点
select * from pgr_dijkstra(
'select id, source, target, cost from road',
1,9,false
)
- 单点到多点\多点到单点
SELECT * FROM pgr_dijkstra(
'SELECT id, source, target, cost FROM road',
1, -- 起点
ARRAY[8, 9], -- 终点数组
false -- 图是无向的
);
- 多点到多点
SELECT * FROM pgr_dijkstra(
'SELECT id, source, target, cost FROM road',
ARRAY[1, 2], -- 起点
ARRAY[8, 9], -- 终点数组
false -- 图是无向的
);
- 表格组合
例如有如下表:
source | target |
---|---|
5 | 6 |
5 | 10 |
6 | 5 |
6 | 15 |
6 | 14 |
需要依次找出source
到target
SELECT * FROM pgr_dijkstra(
'SELECT id, source, target, cost, reverse_cost FROM edges',
'SELECT source, target FROM combinations',
false
);
pgr_KSP
:基于Dijkstra的K条最短路径算法
也和
pgr_dijkstra
算法一样分为一对一,多对一,多对多,组合
-- 语法
pgr_KSP(Edges SQL, start vid, end vid, K, [options])
-- 实例:得到6到17的2条路径
SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edges',
6, 17, 2);
相关参数
- 当heap_paths为false时:
函数返回最多K条路径。这里的K是pgr_KSP函数的第四个参数,表示要查找的最短路径数量。例如,如果K设置为3,那么函数会返回从起点到终点的3条最短路径(如果有这么多路径的话)。 - 当heap_paths为true时:
函数会返回在处理过程中计算出的所有路径。具体来说,假设最短路径有N条边,那么堆(heap)中大概会包含超过N * K条路径,尤其是当K的值较小且K大于5时。这是因为pgr_KSP函数在寻找最短路径的过程中,会将一些中间路径存储在堆中,以便后续进一步筛选和计算。当heap_paths为true时,这些中间路径也会被返回,而不仅仅是最终筛选出的K条最短路径。
SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edges',
6, 17, 2,
directed => false, heap_paths => true
);
pgr_dijkstraCost
、pgr_dijkstraCostMatrix
、pgr_drivingDistance
计算相关
pgr_dijkstraCost
:计算最短路径的花费,也是4种方式
SELECT * FROM pgr_dijkstraCost(
'SELECT id, source, target, cost FROM road',
1, ARRAY[6,5]);
pgr_drivingDistance
:指定距离distance
能到的点
-- 语法
pgr_drivingDistance(Edges SQL, Root vid, distance, [directed])
pgr_drivingDistance(Edges SQL, Root vids, distance, [options])
-- 实例
SELECT * FROM pgr_drivingDistance(
'SELECT id, source, target, cost FROM road',
1, 8000) as res
JOIN road ON res.edge = road.id;
pgr_dijkstraCostMatrix
:计算成本矩阵
例如:需要计算节点1,2,3,4,11到彼此之间所花费的成本
--语法
pgr_dijkstraCostMatrix(Edges SQL, start vids, [directed])
-- 实例
SELECT * FROM pgr_dijkstraCostMatrix(
'SELECT id, source, target, cost FROM road',
array[1,2,3,4],
false)
如果存在不可到达的点
11,12不可到达,使用其不会出现任何查询结果