Як додати зрушення до маршруту?


13

Відредаговано:

зразок

Я хочу проілюструвати своє запитання. Припустимо, ви перебуваєте в "Точці А" і хочете перейти до "Точки Б". Ці точки не були б у таблиці "at_2po_4pgr", оскільки це не вузли джерела / цілі. Тоді я б шукав найближчий вузол для точок A і B (зелені точки). Після цього я можу здійснити виклик найкоротшого_путника за допомогою ідентифікаторів зелених точок і отримаю "помаранчевий" шлях. Але для отримання реальної вартості шляху (відстані) у першому випадку мені доведеться підсунути "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
У мене така ж проблема. ви знайшли якесь рішення? Велике спасибі
Роберт

1
Будь ласка, опублікуйте своє рішення у розділі відповідей. Тоді це може бути відхилено.
underdark

Відповіді:


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 ви або вибираєте початкову або кінцеву точку посилання, або створюєте "віртуальний" вузол, розділивши посилання на два.


1

Я збираюся пояснити знайдене рішення (можливо, не найкраще).

Згідно з повідомленням зображення, давайте припустимо , що ми знаходимося в точці А , і ми будемо йти до точці B . Як я пояснював вище, ці точки не є вершиною (джерело / цілі в таблиці, згенеровані інструментом osm2po).

Завдяки цьому нам потрібно знати напрям ходьби / руху. Якщо ми переходимо від найближчої вершини до точки A (крапка зелена) через помаранчевий шлях, нам слід було б підсунути зміщення між точкою A і точкою зеленою (найближча вершина). Але якби нам довелося пройти вулицю Калле Алміранте Боніфаз , то нам слід додати зміщення до довжини цього краю (від точки зеленого до перетину між Калле Алміранте Боніфаз та Калле Сан Хуан ).

Я запускаю наступний запит, щоб отримати найкоротший шлях (потрібне розширення 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 ( id у osm2po створеній таблиці) являє собою ідентифікатор краю. Ну, ми повинні перевірити компенсації на початку та в кінці (бали A / B).

Якщо ми перевіряємо початок зсуву, ми повинні перевірити , якщо перший край безлічі ребер , отриманих в наведеному вище запит одне і те ж до найближчого шляху до точці A . Якщо вони збігаються, ми підсумовуємо компенсацію. Якщо вони не збігаються, ми додамо компенсацію. Щоб отримати дещо найближче посилання до точки, я запускаю такий запит:

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

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

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

Ви також повинні змінити find_node_by_nerely_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;

Тоді вам потрібно знати, яка відстань між точкою ( точка А / точка В ) та найближчим краєм (зміщення). Для цього я запускаю цей запит:

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";

Якщо ми перевіримо кінцеве зміщення, то нам доведеться перевірити, чи останній шлях з безлічі шляхів, отриманих у вищезазначеному запиті, такий самий, як найближчий шлях до кінцевої точки ( точка В ), і ми додали б / підсумки так само, як і раніше.

Вибачте мою англійську.


1

Під час pgrouting pgr_trsp - обмеження повороту найкоротшим шляхом (TRSP) робить саме те, що ви шукаєте.

Замість вказівки джерела та цільових вузлів ви можете вказати вихідні та цільові краї та фракцію уздовж краю, де розташовані ваше походження та місце призначення.

(Ви можете використовувати ST_Line_Locate_Point, щоб отримати цей дріб з геометрії точки, якщо припустити, що ви знаєте найближчий край.)

Див. Http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html#trsp

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.