使用pgr_withPoints()

时间:2019-05-03 09:59:58

标签: postgresql postgis pgrouting

我遇到了有关路由algorithm pgr_withPoints()的问题。我有一个带有列(gid,geom,街道名称,长度,来源,目标)的表'fussg_routing',一个带有fussg_routing_vertices_pgrnodes_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的列不会产生任何影响。

关于算法,我注意到一些问题,例如:

  • 创建pois表时,分数列被定义为float,但必须在pgr_withPoints查询中将其重新定义为浮点(如0.448876481757386::float作为分数)。否则,发生错误:
  

意外的列“分数”类型。预期的任何数值范围:   SQL函数“ pgr_withpoints”语句1

  • 仅在创建兴趣点表时未定义EPSG时,才使用示例数据和example创建输出(例如: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位编译。

0 个答案:

没有答案