У меня есть набор сценариев postgis, которые генерируют две таблицы - одну из набора точек и вторую группу дорог, которые их окружают. Все данные находятся в одной проекции, и оба вывода хранятся в таблицах postgres 9.2 с postgis 2.1
Была создана топология pgrouting сети дорог, и в таблице точек есть столбец, содержащий ближайший сегмент дороги.
Затем я хотел бы создать подмножество дорожной сети, которая представляет собой наименьшую сеть, которая соединяет все точки, используя что-то вроде минимального связующего дерева. Дорожная сеть является ненаправленной, а затраты - это просто длина маршрута.
Я могу сделать это в QGIS / Grass, используя семейство модулей v.net, но в идеале я бы хотел сохранить этот последний шаг и в SQL.
Я посмотрел на новую функцию postgis apspWarshall, но не знаю, как можно побудить его сосредоточиться на соединении точек, а не на всей сети.
Это короткий сценарий, который я собрал, пытаясь создать структуру, чтобы решить эту проблему, но я не вижу, где можно сфокусировать функцию, чтобы начать с подмножества ребер.
SELECT seq, id1 AS node, id2 AS edge, cost, the_geom
FROM pgr_apspWarshall('SELECT gid AS id,
source,
target,
st_length(the_geom) AS cost
FROM road_network
',
false, false
) AS tree
JOIN road_network As roads
ON tree.id2 = roads.gid
В задачах с кратчайшим путем по одному пути функция запрашивает начало и конец, но, очевидно, не во всех точках. В равной степени в Grass v.net.spanningtree и v.net.steiner ожидают набор точек и линий в качестве объединенной сети для работы.
У кого-нибудь есть предложения как это сделать в PostGIS?
Ответы:
Этот ответ не является полным или проверенным, но попробуйте что-то вроде этого:
по вопросам / 39210 :
Я думаю, что это не очень эффективно.
источник
@ Adrian, я действительно не знаком с результатами pgrouting, однако документация очень подробная. Мой ответ основан на двухступенчатой функции, которая будет очень неэффективна в SQL, но [вероятно] даст результаты. Это [непроверенное] решение НЕ оптимизирует, которая является лучшей отправной точкой, но сократит всю маршрутную сеть до тех краев, которые соединяют все остановки, а затем эффективно направляет ко всем остановкам.
Шаг 1 (поднабор подмножества дорожной сети, который соединяет все остановки). При этом используется функция маршрутизации с несколькими назначениями (путь K Dijkstr), чтобы возвратить набор путей, которые (когда стоимость <> -1) на самом деле соединяют все ваши останавливается.
Шаг 2 (окончательный выбор минимальных путей на основе указанных выше поднаборов путей дорожной сети, которые соединяют все остановки). По сути, это то, с чего вы начали, но я предлагаю вам приравнять вашу дорожную сеть к первоначальному результату на id1 (путь). так что в конечном маршруте фельдмаршала используется только подмножество дорог :
Итак, в итоге ... внутренний запрос маршрутизации k_dijkstra_path сокращает общую дорожную сеть только до путей, соединяющих все ваши остановки, тогда внешняя маршрутизация fField_Warshal использует только эти идентификаторы ребер для решения запроса оптимизации пути .... возможно.
источник