pgRouting назначает номер источника и цели

У меня есть шейп-файл речной сети, и я использую pgRouting 2.0 для его маршрутизации. Я использую следующий код sql, чтобы сделать его маршрутизируемым,

alter table tc_15000_w_area add column source integer;
alter table tc_15000_w_area add column target integer;
select pgr_createTopology('tc_15000_w_area', 0.0001, 'the_geom', 'gid');

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

введите здесь описание изображения

фиолетовая линия это река

красные точки - это узлы (вершины)

красные цифры - это номера узлов

каждый сегмент реки имеет свой источник (узел) и цель

Но я проверяю результирующую таблицу и обнаруживаю, что узел № 11 всегда является целью. Это приведет к тому, что по крайней мере одно из краев будет иметь неправильное направление (направление потока).

введите здесь описание изображения

Может ли pgRouting назначить номера источника и цели и сделать направление от источника к цели таким же, как направление потока? Если нет, что я могу сделать?

Я использовал разные допуски в коде sql, но получил тот же результат, и я также получил тот же результат, используя pgRouting версии 1.x под PostgreSQL 8.4.


person Heinz    schedule 27.05.2014    source источник


Ответы (1)


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

учитывая сегмент края в вашей таблице геометрии, прежде чем вы запустите pgr_createtopology(), как вы узнаете направление потока? исходя из направления цифровизации? Мы не смотрим на это при присвоении номеров. Номера присваиваются в порядке очереди по мере обработки ребер.

Чтобы решить вашу проблему, вам, вероятно, потребуется написать алгоритм перенумерации узлов, который работает примерно так: 1. запустите pgr_createtopology() 2. из стока сети (т.е. сток речной сети) выполните поиск в глубину и присвойте номера в обратном порядке (наибольшая от стока, меньшая по мере движения вверх по течению).

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

person Stephen Woodbridge    schedule 27.05.2014
comment
Если я знаю положение каждого ребра, то я могу проверить их источник --> целевое направление по направлению потока. Таким образом, основная проблема заключается не в номере, назначенном pgRouting для вершины, а в роли исходной (или целевой) вершины, назначенной pgRouting. - person Heinz; 28.05.2014
comment
Чтобы назначить номера так, как вы хотите, НЕ может быть сделано с помощью pgr_createtopology(). То, что вы ищете, является результатом некоторого алгоритма анализа графа, как я описал выше. Упростим задачу до одного ребра. Как присвоить номера этому ребру? Какой конец является источником, а какой - стоком/стоком? - person Stephen Woodbridge; 29.05.2014
comment
Я обнаружил, что сообщение, похоже, решает эту проблему, dirkraffel.com/2011/09/06/, но я не знаю, может ли это использоваться функцией Driving_distance, потому что код в посте, похоже, не переназначает номера источников и целей? - person Heinz; 19.06.2014