Servizio bus di alimentazione


9

Prima di tutto, un piccolo sfondo.

Lavoro per un'agenzia di transito regionale. Stiamo effettuando una "diagnostica" sul nostro servizio di autobus di alimentazione. Vorremmo sapere quale percentuale dei nostri utenti potrebbe prendere l'autobus per andare alla stazione ferroviaria invece di prendere la propria auto. È stato fatto più volte nel pass, ma ora stiamo usando gtfs come fonte di dati principale, quindi dobbiamo ripensare la nostra metodologia.

tipico servizio di autobus di alimentazione

Per essere considerato "alimentare" il treno, una linea di autobus deve avere una fermata a una certa distanza da una stazione ferroviaria (buffer rosso). Inoltre, la sincronicità con il servizio ferroviario è molto importante perché se l'autobus arriva alla stazione mezz'ora prima del treno, il tempo di attesa è troppo lungo e ti consigliamo di dormire altri 20 minuti al mattino e prendere la tua auto.

Supponiamo di prendere la linea A (blu) alla fermata 12. Scendi dall'autobus alla fermata 13. L'autobus arriva alla fermata 13, che è la fermata per andare alla stazione ferroviaria n. 1 5 minuti prima del treno. È molto buono. Ciò significherebbe che tutti coloro che prendono quella linea di autobus alla fermata da 1 a 13 inclusa arriverebbero 5 minuti prima di quel treno.

Quindi, il treno, che attraversa un'area molto densamente popolata con molte scuole e incroci, è costretto a ridurre molto la sua velocità. Nel frattempo, l'autobus prende i passeggeri dalla fermata 14 a 17 e arriva alla stazione ferroviaria n. 2 10 minuti prima di quel treno. Quindi i passeggeri che prendono l'autobus dalle fermate 14 alle 17 avrebbero tutti un tempo di attesa di 10 minuti una volta arrivati ​​alla stazione ferroviaria. Quindi, lungo quella linea di autobus, i passeggeri che prendono l'autobus alla fermata da 1 a 13 hanno un tempo di attesa di 5 minuti quando quelli che prendono l'autobus alle fermate da 14 a 17 hanno un tempo di attesa di 10 minuti.

La linea B, sull'altro lato del binario, passa vicino alla stazione ferroviaria n. 1, ma le sue fermate sono troppo lontane per considerare "l'alimentazione" della stazione ferroviaria n. 1. Arriva alla Stazione Ferroviaria # 2 7 minuti prima del treno (fallo per ogni treno durante l'ora di punta del mattino; è molto ben sincronizzato). Quindi i passeggeri lungo la linea B, prendendo l'autobus ovunque dalla fermata 1 a 59, avrebbero un tempo di attesa di 7 minuti.

Ora, la mia domanda. Una volta stabilito che le fermate LineA.13 e LineA.17 stanno alimentando il mio treno (è stato fatto spazialmente, in PostGIS) e che il tempo di attesa quando si prende l'autobus alla fermata prima del 13 è di 5 minuti, ma quelli che hanno un tempo di attesa di 10 minuti, come posso assegnare il tempo di attesa a tutte le soste prima di loro?

Mi piacerebbe farlo in Postgres / PostGIS (pl / pgsql o pl / python), ma posso usare pure python (OS o arcpy).

Potrei, credo, tornare indietro. Quindi, una volta trovata una fermata adatta (qui la riga A.17), assegnare lo stesso tempo di attesa alla fermata 16, quindi 15 ... fino a quando ho trovato un'altra fermata adatta ai miei criteri (riga A.13) e quindi assegnare il resto delle fermate, lo stesso tempo di attesa di 13.

Non ho idea di come creare un ciclo del genere però. Non credo di poterlo fare in SQL, quindi dovrei usare un linguaggio procedurale in PostgreSQL.

Ho avuto l'idea di usare pgRouting per trovare il percorso tra le fermate di ciascun alimentatore in modo che la linea A venisse divisa in due (fermate da 1 a 13 e quindi da 13 a 17). Sarebbe più facile?

Il prossimo passo sarà usare pgRouting per calcolare il tempo di guida da tutte le fermate che hanno un tempo di attesa (scusate la linea A.18 e oltre!) E confrontarlo con il programma del bus per calcolare la competitività (ci vogliono 5 minuti in più in autobus che in macchina?)

Qualche idea? Di solito pubblico un lungo script di work-in-progress per mostrare lo sforzo che ho fatto finora, ma sono bloccato!


A causa di altri casi strani, ora prendo in considerazione la possibilità di tagliare le rotte in cui i passeggeri possono scendere dall'autobus. Pertanto, ogni "segmento" di percorso sarà indipendente. Devo ancora capire come posso tagliare le mie forme in PostGIS quando le mie fermate non sono topologicamente corrette (le forme seguono la strada e le fermate sono sul palo) ...;)
fgcartographix

Risposte:


3

Realizzare il loop che desideri è davvero facile con 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;

Violino .

Sarebbe anche facile, diciamo, sommare i tempi di trasferimento da uno stop all'altro.

E potresti usare pgRouting regolare se solo riuscissi a trasformare i percorsi in un grafico temporale (con nodi che rappresentano gli orari di partenza e il tempo per il costo del percorso).


Woot! Funziona ... Ci sono ancora parti che non capisco, ma ho avuto l'idea ... Potrei essere abbastanza audace da chiederti di scavalcare il tempo di attesa se una fermata successiva ha un tempo di attesa più piccolo? La teoria è che potresti saltare la prima stazione ferroviaria se devi aspettare sulla piattaforma per 20 minuti e rimanere sull'autobus fino alla stazione ferroviaria 2 se l'attesa è solo 4 minuti ...;) Grazie mille milioni !!!
fgcartographix,

1
Basta cambiare la ORDER BYclausola. Le prime due colonne devono rimanere poiché sono nella DISTINCT ONclausola ma per il resto tutto è permesso: sqlfiddle.com/#!1/24fab/2
Jakub Kania

Sei un mago !! :) Grazie! Ho lottato con questo per troppo tempo !!
fgcartographix,

Assicurati solo che 4 minuti non siano per un treno che è un'ora dopo :)
Jakub Kania,

Nah! Il tempo di attesa massimo consentito è di 30 minuti e anche così, c'è un grande simbolo rosso che dice che non è davvero buono! ;) Grazie ancora! Inoltre, ho vinto il mio punto con il mio capo sul fatto che nessuno rimarrà davvero su un autobus forse 20 minuti in più per andare a una stazione ferroviaria più avanti del primo, anche se il tempo di attesa è molto più lungo. ;)
fgcartographix,

5

Nel programma Google Summer of Code dell'anno scorso uno studente ha implementato una funzione pgRouting per il routing multimodale. Non è arrivato alla nuova versione 2.0, quindi probabilmente non funziona in questo momento, ma potresti voler dare un'occhiata alle risorse disponibili per vedere se è utile o meno:

Sarebbe bello avere questa funzione nella prossima versione, quindi per favore contatta la mailing list degli sviluppatori per coordinare il lavoro necessario nel caso ti interessi: http://pgrouting.org/support.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.