Feeder-Bus-Service

9

Zunächst ein kleiner Hintergrund.

Ich arbeite für eine regionale Transitagentur. Wir machen eine "Diagnose" über unseren Feeder-Bus-Service. Wir möchten wissen, wie viel Prozent unserer Benutzer mit dem Bus zum Bahnhof fahren können, anstatt mit dem Auto zu fahren. Es wurde mehrmals im Pass durchgeführt, aber wir verwenden jetzt gtfs als Hauptdatenquelle, sodass wir unsere Methodik überdenken müssen.

typischer Zubringerbusdienst

Um den Zug "füttern" zu können, muss eine Buslinie eine Haltestelle in einer bestimmten Entfernung von einem Bahnhof haben (rote Puffer). Auch die Synchronität mit dem Zugverkehr ist sehr wichtig, denn wenn Ihr Bus eine halbe Stunde vor dem Zug am Bahnhof ankommt, ist die Wartezeit zu lang und Sie möchten morgens noch 20 Minuten schlafen und Ihr Auto nehmen.

Nehmen wir an, Sie nehmen die Linie A (blau) an der Haltestelle 12. Sie steigen an der Haltestelle 13 aus dem Bus aus. Der Bus kommt an der Haltestelle 13 an. Dies ist die Haltestelle, um 5 Minuten vor dem Zug zum Bahnhof Nr. 1 zu gelangen. Das ist sehr gut. Das würde bedeuten, dass jeder, der diese Buslinie an einer Haltestelle von 1 bis einschließlich 13 nimmt, 5 Minuten vor diesem Zug ankommt.

Dann muss der Zug, der durch ein sehr dicht besiedeltes Gebiet mit vielen Schulen und Kreuzungen fährt, seine Geschwindigkeit stark reduzieren. In der Zwischenzeit holt der Bus die Fahrgäste an den Haltestellen 14 bis 17 ab und kommt 10 Minuten vor diesem Zug am Bahnhof Nr. 2 an. Ein Passagier, der den Bus an den Haltestellen 14 bis 17 nimmt, hätte eine Wartezeit von 10 Minuten, sobald er am Bahnhof angekommen ist. Entlang dieser Buslinie haben Fahrgäste, die den Bus an den Haltestellen 1 bis 13 nehmen, eine Wartezeit von 5 Minuten, während diejenigen, die den Bus an den Haltestellen 14 bis 17 nehmen, eine Wartezeit von 10 Minuten haben.

Die Linie B auf der anderen Seite des Gleises verläuft in der Nähe des Bahnhofs Nr. 1, aber ihre Haltestellen sind zu weit entfernt, um den Bahnhof Nr. 1 zu "füttern". Es kommt 7 Minuten vor dem Zug am Bahnhof Nr. 2 an (tun Sie es für jeden Zug während der morgendlichen Hauptverkehrszeit; es ist sehr gut synchronisiert). Passagiere entlang der Linie B, die den Bus von Haltestelle 1 bis 59 überall hin mitnehmen, hätten eine Wartezeit von 7 Minuten.

Nun meine Frage. Sobald ich festgestellt habe, dass die Haltestellen LineA.13 und LineA.17 meinen Zug versorgen (dies wurde räumlich in PostGIS durchgeführt), und dass die Wartezeit bei der Fahrt mit dem Bus an einer Haltestelle vor # 13 5 Minuten beträgt, die nachfolgenden jedoch 5 Minuten Wie kann ich bei einer Wartezeit von 10 Minuten die Wartezeit allen Stopps vor ihnen zuordnen?

Ich würde es gerne in Postgres / PostGIS (pl / pgsql oder pl / python) machen, aber ich kann auch reines Python (OS oder arcpy) verwenden.

Ich könnte, denke ich, rückwärts schleifen. Wenn ich also einen passenden Stopp gefunden habe (hier Zeile A.17), weisen Sie Stopp 16 und dann 15 dieselbe Wartezeit zu, bis ich einen anderen Stopp gefunden habe, der meinen Kriterien entspricht (Zeile A.13), und weisen Sie dann den Rest zu der Haltestellen die gleiche Wartezeit wie 13.

Ich habe jedoch keine Ahnung, wie ich eine solche Schleife erstellen soll. Ich glaube nicht, dass ich das in SQL kann, also müsste ich in PostgreSQL eine prozedurale Sprache verwenden.

