4

我正在尝试找到一种从线串上的最近点路由到我当前位置(纬度,经度)的方法。到目前为止,我能够获得最短路径,但它从线串(又名源)的最开始开始。我正在使用 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;

origin 是起始路线的 id

sourcePos 是沿线串偏移的距离

目的地是结束线串的ID

destPos 是结束线串的分数

此处指定的所有内容:http: //docs.pgrouting.org/2.0/en/src/trsp/doc/index.html

4

1 回答 1

3

这是因为 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

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

希望这个帮助...

于 2018-09-14T14:09:52.667 回答