路径规划处理"/>
基于pgrouting的路径规划处理
Python微信订餐小程序课程视频
Python实战量化交易理财系统
对于GIS业务来说,路径规划是非常基础的一个业务,一般公司如果处理,都会直接选择调用已经成熟的第三方的接口,比如高德、百度等。当然其实路径规划的算法非常多,像比较著名的Dijkstra、A*算法等。当然本篇文章不是介绍算法的,本文作者会根据pgrouting已经集成的Dijkstra算法来,结合postgresql数据库来处理最短路径。
一、数据处理
路径规划的核心是数据,数据是一般的路网数据,但是我们拿到路网数据之后,需要对数据进行处理,由于算法的思想是基于有向图的原理,因此首先需要对数据做topo处理,通过topo我们其实就建立了路网中各条道路的顶点关系,下面是主要命令:
--开启执行路网topo的插件
create extension postgis;
create extension postgis\_topology;
--数据创建拓扑
ALTER TABLE test\_road ADD COLUMN source integer;
ALTER TABLE test\_road ADD COLUMN target integer;
SELECT pgr\_createTopology('test\_road',0.00001, 'geom', 'gid');
其中test_road是将路网数据导入到postgresql中的表名。
处理完topo之后,基本就够用了,我们就可以借助pgrouting自带的函数,其实有很多,我们选择pgr_dijkstra
CREATE OR REPLACE FUNCTION public.pgr\_dijkstra(IN edges\_sql text,IN start\_vid bigint,IN end\_vid bigint,IN directed boolean,OUT seq integer,OUT path\_seq integer,OUT node bigint,OUT edge bigint,OUT cost double precision,OUT agg\_cost double precision)RETURNS SETOF record AS
$BODY$
DECLARE
BEGINRETURN query SELECT *FROM \_pgr\_dijkstra(\_pgr\_get\_statement($1), start\_vid, end\_vid, directed, false);END
$BODY$LANGUAGE plpgsql VOLATILECOST 100ROWS 1000;
ALTER FUNCTION public.pgr\_dijkstra(text, bigint, bigint, boolean)OWNER TO postgres;
从函数输入参数可以看到,我们需要一个查询sql,一个起始点、一个结束点、以及是否考虑方向,好了了解到调用函数输入参数,我们就来写这个函数。
二、原理分析
一般路径规划,基本都是输入一个起点位置、一个终点位置然后直接规划,那么对于我们来说,要想套用上面的函数,必须找出起点位置target ,以及终点位置的source,然后规划根据找出的这两个topo点,调用上面的函数,来返回自己所需要的结果。
如何根据起始点找到对应的target呢,其实就是找离起点最近线的target,同理终点的source,其实就是找离终点最近线的source,当然将这两个点规划规划好之后,基本就可以了,但是最后还需要将起点到起点最近先的target连接起来,终点到终点最近线的source连接起来,这样整个路径规划就算完成了。
更多推荐
基于pgrouting的路径规划处理
发布评论