Прежде всего, немного фона.
Я работаю в региональном транзитном агентстве. Мы проводим «диагностику» нашего фидерного автобуса. Мы хотели бы знать, какая часть наших пользователей может сесть на автобус, чтобы добраться до железнодорожного вокзала, вместо того, чтобы брать их на машине. Это было сделано несколько раз за раз, но теперь мы используем gtfs в качестве основного источника данных, поэтому нам нужно переосмыслить нашу методологию.
Чтобы считаться «кормящим» поездом, автобусный маршрут должен иметь остановку на определенном расстоянии от железнодорожной станции (красные буферы). Кроме того, синхронность с железнодорожным сообщением очень важна, потому что, если ваш автобус прибывает на железнодорожную станцию за полчаса до поезда, время ожидания слишком велико, и вы захотите поспать еще 20 минут утром и забрать свою машину.
Допустим, вы берете линию А (синюю) на остановке 12. Вы выходите из автобуса на остановке 13. Автобус прибывает на остановку 13, которая является остановкой, чтобы добраться до железнодорожного вокзала № 1 за 5 минут до поезда. Это очень хорошо. Это означало бы, что все, кто ходит по этому автобусному маршруту на остановке с 1 по 13 включительно, прибудут за 5 минут до этого поезда.
Затем поезд, проходящий через очень густонаселенный район с множеством школ и переездов, вынужден сильно снизить скорость. Между тем, автобус принимает пассажиров на остановках с 14 по 17 и прибывает на железнодорожный вокзал № 2 за 10 минут до этого поезда. Таким образом, пассажир, садящийся в автобус на остановках с 14 по 17, будет ждать 10 минут после прибытия на вокзал. Таким образом, вдоль этой автобусной линии пассажиры, садящиеся на автобус на остановках 1-13, имеют время ожидания 5 минут, тогда как пассажиры, садящиеся на автобус на остановках 14-17, имеют время ожидания 10 минут.
Линия B, на другой стороне пути, проходит около Железнодорожного вокзала № 1, но ее остановки слишком далеко, чтобы рассмотреть возможность «кормления» Железнодорожного вокзала № 1. Он прибывает на вокзал № 2 за 7 минут до поезда (делайте это для каждого поезда в утренний час пик; он очень хорошо синхронизирован). Таким образом, пассажиры по линии B, которые сядут на автобус повсюду от остановки 1 до 59, будут ждать 7 минут.
Теперь мой вопрос. Как только я определил, что остановки LineA.13 и LineA.17 питают мой поезд (это было сделано пространственно, в PostGIS), и что время ожидания при посадке на автобус до остановки № 13 составляет 5 минут, а после время ожидания 10 минут, как я могу назначить время ожидания всем остановкам перед ними?
Я хотел бы сделать это в Postgres / PostGIS (pl / pgsql или pl / python), но я также могу использовать чистый python (OS или arcpy).
Я думаю, я мог бы вернуться назад. Итак, как только я нашел подходящую остановку (здесь LineA.17), назначьте то же время ожидания для остановки 16, затем 15 ..., пока я не нашел другую остановку, которая соответствует моим критериям (LineA.13), а затем назначьте остальные из остановок, то же время ожидания, что и 13.
Я понятия не имею, как создать такой цикл, хотя. Я не думаю, что я могу сделать это в SQL, поэтому мне пришлось бы использовать процедурный язык в PostgreSQL.
У меня была идея использовать pgRouting, чтобы найти маршрут между остановками каждого фидера, чтобы линия А была разбита на две части (остановки с 1 по 13, а затем с 13 до 17). Это будет проще?
Следующим шагом будет использование pgRouting для расчета времени вождения от всех остановок, у которых есть время ожидания (извините до LineA.18 и более!) И сравнение этого с расписанием автобуса для расчета конкурентоспособности (это занимает 5 минут больше в автобусе, что в машине?)
Любые идеи? Обычно я выкладываю длинный сценарий незавершенного производства, чтобы показать усилия, которые я уже приложил, но я застрял!
Ответы:
На самом деле создать нужный цикл действительно легко с SQL:
Скрипки .
Также было бы легко, скажем, суммировать время передачи от остановки к остановке.
И вы можете использовать обычную pgRouting, если только вам удастся преобразовать маршруты во временный график (с узлами, представляющими время отправления и время для стоимости маршрута).
источник
ORDER BY
пункт. Первые два столбца должны остаться, поскольку они находятся вDISTINCT ON
предложении, но в остальном все разрешено: sqlfiddle.com/#!1/24fab/2В прошлогодней программе Google Summer of Code студент реализовал функцию pgRouting для мультимодальной маршрутизации. Это не вошло в новую версию 2.0, так что, вероятно, сейчас это не работает, но вы можете взглянуть на доступные ресурсы, чтобы узнать, полезно это или нет:
Было бы неплохо добавить эту функцию в следующий выпуск, поэтому, пожалуйста, свяжитесь с разработчиком списка рассылки для координации необходимой работы на тот случай, если вам интересно: http://pgrouting.org/support.html
источник