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.
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!
Jawaban:
Sebenarnya membuat loop yang Anda inginkan sangat mudah dengan SQL:
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).
sumber
ORDER BY
klausa. Dua kolom pertama harus tetap karena berada dalamDISTINCT ON
klausa tetapi selain itu semua diizinkan: sqlfiddle.com/#!1/24fab/2Dalam 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
sumber