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.
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!
Antworten:
Das Erstellen der gewünschten Schleife ist mit SQL wirklich einfach:
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).
quelle
ORDER BY
Klausel. Die ersten beiden Spalten müssen bleiben, da sie in derDISTINCT ON
Klausel enthalten sind, aber ansonsten ist alles erlaubt: sqlfiddle.com/#!1/24fab/2Im 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
quelle