我遇到了有关路由algorithm pgr_withPoints()
的问题。我有一个带有列(gid,geom,街道名称,长度,来源,目标)的表'fussg_routing',一个带有fussg_routing_vertices_pgr
和nodes_id
的表node_geometry
(您可以加入通过node_id
和来源的表格)。使用算法pgr_dijkstra()
时,一切正常,并且我得到了最接近起点和终点的节点之间的路由。
现在,我不尝试使用pgr_withPoints()
从最近的节点开始,而是从最近的街道上的最近点开始。
我已经创建了一个pois
表,类似于document中给出的示例表:
CREATE TABLE IF NOT EXISTS pois (
pid SERIAL PRIMARY KEY,
edge_id BIGINT,
side CHAR,
fraction FLOAT,
the_geom geometry,
newPoint geometry);
在下一步中,我插入了所需的数据:
WITH point_data AS
(SELECT * FROM "fussg_routing" ORDER BY ST_DISTANCE(ST_TRANSFORM(ST_PointFromText('POINT(8.675555580548018 50.10969977068385)', 4326), 25832), ST_TRANSFORM("fussg_routing".geom, 25832)) LIMIT 1)
INSERT INTO "pois" (pid, edge_id, fraction, the_geom, newpoint) values
((SELECT gid FROM point_data), -- as pid
(SELECT gid FROM point_data), -- as edge_id
(SELECT ST_LineLocatePoint(
ST_TRANSFORM((ST_DUMP(geom)).geom, 25832), ST_TRANSFORM(ST_PointFromText('POINT(8.675555580548018 50.10969977068385)', 4326), 25832)) FROM point_data), -- as fraction
(SELECT ST_TRANSFORM(ST_PointFromText('POINT(8.675555580548018 50.10969977068385)', 4326), 25832)), -- as the_geom
(SELECT ST_LineInterpolatePoint(
ST_TRANSFORM((ST_DUMP(geom)).geom, 25832),
(SELECT ST_LineLocatePoint(
ST_TRANSFORM((ST_DUMP(geom)).geom, 25832), ST_TRANSFORM(ST_PointFromText('POINT(8.675555580548018 50.10969977068385)', 4326), 25832)))) FROM point_data)); -- as newPoint
到目前为止,一切正常,并且所创建的几何以及edge_id
和分数都是应该的样子。
接下来,我正在尝试对以下查询之一应用pgr_withPoints()
算法:
SELECT * FROM pgr_withPoints(
'SELECT "gid" AS id, streetname, source, target, length AS cost FROM "fussg_routing"',
'SELECT 9601 AS edge_id, 0.448876481757386::float as fraction from "pois"',
5529,5708);
和
SELECT * FROM pgr_withPoints(
'SELECT "gid" AS id, streetname, source, target, length AS cost FROM "fussg_routing"',
'SELECT edge_id, fraction from "pois"',
5529,5708);
这里的输出为零。
单独查询两个部分的输出看起来还可以。
第一:(例如限制2):
id | streetname | source | target | cost
---------------------------------------------------------------------
14365 | Parkweg | 47 | 48 | 144.668586776812
14677 | Altenhoferalle | 49 | 50 | 30.6757233003559
秒:
edge_id | fraction
------------------------------
9601 | 0.448876481757386
9590 | 0.0933449381876742
起点和终点(5529,5708)是最接近给定坐标的节点。使用负的起始和/或终止顶点也不起作用。
分数在0到1之间,不等于0或1。
添加与pois表最接近node_id
的列不会产生任何影响。
关于算法,我注意到一些问题,例如:
0.448876481757386::float
作为分数)。否则,发生错误:意外的列“分数”类型。预期的任何数值范围: SQL函数“ pgr_withpoints”语句1
the_geom
几何而不是geom几何(点,25832)) 。我不知道问题是否在这里发生? 我正在使用: 在x86_64-pc-linux-gnu上的PostgreSQL 10.7(Ubuntu 10.7-0ubuntu0.18.04.1),由gcc(Ubuntu 7.3.0-27ubuntu1〜18.04)7.3.0,64位编译。