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.
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é!
Réponses:
En fait, créer la boucle que vous voulez est vraiment facile avec SQL:
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).
la source
ORDER BY
clause. Les deux premières colonnes doivent rester car elles sont dans laDISTINCT ON
clause mais sinon, tout est autorisé: sqlfiddle.com/#!1/24fab/2Dans 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
la source