Служба подачі автобусів


9

Перш за все, трохи тла.

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

типовий транспортний автобус

Щоб вважатись "годуванням" поїзда, автобусний маршрут повинен мати зупинку на певній відстані від залізничного вокзалу (червоні буфери). Також синхронність із послугою поїзда є дуже важливою, тому що якщо ваш автобус приїжджає на залізничний вокзал за півгодини до поїзда, час очікування занадто довгий, і вам захочеться спати ще 20 хвилин вранці та сісти на машину.

Скажімо, ви їдете на лінії зупинки 12. Блакитна. Ви зупиняєтесь на автобусі на зупинці 13. Автобус прибуває на зупинці 13, яка є зупинкою, щоб їхати до залізничного вокзалу №1 за 5 хвилин до поїзда. Це дуже добре. Це означає, що кожен, хто їде на автобусному маршруті на зупинці від 1 до 13, прибуде за 5 хвилин до цього поїзда.

Тоді поїзд, проходячи через дуже густонаселену територію з безліччю шкіл та переїздів, змушений значно зменшити швидкість. Тим часом автобус підбирає пасажирів на зупинці 14 до 17 та прибуває на залізничний вокзал №2 за 10 хвилин до цього поїзда. Таким чином, пасажир, який їде в автобусі на зупинках 14 - 17, матиме час очікування 10 хвилин, як тільки приїде на залізничну станцію. Так, на цій автобусній лінії пасажири, які їдуть на автобусі на зупинці 1 - 13, мають тривалість очікування 5 хвилин, коли ті, хто їде в автобусі на зупинках 14 - 17, мають час очікування 10 хвилин.

Лінія В, з іншого боку колії, проходить біля залізничного вокзалу №1, але її зупинки занадто далеко, щоб розглянути можливість "годування" залізничного вокзалу №1. Він прибуває на залізничний вокзал №2 за 7 хвилин до поїзда (робити це для кожного поїзда протягом ранкової години пік; він дуже добре синхронізований). Тож пасажири по лінії В, їхавши на автобусі скрізь від зупинки 1 до 59, мали б час очікування 7 хвилин.

Тепер моє запитання. Після того, як я визначив, що зупинки LineA.13 і LineA.17 подають мій потяг (це було зроблено просторово, в PostGIS), і що час очікування під час руху автобуса на зупинці до №13 становить 5 хвилин, але після закінчення час очікування - 10 хвилин, як я можу призначити час очікування на всю зупинку перед ними?

Я хотів би зробити це в Postgres / PostGIS (pl / pgsql або pl / python), але я можу також використовувати чистий python (ОС або arcpy).

Я міг би, я думаю, петлю назад. Отже, як тільки я знайшов зупинку, яка підходить (тут LineA.17), призначте той самий час очікування для зупинки 16, потім 15 ..., поки я не знайшов ще одну зупинку, яка відповідає моїм критеріям (LineA.13), а потім призначити решту з зупинок, той самий час очікування, що і 13.

Я навіть не маю уявлення, як створити таку петлю. Я не думаю, що я можу це зробити в SQL, тому мені доведеться використовувати процедурну мову в PostgreSQL.

У мене виникла ідея використовувати pgRouting для пошуку маршруту між кожною зупинкою подачі, щоб таким чином лінія А була розділена на дві частини (зупинки від 1 до 13, а потім від 13 до 17). Це було б простіше?

Наступним кроком буде використання pgRouting для обчислення часу їзди з усіх зупинок, які мають час очікування (вибачте за LineA.18 і більше!) Та порівняйте це з графіком руху автобуса для розрахунку конкурентоспроможності (чи потрібно 5 хвилин більше в автобусі, що в машині?)

Будь-які ідеї? Я зазвичай розміщую довгий сценарій незавершеного виробництва, щоб показати зусилля, які я доклав до цього часу, але я застряг!


Через інші дивні випадки я зараз розглядаю можливість скорочення маршрутів, за якими пасажири можуть вийти з автобуса. Отже, кожен "сегмент" маршруту буде незалежним. Мені все-таки потрібно розібратися, як я можу вирізати фігури в PostGIS, коли мої зупинки не топологічно правильні (фігури йдуть по вулиці, а зупинки на полюсі) ...;)
fgcartographix

Відповіді:


3

Насправді створити потрібний цикл дуже просто за допомогою SQL:

SELECT DISTINCT ON (b1.line, b1.number) b1.line,b1.number,b2.waiting
FROM busstops AS b1
  LEFT JOIN busstops AS b2
    ON b1.line = b2.line
      AND b1.number<=b2.number
      AND b2.waiting IS NOT NULL
ORDER BY b1.line,b1.number,b2.number;

Скрипка .

Було б також легко, скажімо, підсумовувати час переказу від зупинки до зупинки.

І ви можете використовувати звичайний pgRouting, якщо тільки вам вдасться перетворити маршрути у тимчасовий графік (з вузлами, що відображають час відправлення та час вартості маршруту).


Вуто! Це працює ... Є ще частини, які я не розумію, але я розумію ... Чи можу я бути досить сміливим, щоб запитати, чи можете ви переотримати час очікування, якщо пізніша зупинка матиме менший час очікування? Теорія полягає в тому, що ви можете пропустити перший залізничний вокзал, якщо вам доведеться почекати на пероні 20 хвилин і залишитися в автобусі до залізничного вокзалу 2, якщо очікування всього 4 хвилини ...;) Дякую мільйон разів !!!
fgcartographix

1
Просто змініть ORDER BYпункт. Перші два стовпці повинні залишатися, оскільки вони містяться в DISTINCT ONпункті, але інакше, ніж все дозволено: sqlfiddle.com/#!1/24fab/2
Якуб Канія

Ви чарівник !! :) Дякую! Я надто довго боровся з цим !!
fgcartographix

Просто переконайтеся, що 4 хвилини - це не поїзд, на годину пізніше :)
Якуб Каня

Ні! Максимально дозволений час очікування - 30 хвилин, і навіть так, великий червоний символ говорить про те, що це справді не добре! ;) Знову дякую! Крім того, я виграв свою думку з моїм начальником, що ніхто насправді не збирається залишатися в автобусі, можливо, на 20 хвилин довше, щоб поїхати на вокзал далі, ніж перший, навіть якщо час очікування дійсно довший. ;)
fgcartographix

5

У минулорічній програмі Google Summer of Code студент реалізував функцію pgRouting для мультимодальної маршрутизації. Він не ввійшов до нового випуску 2.0, тому він, ймовірно, не працює зараз, але ви, можливо, захочете ознайомитись з наявними ресурсами, щоб побачити, корисний він чи ні:

Було б непогано запустити цю функцію у наступному випуску, тому зверніться до списку розсилки розробників, щоб скоординувати необхідну роботу у випадку, якщо вам це цікаво: http://pgrouting.org/support.html

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