Ich hatte die Idee, mit pgRouting die Route zwischen den einzelnen Feeder-Stopps zu ermitteln, sodass die Linie A in zwei Teile geteilt wird (Stopps 1 bis 13 und dann 13 bis 17). Wäre das einfacher?

Der nächste Schritt besteht darin, pgRouting zu verwenden, um die Fahrzeit von allen Haltestellen mit Wartezeit zu berechnen (Entschuldigung für Linie A.18 und höher!) Und diese mit dem Fahrplan des Busses zu vergleichen, um die Wettbewerbsfähigkeit zu berechnen (dauert es 5) Minuten mehr im Bus als im Auto?)

Irgendwelche Ideen? Normalerweise poste ich ein langes Work-in-Progress-Skript, um zu zeigen, welche Anstrengungen ich bisher unternommen habe, aber ich stecke fest!

fgcartographix
quelle
Aufgrund anderer seltsamer Fälle denke ich jetzt darüber nach, die Strecken zu kürzen, auf denen die Passagiere aus dem Bus aussteigen können. So wird jede Route "Segmente" unabhängig sein. Ich muss noch herausfinden, wie ich meine Formen in PostGIS schneiden kann, wenn meine Stopps nicht topologisch korrekt sind (die Formen folgen der Straße und die Stopps befinden sich auf der Stange) ...;)
fgcartographix

Antworten:

3

Das Erstellen der gewünschten Schleife ist mit SQL wirklich einfach:

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;

Geige .

Es wäre auch einfach, beispielsweise die Transferzeiten von Stopp zu Stopp zu summieren.

Und Sie könnten reguläres pgRouting verwenden, wenn Sie nur die Routen in ein Zeitdiagramm umwandeln könnten (wobei Knoten die Abfahrtszeiten und die Zeit für die Routenkosten darstellen).

Jakub Kania
quelle
Woot! Es funktioniert ... Es gibt immer noch Teile, die ich nicht verstehe, aber ich habe die Idee ... Könnte ich mutig genug sein zu fragen, ob Sie die Wartezeit überschreiben könnten, wenn ein späterer Stopp eine geringere Wartezeit hat? Die Theorie ist, dass Sie den ersten Bahnhof überspringen könnten, wenn Sie 20 Minuten auf dem Bahnsteig warten müssen, und bis zum Bahnhof 2 im Bus bleiben müssen, wenn die Wartezeit nur 4 Minuten beträgt ...;) Vielen Dank !!!
fgcartographix
1
Ändern Sie einfach die ORDER BYKlausel. Die ersten beiden Spalten müssen bleiben, da sie in der DISTINCT ONKlausel enthalten sind, aber ansonsten ist alles erlaubt: sqlfiddle.com/#!1/24fab/2
Jakub Kania
Du bist ein Zauberer !! :) Vielen Dank! Ich habe zu lange damit zu kämpfen !!
fgcartographix
Stellen Sie nur sicher, dass 4 Minuten nicht für einen Zug sind, der eine Stunde später ist :)
Jakub Kania
Nein! Die maximal zulässige Wartezeit beträgt 30 Minuten. Trotzdem gibt es ein großes rotes Symbol, das besagt, dass es wirklich nicht gut ist! ;) Danke noch einmal! Außerdem habe ich mit meinem Chef den Punkt gewonnen, dass niemand wirklich in einem Bus bleiben wird, vielleicht 20 Minuten länger, um zu einem Bahnhof zu gelangen, der weiter entfernt ist als der erste, selbst wenn die Wartezeit wirklich länger ist. ;)
fgcartographix
5

Im letztjährigen Google Summer of Code-Programm implementierte ein Student eine pgRouting-Funktion für multimodales Routing. Es hat es nicht in die neue Version 2.0 geschafft, daher funktioniert es derzeit wahrscheinlich nicht, aber Sie sollten sich die verfügbaren Ressourcen ansehen, um festzustellen, ob es hilfreich ist oder nicht:

Es wäre schön, diese Funktion in die nächste Version aufzunehmen. Wenden Sie sich daher an die Entwickler-Mailingliste, um die erforderlichen Arbeiten zu koordinieren, falls Sie interessiert sind: http://pgrouting.org/support.html

dkastl
quelle