pgRouting:从最近的节点沿边开始路线规划

5
我正在尝试找到一种方法,从最接近的线段点路由到我的当前位置(纬度,经度)。到目前为止,我能够得到最短路径,但它始于线段的起点。我正在使用prg_trsphttp://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html,因为它有一个功能可以指定沿着线段的起始位置。我能够正确地计算沿着线段的距离并将值传递给函数,但无法弄清楚如何使用函数的结果(pgr_costResult [])来指定路线应从哪里开始(部分沿着最近的线段)。
我有一种感觉,当我加入从路由算法中的结果到我的边缘表以获取几何图形时,我做错了一些事情,因为当我加入它时,它使用边缘表的完整几何图形而不是段。虽然在查看文档时,我没有看到从路由函数返回段的地方。
以下是我想做的内容(红线)和我已经拥有的内容(蓝线)的截图,其中点是当前位置。红线来自于在QGIS中使用pgrouting插件和trsp(edge)选择。请参见下面的代码。非常感谢您的任何帮助!

enter image description here

SELECT st_linemerge(edgeTable.geom_way) FROM pgr_trsp('SELECT id, source, target, cost FROM edgeTable', 
    (SELECT id FROM origin),
    (SELECT * FROM sourcePos),
    (SELECT id FROM destination),
    (SELECT * FROM destPos),
    false, false) AS shortestPath
    JOIN edgeTable ON shortestPath.id2 = edgeTable.id;

origin是起始路线的id

sourcePos是沿着线串的偏移量

destination是终点线串的id

destPos是终点线串的分数

所有这些都在此处指定: http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html

1个回答

5

这是因为pgr_trsp()函数没有输出您期望的结果。在QGIS中,Pg_routing插件对从pgr_trsp()生成的路径进行捕捉。因此,您可以得到红线输出与您的点靠近的结果。因此,仅使用pgr_trsp()将无法给您所需的输出。您正在尝试做的有点复杂,但是有可能。以下是我解决此问题的方法。

    WITH 
    --Make a start point
    start_pt as (
            select st_setsrid(st_makepoint(204845.95, 2410097.47), 32643) as starting),
    --Make a End Point
    end_pt as (
            select st_setsrid(st_makepoint(204937.15, 2409430.86), 32643) as ending),
    --Select Closest source node and its geom for start point
    source_code AS (
            select source, geom from edgeTable order by st_distance(geom, (select starting from start_pt)) limit 1),
    --Select closest target node and its geom for end point
    target_code AS (
            select target, geom  from edgeTable order by st_distance(geom, (select ending from end_pt)) limit 1), 
    --Route Union from pgr_trsp()
    route as (
            SELECT ST_LineMerge(ST_union(geom)) as geom, round( CAST(float8 (st_length(ST_union(geom))/1000) as numeric), 2) as length from (
                SELECT geom FROM pgr_trsp(
                    'SELECT feat_id as id, source, target, cost_len as cost, geom FROM edgeTable',
                    (select source from source_code), (select target from target_code), false, false
                    ) as di JOIN edgeTable
                ON di.id2 = edgeTable.id) as foo)

--Finaly snap the route to precisely matach our start and end point  
select ST_Line_Substring(geom,
                            ST_LineLocatePoint(geom, (select starting from start_pt)),
                            ST_LineLocatePoint(geom, (select ending from end_pt)))
                                from route

我唯一的问题是在最后一个选择语句中,必须切换起始点和结束点。可以通过编写函数来处理此问题。这是我的输出结果:

希望这可以帮到您...


我不是100%确定,但如果你的源点和目标点恰好相反,这是否意味着你的最终线路将不包括最靠近所需点的边缘? - Geoff
它应该仍然能够工作,并包括最接近所需点的边缘,因为我在我的源代码和目标代码查询中选择它们并将它们与我的最终路线输出合并。 - Arun
1
谢谢。在新的PostGIS版本中,函数ST_Line_Substring被称为ST_LineSubstring - Jonas Frei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接