之前有篇文章是等时圈的计算链接,在这篇文章中使用的技术是turf的等值线与高德或者mapbox的接口。在这个解决方案中其实比较受接口的限制,而且这种计算方式速度也是个问题,构建一个等时圈需要10s。当时也就忍了,最近在使用Logo
pgRouting过程中有一些新的想法。
在pgRouting中的pgr_drivingDistance 函数能够帮我实现想要的工作。
pgr_drivingDistance - Returns the driving distance from a start node.
Synopsis
Using Dijkstra algorithm, extracts all the nodes that have costs less than or equal to the value distance. The edges extracted will conform the corresponding spanning tree.
pgr_drivingDistance(edges_sql, start_vid, distance)
pgr_drivingDistance(edges_sql, start_vid, distance, directed)
pgr_drivingDistance(edges_sql, start_vids, distance, directed, equicost)
RETURNS SET OF (seq, [start_vid,] node, edge, cost, agg_cost)
在构建好路网拓扑后,能够计算一定距离的所有节点。比如:通过该函数能够计算5公里能够到达的节点。在一个足够大的网络中,就能将距离转换成时间,也就是某时间内到达的节点。
SELECT
target as id,rc.geom
FROM
pgr_drivingDistance (
'SELECT gid as id, source, target, length as cost FROM road_china where st_intersects(st_transform(st_buffer(st_transform(st_geomfromtext(''POINT(120.18 30.30)'',4326),3857),1000*100),4326),geom)', --路网表
2100555, --节点的ID
5*1000, --距离 5公里
FALSE
) dd,
road_china rc
WHERE rc.gid = dd.edge
以上脚本就是以某点为中心,5公里可达的节点。如下图:
SELECT st_concavehull(st_collect(array(SELECT
rc.geom
FROM
pgr_drivingDistance (
'SELECT gid as id, source, target, length as cost, reverse_cost FROM road_china where st_intersects(st_transform(st_buffer(st_transform(st_geomfromtext(''POINT(124.00403544 42.53465196)'',4326),3857),1000*50*2),4326),geom)',
1811194,
1000*10,
FALSE
) dd,
road_china rc
WHERE rc.gid = dd.edge)),0.981)
上面代码则是根据节点,生成最小凸包,这个可以当成等时面中的一个面。如下图
同时计算1、2、3、4公里的等距面,如下图:
因此采用这种方法,不需要借助外部接口,前端也只是做渲染,不需要做那么多的计算。需要做的就是建立路网集合。