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

Log*_*n M 6 postgresql pgrouting

我正在尝试找到一种从线串上最近的点到我当前位置(纬度,经度)的路线。到目前为止,我能够获得最短路径,但它从线串的最开头(也称为源)开始。我正在使用 prg_trsp http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html 因为它具有指定沿线串的起始位置的功能。我能够正确计算沿线串的距离并将值传递给函数,但无法弄清楚如何使用函数 (pgr_costResult[]) 的结果来指定路线应从何处开始(部分沿最近的线串)。

当我将路由算法的结果连接到边缘表以获取几何图形时,我有一种感觉,我的连接做错了,因为当我连接时,它使用边缘表的完整几何图形而不是段。虽然,查看文档,我没有看到从路由函数中获取返回段的位置。

下面是我正在尝试执行的操作(红线)和我所拥有的(蓝线)的屏幕截图,该点是当前位置。红线来自于使用 qgis 中的 pgrouting 插件和 trsp(edge) 选择。

参见下面的代码:

任何帮助将非常感激!

在此输入图像描述

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;
Run Code Online (Sandbox Code Playgroud)

origin 是起始路线的 id

sourcePos 是沿线串偏移的距离

目的地是结束线串的id

destPos 是结束线串的分数

全部按此处指定:http ://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html

Aru*_*run 6

这是因为 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
Run Code Online (Sandbox Code Playgroud)

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

希望这个帮助...