Layanan bus pengumpan


9

Pertama-tama, sedikit latar belakang.

Saya bekerja untuk agen transit regional. Kami membuat "diagnostik" tentang layanan bus pengumpan kami. Kami ingin mengetahui proporsi pengguna yang dapat menggunakan bus untuk pergi ke stasiun kereta api alih-alih menggunakan mobil mereka. Sudah dilakukan beberapa kali, tetapi kami sekarang menggunakan gtf sebagai sumber data utama kami sehingga kami harus memikirkan kembali metodologi kami.

layanan bus pengumpan khas

Untuk dianggap "memberi makan" kereta, rute bus harus berhenti dalam jarak tertentu dari stasiun kereta api (buffer merah). Juga, sinkronisasi dengan layanan kereta sangat penting karena jika bus Anda tiba di stasiun kereta setengah jam sebelum kereta, waktu tunggu terlalu lama dan Anda akan ingin tidur 20 menit lagi di pagi hari dan mengambil mobil Anda.

Katakanlah Anda mengambil Jalur A (Biru) di halte 12. Anda turun dari bus di halte 13. Bus tiba di halte 13, yang merupakan halte untuk pergi ke Stasiun Kereta Api # 1 5 menit sebelum kereta. Itu sangat baik. Itu berarti bahwa setiap orang yang mengambil rute bus di halte 1 hingga 13 termasuk akan tiba 5 menit sebelum kereta itu.

Kemudian, kereta, melewati daerah yang sangat padat dengan banyak sekolah dan perlintasan terpaksa mengurangi kecepatannya banyak. Sementara itu, bus menjemput penumpang di halte 14-17 dan tiba di Stasiun Kereta Api # 2 10 menit sebelum kereta itu. Jadi penumpang yang naik bus di halte 14-17 semuanya akan memiliki waktu tunggu 10 menit setelah tiba di stasiun kereta. Jadi, di sepanjang jalur bus itu, penumpang yang menggunakan bus di halte 1 hingga 13 memiliki waktu tunggu 5 menit ketika mereka yang naik bus di halte 14 hingga 17 memiliki waktu tunggu 10 menit.

Jalur B, di sisi lain lintasan, lewat di dekat Stasiun Kereta Api # 1, tetapi perhentiannya terlalu jauh untuk mempertimbangkan "memberi makan" Stasiun Kereta Api # 1. Tiba di Stasiun Kereta Api # 2 7 menit sebelum kereta api (lakukan untuk setiap kereta pada jam sibuk pagi hari; tersinkronisasi dengan sangat baik). Jadi penumpang di sepanjang Jalur B, naik bus kemana saja dari halte 1 hingga 59 akan memiliki waktu tunggu 7 menit.

Sekarang, pertanyaan saya. Setelah saya menentukan bahwa berhenti LineA.13 dan LineA.17 memberi makan kereta saya (telah dilakukan secara spasial, di PostGIS), dan bahwa waktu menunggu ketika naik bus di halte sebelum # 13 adalah 5 menit tetapi yang setelah waktu tunggu 10 menit, bagaimana saya bisa menetapkan waktu tunggu untuk semua berhenti sebelum mereka?

Saya ingin melakukannya di Postgres / PostGIS (pl / pgsql atau pl / python), tetapi saya dapat menggunakan python murni (OS atau arcpy) juga.

Kurasa, aku bisa mundur. Jadi, begitu saya menemukan pemberhentian yang cocok (di sini LineA.17), tetapkan waktu tunggu yang sama untuk berhenti 16, lalu 15 ... sampai saya menemukan pemberhentian lain yang sesuai dengan kriteria saya (LineA.13) dan kemudian tetapkan sisanya. dari perhentian, waktu tunggu yang sama dengan 13.

Saya tidak tahu bagaimana cara membuat loop seperti itu. Saya tidak berpikir saya bisa melakukannya dalam SQL jadi saya harus menggunakan bahasa prosedural di PostgreSQL.

