如何在路线上添加偏移量?


13

编辑:

样品

我想说明我的问题。假设您位于“ A点”,并且想转到“ B点”。由于不是源/目标节点,因此该点将不在“ at_2po_4pgr”表中。然后,我将搜索点A和B(绿色点)的最近节点。此后,我可能会使用绿点ID执行shortest_path调用,并且会获得“橙色”路径。但是在第一种情况下,要获得实际路径成本(距离),我必须减去“ offsetA”,在第二种情况下,必须添加de“ offset B”。要计算红点和绿点之间的距离,我运行以下查询:

SELECT * FROM st_distance( ST_GeomFromText('POINT(-3.6963314 42.3498066)',4326), ST_GeomFromText('POINT(-3.6954276 42.3479634)',4326))

我如何知道何时添加或减去偏移量?

对不起我的英语不好!


1
欢迎使用gis.stackexchange。这是一个问答站点,其中每个线程应恰好包含一个问题及其答案。请为问题#3打开一个单独的线程。#2在gis.stackexchange.com/questions/33471/…中
Underdark

1
我也有同样的问题。您找到解决方案了吗?非常感谢
Robert

1
请在答案部分中发布您的解决方案。然后可以对其进行投票。
Underdark

Answers:


2

我认为您不能依靠最近的顶点。想象一下,源和目标位于靠近同一顶点的同一边上。

您宁愿考虑三个!不同的情况:

  1. 顶点是最近的点。
  2. 边缘的形式节点是正确的
  3. 边缘线本身更近。(正交)

抱歉,这不是正确的答案。pgr_trsp-转向限制最短路径(TRSP)具有偏移量,如@amball答案所示。
胡安·卡洛斯·奥罗佩萨


1

我将解释我找到的解决方案(也许不是最好的)。

根据发布的图片,让我们假设我们在A点,然后我们将前往B点。如前所述,这不是顶点(使用osm2po工具生成的表中的源/目标)。

因此,我们需要知道步行/驾驶的方向。如果我们通过橙色路径从最近的顶点到点A(点绿色),则必须减去点A和点绿色(最近的顶点)之间的偏移量。但是,如果必须经过Calle Almirante Bonifaz街,则应在该边的长度上添加偏移量(从绿色点到Calle Almirante BonifazCalle San Juan之间的交点)。

我运行以下查询以获取最短路径(您需要pgRouting扩展,在这里pgRouting-此处安装和要求安装和要求):

SELECT gid, cost, st_astext(the_geom) as the_geom FROM dijkstra_sp_delta('xx_2po_4pgr', source_vertex, target_vertex, 0.1);

这导致代表完整路线的一组边。例如,此查询的一个可能的输出可能是:

可能的输出

其中字段gid(在osm2po生成的表中的id)代表边缘标识符。好吧,我们必须检查起点和终点的偏移(点A / B)。

如果检查起始偏移量,则必须检查在上述查询中获得的一组边的第一条边是否与到Point A的最近路径相同。如果它们匹配,那么我们将减去偏移量。如果它们不匹配,我们将添加偏移量。为了获得到点的最近链接,我运行以下查询:

SELECT * FROM find_node_by_nearest_link_within_distance(point, 0.1, 'xx_2po_4pgr') as id;

您必须调整此功能,以便它返回最近的边。首先,您必须修改link_point类型(添加最近的链接字段):

CREATE TYPE link_point AS
   (id integer,
    name character varying,
    nearest_link integer);
ALTER TYPE link_point
  OWNER TO postgres;

您还必须修改find_node_by_nearest_link_within_distance。只需添加最后一行(我仅显示该函数的摘录):

-- Searching for a nearest link

    FOR row in EXECUTE 'select id from find_nearest_link_within_distance('''||point||''', '||distance||', '''||tbl||''') as id'
    LOOP
    END LOOP;
    IF row.id is null THEN
        res.id = -1;
        RETURN res;
    END IF;
    link:=row.id;
    res.nearest_link:=link;

然后,您需要知道点(点A /点B)和最近的边(偏移)之间的距离。为此,我运行以下查询:

SELECT ST_Line_Locate_Point(geom , point)as offset; 

其中geom是osm2po生成的表中的the_geom字段。

在这一点上,我们将要添加或减去的偏移量。

最后,您需要知道边长以应用在上面的查询中获得的值并调整实数(如果使用几何类型,则必须规范化以计量获得的值。只需将111000乘以在查询):

select st_length(the_geom) from (select ST_ASTEXT(the_geom) as the_geom FROM dr_2po_4pgr WHERE id= edge_identifier)t";

如果我们要检查结束偏移量,那么我们将必须检查在上述查询中获得的一组路径中的最后一条路径是否与到终点(B点)最近的路径相同,并且我们将在/减去和以前一样

打扰一下我的英语。


1

在进行灌浆时,pgr_trsp-转弯限制最短路径(TRSP)会完全满足您的需求。

除了指定源节点和目标节点之外,您还可以指定源边缘和目标边缘,以及沿源和目标所在的边缘的分数。

(假设您知道最接近的边,可以使用ST_Line_Locate_Point从点几何中获取该分数。)

参见http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html#trsp

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.