使用pgrouting求任意两点的最短路径

使用pgrouting求任意两点的最短路径,第1张

概述要利用rgrouting实现像QGIS那样求任意两点间的最短路径,可以按照以下步骤使用pl/pgsql进行自定义函数: 1 函数的参数为:_myShortPath(startxfloat, starty float,endx float,endy float,costfile varchar),前四个参数为起点和终点的坐标,最后一个参数为最短路径分析时的cost字段; 2 分别找出距离起点和终点最

要利用rgrouting实现像QGIS那样求任意两点间的最短路径,可以按照以下步骤使用pl/pgsql进行自定义函数:

1 函数的参数为:_myShortPath(startxfloat,starty float,endx float,endy float,costfile varchar),前四个参数为起点和终点的坐标,最后一个参数为最短路径分析时的cost字段;


2 分别找出距离起点和终点最近的两条线,可以使用:

ST_DWithin(geography gg1,geography gg2,double precisiondistance_meters);

在距离gg2在distance_meters范围内的gg1的线,之后使用ST_distance(geometryg1,geometry g2);进行排序,并取第一个。


3 找出在上一步求出最近线上距离起点(终点)最近的点。使用:

ST_ClosestPoint(geometryg1,geometry g2)


4 根据第2步求出的离起点最近先的target和离终点最近线的source,求最短路径。使用

SELECTst_linemerge(st_union(b.geom)) into v_res

FROMpgr_kdijkstraPath(

'SELECTID,source,target,' || costfile ||' as cost FROM route',

v_startTarget,array[v_endSource],true,false

)a,

routeb

WHEREa.ID3=b.ID

GROUPby ID1

ORDERby ID1;

5 将求出的路径与第2步找出的两条线进行合并,可以使用:

st_linemerge(ST_Union(array[v_res,v_startline,v_endline]))


6 求出第3步找出的点在上一步中线的上的百分比,可以使用:

ST_line_Locate_Point(v_res,v_statpoint)


7 使用上一步求出的百分比来截取第5步的结果:

ST_line_SubString(v_res,v_perStart,v_perEnd)

8 最后将截取的结果返回;



具体代码:

create function _myShortPath(startx float,costfile varchar) returns  geometry as$body$declare	v_startline geometry;--离起点最近的线	v_endline geometry;--离终点最近的线		v_startTarget integer;--距离起点最近线的终点	v_endSource integer;--距离终点最近线的起点	v_statpoint geometry;--在v_startline上距离起点最近的点	v_endpoint geometry;--在v_endline上距离终点最近的点		v_res geometry;--最短路径分析结果	v_perStart float;--v_statpoint在v_res上的百分比	v_perEnd float;--v_endpoint在v_res上的百分比	v_shPath geometry;--最终结果begin	        	--查询离起点最近的线	select geom,target into v_startline,v_startTarget from  route where	ST_DWithin(geom,ST_Geometryfromtext('point('|| startx ||' ' || starty ||')'),0.015)	order by ST_distance(geom,ST_GeometryFromText('point('|| startx ||' '|| starty ||')'))  limit 1;		--查询离终点最近的线	select geom,source into v_endline,v_endSource from  route where	ST_DWithin(geom,ST_Geometryfromtext('point('|| endx || ' ' || endy ||')'),ST_GeometryFromText('point('|| endx ||' ' || endy ||')'))  limit 1;	--如果没找到最近的线,就返回null	if (v_startline is null) or (v_endline is null) then		return null;	end if ;	select  ST_ClosestPoint(v_startline,ST_Geometryfromtext('point('|| startx ||' ' || starty ||')')) into v_statpoint;	select  ST_ClosestPoint(v_endline,ST_GeometryFromText('point('|| endx ||' ' || endy ||')')) into v_endpoint;	        --最短路径	SELECT st_linemerge(st_union(b.geom)) into v_res	FROM pgr_kdijkstraPath(	'SELECT ID,v_startTarget,false	) a,route b	WHERE a.ID3=b.ID	GROUP by ID1	ORDER by ID1;	--如果找不到最短路径,就返回null	if(v_res is null) then		return null;	end if;		--将v_res,v_endline进行拼接	select  st_linemerge(ST_Union(array[v_res,v_endline])) into v_res;		select  ST_line_Locate_Point(v_res,v_statpoint) into v_perStart;	select  ST_line_Locate_Point(v_res,v_endpoint) into v_perEnd;	--截取v_res	SELECT ST_line_SubString(v_res,v_perEnd) into v_shPath;	 	return v_shPath;		end;$body$LANGUAGE plpgsql VolATILE STRICT

select_myShortPath(119.274,26.0649,119.258,26.019,'length') intoshortPath;

在QGIS中打开shortPath,可以看出结果与在QGIS执行最短路径结果一致:

总结

以上是内存溢出为你收集整理的使用pgrouting求任意两点的最短路径全部内容,希望文章能够帮你解决使用pgrouting求任意两点的最短路径所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1177670.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存