Saya punya ide untuk menggunakan pgRouting untuk menemukan rute antara setiap pengumpan berhenti sehingga dengan cara itu, Jalur A akan dibagi menjadi dua (berhenti 1 hingga 13 dan kemudian 13 hingga 17). Apakah itu lebih mudah?

Langkah selanjutnya, akan menggunakan pgRouting untuk menghitung waktu mengemudi dari semua halte yang memiliki waktu tunggu (maaf untuk LineA.18 dan lebih!) Dan membandingkannya dengan jadwal bus untuk menghitung daya saing (butuh 5 menit lagi di dalam bis yang ada di mobil?)

Ada ide? Saya biasanya memposting skrip panjang dalam proses untuk menunjukkan upaya yang telah saya lakukan sejauh ini, tapi saya mandek!


Karena kasus aneh lainnya, saya sekarang mempertimbangkan untuk memotong rute di mana penumpang bisa turun dari bus. Jadi, setiap rute "segmen" akan independen. Saya masih perlu mencari tahu bagaimana saya bisa memotong bentuk saya di PostGIS ketika berhenti saya tidak benar secara topologi (bentuk mengikuti jalan dan berhenti di tiang) ...;)
fgcartographix

Jawaban:


3

Sebenarnya membuat loop yang Anda inginkan sangat mudah dengan 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;

Biola .

Ini juga akan mudah, katakanlah, jumlah waktu transfer dari berhenti ke berhenti.

Dan Anda dapat menggunakan pgRouting biasa jika hanya Anda yang berhasil mengubah rute menjadi grafik temporal (dengan node mewakili waktu keberangkatan dan waktu untuk biaya rute).


Woot! Ini bekerja ... Masih ada bagian yang saya tidak mengerti, tapi saya mendapatkan ide ... Bisakah saya cukup berani untuk meminta Anda dapat mengganti waktu tunggu jika berhenti kemudian memiliki waktu tunggu yang lebih kecil? Teorinya adalah bahwa Anda dapat melewati stasiun kereta pertama jika Anda harus menunggu di platform selama 20 menit dan tetap di dalam bus sampai stasiun kereta 2 jika menunggu hanya 4 menit ...;) Terima kasih satu juta kali !!!
fgcartographix

1
Cukup ganti ORDER BYklausa. Dua kolom pertama harus tetap karena berada dalam DISTINCT ONklausa tetapi selain itu semua diizinkan: sqlfiddle.com/#!1/24fab/2
Jakub Kania

Kamu adalah penyihir !! :) terima kasih! Aku sudah terlalu lama berjuang dengan itu !!
fgcartographix

Pastikan bahwa 4 menit bukan untuk kereta itu satu jam kemudian :)
Jakub Kania

Tidak! Waktu tunggu maksimal yang diperbolehkan adalah 30 menit dan meskipun begitu, ada simbol merah besar yang mengatakan bahwa itu benar-benar tidak baik! ;) Terima kasih lagi! Juga, saya telah memenangkan poin saya dengan bos saya bahwa tidak ada yang benar-benar akan tinggal di bus mungkin 20 menit lebih lama untuk pergi ke stasiun kereta api lebih jauh daripada yang pertama, bahkan jika waktu tunggu benar-benar lebih lama. ;)
fgcartographix

5

Dalam program Google Summer of Code tahun lalu, seorang siswa mengimplementasikan fungsi pgRouting untuk routing multi-modal. Itu tidak membuatnya menjadi rilis 2.0 baru, jadi itu mungkin tidak berfungsi sekarang, tetapi Anda mungkin ingin melihat sumber daya yang tersedia untuk melihat apakah itu membantu atau tidak:

Akan menyenangkan untuk memasukkan fungsi ini ke rilis berikutnya, jadi silakan hubungi milis pengembang untuk mengoordinasikan pekerjaan yang diperlukan jika Anda tertarik: http://pgrouting.org/support.html

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.