フィーダーバスサービス


9

まず第一に、少し背景。

私は地域の交通機関で働いています。フィーダーバスサービスの「診断」を行っています。車を利用する代わりにバスを利用して駅まで行くことができるユーザーの割合を知りたいのですが。これは何度かパスで行われましたが、現在はgtfsをメインデータソースとして使用しているため、方法論を再考する必要があります。

典型的なフィーダーバスサービス

電車に「餌をやる」と見なされるには、バス路線が駅から一定の距離内に止まる必要があります(赤いバッファ)。また、バスが電車の30分前に駅に到着した場合、待ち時間が長すぎるため、朝20分以上眠って車に乗る必要があるため、電車サービスとの同期が非常に重要です。

12番線でラインA(青)に乗ったとします。13番バスでバスを降りると、バスは13番の停留所に到着します。それはとても良いことです。つまり、1から13までの停留所でそのバス路線を利用する全員が、その電車の5分前に到着するということです。

次に、列車は、学校や交差点がたくさんある非常に人口密度の高いエリアを通過するため、速度が大幅に低下します。一方、バスは14〜17番の停留所で乗客をピックアップし、その列車の10分前に第2駅に到着します。そのため、14〜17番の停留所でバスに乗車する乗客は、駅に到着したら、すべて10分の待ち時間があります。したがって、そのバス路線に沿って、1番から13番のバスに乗る乗客は5分の待ち時間を持ち、14番から17番のバスに乗る乗客は10分の待ち時間を持っています。

線路の反対側にあるラインBは、鉄道駅#1の近くを通過しますが、その停留所は、「給餌」鉄道駅#1を考慮するには遠すぎます。電車の7分前に駅#2に到着します(朝のラッシュアワー中に電車ごとに行ってください。非常によく同期しています)。したがって、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を使用して各フィーダーストップ間のルートを見つけることで、ラインAが2つに分割されるようにしました(ストップ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分間待機する必要がある場合は最初の駅をスキップし、待機が4分しかない場合は駅2までバスに留まることができます。
fgcartographix 2013年

1
ORDER BY条項を変更するだけです。最初の2つの列はDISTINCT ON句にあるためそのままにする必要がありますが、それ以外の場合はすべて許可されます。sqlfiddle.com
Jakub Kania

あなたは魔法使いです!! :)ありがとう!長い間苦労してきました!!
fgcartographix 2013年

4時間は1時間遅れの電車ではないことを確認してください:)
Jakub Kania

いや!許容される最大待機時間は30分ですが、それでも、それは本当に良くないことを示す大きな赤い記号があります!;) 再度、感謝します!また、待ち時間が本当に長くても、最初の駅よりも駅に行くまでにバスに20分以上滞在する人は誰もいないということを上司と話しました。;)
fgcartographix 2013年

5

昨年のGoogle Summer of Codeプログラムでは、学生がマルチモーダルルーティング用のpgRouting関数を実装しました。新しい2.0リリースに組み込まれなかったため、おそらく現在は機能しませんが、利用可能なリソースを調べて、それが役立つかどうかを確認することをお勧めします。

この機能を次のリリースで導入するとよいでしょう。興味がある場合は、開発者メーリングリストに連絡して、必要な作業を調整してください。http//pgrouting.org/support.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.