Service de bus de ligne

9

Tout d'abord, un peu d'histoire.

Je travaille pour une agence de transport régional. Nous faisons un "diagnostic" sur notre service de bus de ligne. Nous aimerions savoir quelle proportion de nos utilisateurs pourrait prendre le bus pour se rendre à la gare au lieu de prendre sa voiture. Cela a été fait plusieurs fois dans la passe, mais nous utilisons maintenant gtfs comme source de données principale, nous devons donc repenser notre méthodologie.

service typique de bus d'alimentation

Pour être considéré comme «alimentant» le train, une ligne de bus doit avoir un arrêt à une certaine distance d'une gare (tampons rouges). De plus, la synchronicité avec le service de train est très importante car si votre bus arrive à la gare une demi-heure avant le train, le temps d'attente est trop long et vous voudrez dormir 20 minutes de plus le matin et prendre votre voiture.

Supposons que vous preniez la ligne A (bleue) à l'arrêt 12. Vous descendez du bus à l'arrêt 13. Le bus arrive à l'arrêt 13, qui est l'arrêt pour se rendre à la gare n ° 1 5 minutes avant le train. C'est très bien. Cela signifierait que tous ceux qui empruntent cette ligne de bus à un arrêt de 1 à 13 inclus arriveraient 5 minutes avant ce train.

Ensuite, le train, traversant une zone très densément peuplée avec beaucoup d'écoles et de passages à niveau, est obligé de réduire beaucoup sa vitesse. Entre-temps, le bus récupère les passagers aux arrêts 14 à 17 et arrive à la gare n ° 2 10 minutes avant ce train. Ainsi, les passagers prenant le bus aux arrêts 14 à 17 auraient tous un temps d'attente de 10 minutes une fois arrivés à la gare. Ainsi, le long de cette ligne de bus, les passagers prenant le bus aux arrêts 1 à 13 ont un temps d'attente de 5 minutes tandis que ceux qui prennent le bus aux arrêts 14 à 17 ont un temps d'attente de 10 minutes.

La ligne B, de l'autre côté de la piste, passe près de la gare n ° 1, mais ses arrêts sont trop loin pour envisager de "ravitailler" la gare n ° 1. Il arrive à la gare n ° 2 7 minutes avant le train (faites-le pour chaque train pendant les heures de pointe du matin; il est très bien synchronisé). Ainsi, les passagers le long de la ligne B, prenant le bus partout de l'arrêt 1 à 59, auraient un temps d'attente de 7 minutes.

Maintenant, ma question. Une fois que j'ai déterminé que les arrêts Ligne A.13 et Ligne A.17 alimentent mon train (cela a été fait spatialement, dans PostGIS), et que le temps d'attente pour prendre le bus à un arrêt avant # 13 est de 5 minutes mais ceux après un temps d'attente de 10 minutes, comment puis-je attribuer le temps d'attente à tous les arrêts devant eux?

J'aimerais le faire dans Postgres / PostGIS (pl / pgsql ou pl / python), mais je peux également utiliser du python pur (OS ou arcpy).

Je pourrais, je pense, boucler en arrière. Donc, une fois que j'ai trouvé un arrêt qui correspond (ici la ligne A.17), attribuez le même temps d'attente à l'arrêt 16, puis 15 ... jusqu'à ce que je trouve un autre arrêt qui correspond à mes critères (ligne A.13), puis attribuez le reste des arrêts, le même temps d'attente que 13.

Je n'ai cependant aucune idée de comment créer une telle boucle. Je ne pense pas que je puisse le faire en SQL, donc je devrais utiliser un langage procédural dans PostgreSQL.

J'ai eu une idée d'utiliser pgRouting pour trouver l'itinéraire entre chaque arrêt de ligne d'alimentation afin que la ligne A soit divisée en deux (arrêts 1 à 13 puis 13 à 17). Serait-ce plus facile?

La prochaine étape sera d'utiliser pgRouting pour calculer le temps de conduite à partir de tous les arrêts qui ont un temps d'attente (désolé pour la ligne A.18 et plus!) Et de le comparer avec le programme du bus pour calculer la compétitivité (prend-il 5 minutes de plus en bus qu'en voiture?)

Des idées? Je poste normalement un long script en cours pour montrer l'effort que j'ai fait jusqu'à présent, mais je suis bloqué!

fgcartographix
la source
En raison d'autres cas étranges, j'envisage maintenant de couper les itinéraires où les passagers peuvent descendre du bus. Ainsi, chaque "segment" d'itinéraire sera indépendant. J'ai encore besoin de comprendre comment je peux couper mes formes dans PostGIS lorsque mes arrêts ne sont pas topologiquement corrects (les formes suivent la rue et les arrêts sont sur le poteau) ...;)
fgcartographix

Réponses:

3

En fait, créer la boucle que vous voulez est vraiment facile avec 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;

Violon .

Il serait également facile, disons, de additionner les temps de transfert d'un arrêt à l'autre.

Et vous pouvez utiliser le pgRouting régulier si seulement vous parvenez à transformer les itinéraires en graphe temporel (avec des nœuds représentant les heures de départ et l'heure du coût de l'itinéraire).

Jakub Kania
la source
Woot! Cela fonctionne ... Il y a encore des parties que je ne comprends pas, mais je comprends l'idée ... Puis-je être assez audacieux pour vous demander de remplacer le temps d'attente si un arrêt ultérieur a un temps d'attente plus court? La théorie est que vous pouvez sauter la première gare si vous devez attendre 20 minutes sur le quai et rester dans le bus jusqu'à la gare 2 si l'attente n'est que de 4 minutes ...;) Merci mille fois !!!
fgcartographix
1
Modifiez simplement la ORDER BYclause. Les deux premières colonnes doivent rester car elles sont dans la DISTINCT ONclause mais sinon, tout est autorisé: sqlfiddle.com/#!1/24fab/2
Jakub Kania
Tu es un sorcier !! :) Merci! Je lutte avec ça depuis trop longtemps !!
fgcartographix
Assurez-vous simplement que 4 minutes ne sont pas pour un train qui est une heure plus tard :)
Jakub Kania
Nah! Le temps d'attente maximal autorisé est de 30 minutes et même ainsi, il y a un grand symbole rouge disant que ce n'est vraiment pas bon! ;) Merci encore! De plus, j'ai gagné mon point avec mon patron que personne ne va vraiment rester dans un bus peut-être 20 minutes de plus pour aller à une gare plus loin que la première, même si le temps d'attente est vraiment plus long. ;)
fgcartographix
5

Dans le programme Google Summer of Code de l'année dernière, un étudiant a implémenté une fonction pgRouting pour le routage multimodal. Il n'est pas entré dans la nouvelle version 2.0, donc cela ne fonctionne probablement pas en ce moment, mais vous voudrez peut-être jeter un œil aux ressources disponibles pour voir si cela est utile ou non:

Ce serait bien d'avoir cette fonction dans la prochaine version, veuillez donc contacter la liste de diffusion des développeurs pour coordonner le travail nécessaire au cas où vous seriez intéressé: http://pgrouting.org/support.html

dkastl
la source