Как добавить смещения к маршруту?

13

Отредактировано:

образец

Я хочу проиллюстрировать свой вопрос. Предположим, что вы находитесь в «Точке A» и хотите перейти в «Точку B». Эти точки не будут в таблице "at_2po_4pgr", потому что они не являются узлами источника / цели. Затем я бы искал ближайший узел для точек A и B (зеленые точки). После этого я мог бы выполнить вызов shorttest_path с использованием идентификаторов зеленых точек и получить «оранжевый» путь. Но для получения реальной стоимости пути (расстояния) в первом случае мне нужно вычесть «offsetA», а во втором случае добавить «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. Ответ
Подземье
1
У меня точно такая же проблема. Вы нашли какое-нибудь решение? Большое спасибо
Роберт
1
Пожалуйста, опубликуйте свое решение в разделе ответов. Тогда это может быть проголосовано.
Подземье

Ответы:

2

Я не думаю, что вы можете положиться на ближайшую вершину. Представьте, что источник и цель расположены на одном ребре близко к одной и той же вершине.

Вы бы предпочли три! разные случаи:

  1. вершина является ближайшей точкой.
  2. узел формы ребра является правильным
  3. сама линия края ближе. (Ортогональной)
Карстен
источник
Извините, но это не правильный ответ. pgr_trsp - ограничение кратчайшего пути поворота (TRSP) смещено, как показано для ответа @amball.
Хуан Карлос Оропеза
7

Вы можете найти такую ​​функцию здесь: https://github.com/pgRouting/pgrouting-contrib/blob/master/wrapper/routing_core_smart.sql#L69

Он ищет ближайшую ссылку в сети, что обычно дает лучший результат. Если вы используете Shooting Star, вы можете начать маршрутизацию от / до этой ссылки. Для A * или Dijkstra вы либо выбираете начальную или конечную точку ссылки, либо создаете «виртуальный» узел, разделяя ссылку на две части.

dkastl
источник
1

Я собираюсь объяснить решение, которое я нашел (возможно, не лучший).

Согласно сообщению изображения, давайте предположим , что мы находимся в точке А , и мы будем идти к точке B . Как я объяснил выше, эти точки не вершины (источник / цели в таблице, сгенерированной с помощью инструмента osm2po).

В связи с этим нам нужно знать направление ходьбы / вождения. Если мы пойдем из ближайшей вершины в точку A (зеленая точка) по оранжевому пути, нам придется вычесть смещение между точкой A и зеленой точкой (ближайшая вершина). Но если нам нужно было пройти через улицу Calle Almirante Bonifaz , то мы должны добавить смещение к длине этого края (от зеленой точки до пересечения между Calle Almirante Bonifaz и Calle 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) представляет идентификатор края. Что ж, мы должны проверить смещения в начале и в конце (точки A / B).

Если мы проверяем начало смещения, мы должны проверить , если первый край множества ребер , полученных в приведенном выше запрос одно и то же до ближайшего пути к точке A . Если они совпадают, мы вычтем смещение. Если они не совпадают, мы добавим смещение. Чтобы получить ближайшую ссылку на точку, я запускаю следующий запрос:

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

Вы должны адаптировать эту функцию так, чтобы она возвращала ближайшее ребро. Сначала вы должны изменить тип link_point (добавить поле near_link ):

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; 

Где геом это the_geom поле в osm2po сгенерированной таблицы.

На этом этапе у нас будет смещение, чтобы добавить или вычесть.

Наконец, вам нужно знать длину края, чтобы применить значение, полученное в запросе выше, и откорректировать действительное (если вы работаете с типом геометрии, вам придется нормализовать полученное значение в метрах. Просто умножьте 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

В pgrouting pgr_trsp - Кратчайший путь ограничения поворота (TRSP) делает именно то, что вы ищете.

Вместо указания исходного и целевого узлов вы можете указать исходные и целевые ребра, а также дробь вдоль ребра, где находятся ваш источник и пункт назначения.

(Вы можете использовать ST_Line_Locate_Point, чтобы получить эту дробь из вашей точечной геометрии, предполагая, что вы знаете ближайший край.)

См. Http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html#trsp.

amball
источник