mobility-team / mobility

Mobility, an open-source library for mobility modelisation
MIT License
18 stars 11 forks source link

🚌 Générer les déplacements avec dodgr (anciennement r5py) #83

Open Mind-the-Cap opened 1 year ago

Mind-the-Cap commented 1 year ago

Premier exemple dans https://github.com/mobility-team/mobility/pull/69

Ce qu'il reste à déterminer :

FlxPo commented 1 year ago

Je travaille sur ce sujet dans la branche "stage-2-model" : https://github.com/mobility-team/mobility/tree/stage-2-model.

Le modèle "étape 1" consiste à échantillonner simplement les déplacements issus des enquêtes. Le modèle "étape 2" consiste à préciser certains déplacements en appliquant un modèle de choix des destinations et des modes de transport. Plus d'infos dans la présentation de Mobility dans la PR en cours sur la documentation : https://github.com/mobility-team/mobility/blob/ab0a9da93df56d9ffb8480a8f31e91caf7f80575/docs/source/presentation.md

Les différentes étapes à implémenter sont les suivantes :

FlxPo commented 1 year ago

L'ajout de ces fonctionnalités nécessite d'installer r5py et osmium.

C'est plus complexe pour l'utilisateur, mais il va falloir qu'on se mette à packager mobility avec conda.

La licence d'anaconda n'est pas très open source compatible, sauf si on se limite aux packages conda-forge ce qui est le cas de osmium et openjdk (https://community.anaconda.cloud/t/is-conda-cli-free-for-use/14303).

@Mind-the-Cap OK pour toi ?

Mind-the-Cap commented 1 year ago

@FlxPo OK pour moi pour openjsk et osmium, il faudra qu'on ait une belle doc dès le début ! Merci pour toutes les avancées surtout !

Pour les fonctions OSM et transport, elles semblent ne fonctionner que pour la France, or la première application sera franco-suisse, quel impact ça aurait sur le code ? On n'a pas encore décidé de norme pour ça, mais j'imagine qu'on pourrait avoir une fonction get_osm globale qui appelle par exemple get_french_osm ou get_swiss_osm selon les besoins ?

FlxPo commented 1 year ago

Il va falloir adapter le code.

La stratégie actuelle est la suivante:

Donc on pourrait adopter la même stratégie pour la Suisse:

On pourrait procéder de la même façon pour les autres pays limitrophes.

Est ce que tu sais s'il existe une couche SIG à jour des limites communales européennes ? Pas évident d'avoir quelque chose à jour ou au contraire un peu en retard pour avoir les bons identifiants (suite aux fusions / splits de communes)...

Mind-the-Cap commented 1 year ago

Non, à ma connaissance il n'y a pas de couche ou de jeu de données existants. Il va falloir individualiser l'approche par pays (et même dans ce cas, pas évident de trouver la bonne année).

Pour la Suisse, parfait si on peut adopter cette stratégie.

FlxPo commented 1 year ago

Le développement avec r5py ne se passe pas comme prévu:

En fait ce ne sont pas les mêmes algos qui sont utilisés par R5 dans ces deux cas de figures, et le problème a l'air assez commun : voir par exemple https://github.com/conveyal/r5/issues/863.

Les développeurs de R5 indiquent:

We haven't used the point-to-point routing server for many years and it is not actively maintained. [...] The point-to-point routing code paths do work somewhat differently than the one-to-many routing we use heavily for travel time mapping and accessibility calculations. We have not (yet) removed the point-to-point functionality in case anyone finds it useful, but realistically we probably won't spend time exploring issues with this part of the codebase.

Donc la piste r5py semble s'arrêter là, et je ne vois pas d'alternative en Python.

Je propose donc d'utiliser R et le package dodgr, qui est très rapide et permet de calculer les temps et distances des trajets directement. C'est ce que j'utilisais jusqu'à présent, donc j'ai déjà quelques scripts à réutiliser. A priori on peut utiliser conda pour gérer l'installation de R et des packages nécessaires.

Je peux limiter le code R au maximum, mais mobility deviendrait un projet multi-langage... OK pour toi @Mind-the-Cap ? Un avis @louisegontier ?

Autre alternative, utiliser des outils comme Valhalla, mais c'est encore plus compliqué, il faut Docker, lancer un serveur de calcul...

Mind-the-Cap commented 1 year ago

@FlxPo quel est l'impact de disposer uniquement du temps de parcours many-to-many ? Impossibilité de connaître les modes utilisés et donc les empreintes carbones ?

Si on est sur ce niveau d'impact, totalement ok pour moi de passer sur R et sur un projet multi-langages. Je préfère ça à Docker. Il faudra que je me renseigne un peu plus sur les stratégies de test et de couverture du code dans ce cas !

FlxPo commented 12 months ago

Si on ne connaît que le temps de parcours, on doit se contenter de la distance à vol d'oiseau pour estimer les distances parcourues, ce qui me semble une assez grosse approximation pour les déplacements courte / moyenne distance. La distance est une variable importante, pour le calcul de l'empreinte carbone, et potentiellement pour les modèles de choix destination / mode (si on intègre des coûts en €/km pour la consommation de carburant par exemple).

FlxPo commented 12 months ago

Pour référence, le fonctionnement de l'aglorithme mutlimodal de R5 est expliqué ici : https://github.com/UrbanAnalyst/gtfsrouter/issues/73.

FlxPo commented 11 months ago

J'ai fait un commit avec mes modifications en cours : https://github.com/mobility-team/mobility/commit/27b2313218d20a651c80856275885ee39d39daa2.

La première étape de calcul des temps et distances de parcours avec dodgr est OK, avec la fonction prepare_dodgr_graph (qui appelle le script R du même nom) qui transforme les données OSM en graphe utilisable ensuite pour calculer des itinéraires.

J'ai commencé à mettre en place la stratégie de configuration via des variables d'environnement (voir https://github.com/mobility-team/mobility/blob/27b2313218d20a651c80856275885ee39d39daa2/examples/travel_costs/travel_costs.py pour un example).

Pour le moment le code appelle la version de R installée sur mon poste par ailleurs, mais ça ne marchera pas pour la plupart des utilisateurs : il faut mettre en place l'installation de R via conda / mamba dans un environnement dédié, avec les installations des librairies utilisées ensuite (sf, dodgr...).

FlxPo commented 11 months ago

J'ai fait un très gros commit avec pas mal de changements :

Process d'installation

Utilisation de dodgr

Stratégie de cache des résultats

Fork du package R osmdata

Mind-the-Cap commented 10 months ago

Merci Félix !

Pour le processus d'installation, j'ai pu tester et ça marche ! Je rajouterai peut-être des détails sur l'utilisation de Spyder. J'ai renommésetup.py en set_params.py pour éviter les confusions avec le setup.py habituel des librairires Python.

Pour l'utilisation de Dodgr, ça semble marcher aussi, même s'il n'y a pas encore de visualisation des résultats. Je vais réfléchir à une stratégie de tests qui ne soit pas trop lourde...

Le cache des résultats est une très très bonne chose. Il faudra qu'on adapte le code existant pour suivre la même logique en effet, mais ce n'est pas la première des priorités je pense.

Sur le fork d'osmdata, je ne suis pas hyper à l'aise avec l'idée de distribuer un package en parallèle de mobility, surtout si c'est limité à un seul OS, et que le seul impact en dehors de ça est une perte de performances (ça me paraît plus utile de développer nos stratégies de cache par exemple...)

J'en ai fait une PR pour pouvoir faire tourner les tests et évaluer le taux de couverture : https://github.com/mobility-team/mobility/pull/94

FlxPo commented 10 months ago

Pour le fork d'osmdata, c'est sûr que ce n'est pas idéal. Je vais essayer de refaire une PR sur le projet, mais à l'époque elle avait été rejetée sans que je comprenne bien pour quoi : la différence de temps de calcul est vraiment extrêmement importante.

Je persiste à penser que c'est nécessaire pour l'étude de territoires un petit peu conséquents. Mes tests sur la version originale d'osmdata n'aboutissaient parfois même pas après plusieurs heures...

FlxPo commented 10 months ago

Je viens de faire un commit avec les changements suivants :

Quelques points à noter et pistes d'amélioration :

FlxPo commented 9 months ago

Je viens de faire plusieurs commits sur la branche stage-2-model :

Mind-the-Cap commented 9 months ago

Merci beaucoup @FlxPo !

J'ai commencé à implémenter un test, bon d'une part ça ne fonctionne pas, et de l'autre c'est déjà beaucoup trop long (25 minutes de test, en même temps ça va récupérer tous les fichiers et tout R, forcément c'est long). Je vois plusieurs approches possibles :

Pour le temps et la distance d'arrêt à arrêt, ça ne me paraît vraiment pas un point bloquant pour le moment, surtout en restant à l'échelle communale. Ce serait très bien de descendre au niveau IRIS, mais ça ne me paraît pas une priorité non plus.

Pour les GTFS non alignés, quel est le risque ?

Question supplémentaire : est-ce qu'il y a une raison à ce que gtfs_routes_types.xlsx ne soit pas un CSV ?

FlxPo commented 9 months ago

Je n'ai jamais testé ça mais est ce qu'on pourrait utiliser un cache de l'environnement complet (python + R), pour accélérer les tests ? https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows

On pourrait aussi préparer et stocker les données à télécharger pour que le test se concentre sur l’exécution du code de préparation des données / modélisation ?

OK pour les deux points qui peuvent attendre, je les mentionnais surtout pour ne pas les oublier ensuite.

Pour les GTFS non alignés, sans avoir testé, je pense qu'il pourrait manquer des données (si je merge deux GTFS, un de 2023 et un de 2024 par exemple, dans un cas extrême).

Pas de raison pour gtfs_routes_types.xlsx, c'est juste plus facile à manipuler dans Excel vu que c'est un fichier créé manuellement (mais on pourrait le passer en csv).

FlxPo commented 9 months ago

Nouveau commit pour créer une classe Trips, qui permet d'échantillonner des déplacements sur la base d'une population. J'ai repris les fonctionnalités de la classe TripSampler, qu'on pourra supprimer.

Prochaine étape la localisation des déplacements à partir du modèle de radiation !

FlxPo commented 9 months ago

Nouveau commit qui devrait permettre de fermer (enfin) cette issue !

J'ai fait un test sur une zone d'étude assez conséquente : environ 200 zones de transport autour de Lyon, avec 10 000 habitants et 11 millions de déplacements échantillonnés. Le temps de calcul est de l'ordre de 30 minutes (avec un cache froid, s'il faut tout télécharger et calculer, sinon c'est plus rapide). Certaines étapes sont très parallélisables, donc on pourrait améliorer ça.

La "localisation" fonctionne bien. L'échantillonnage de base ne différencie les comportements de mobilité qu'en fonction de caractéristiques socio-économiques et de la catégorie d'unité urbaine du lieu de résidence. Donc pas de différence à caractéristiques constantes entre un habitant de Lyon 7e ou d'une commune périurbaine de l'unité urbaine de Lyon.

Après localisation (encore une fois uniquement pour le domicile travail pour le moment), la distance parcourue diminue en moyenne pour les habitants du centre de l'agglomération et augmente plus on s'éloigne du centre.

Le ratio après / avant :

Figure_4

Il y a plusieurs améliorations et vérifications à faire:

FlxPo commented 9 months ago

@Mind-the-Cap à ton avis quelles sont les dernières étapes sont nécessaires pour fermer cette issue, faire un merge avec la branche main puis publier une nouvelle version du package ?

Mind-the-Cap commented 9 months ago

Salut @FlxPo merci beaucoup ! Est-ce que tu as mis le code permettant de générer cette carte quelque part ? Je ne l'ai pas trouvé. Je suis aussi intéressée par celui que tu as utilisé pour l'accessibilité des quartiers des grandes gares.

Voici ce qui à mon sens est nécessaire pour fermer l'issue et merger :

Pour atteindre la version 0.2, je nous verrais bien fournir un peu plus d'efforts sur les représentations graphiques, ainsi qu'un ou deux articles de blog à publier sur https://mobility-team.github.io/ . Mais on n'est plus très loin !

FlxPo commented 9 months ago

Le code d'exemple est ici : https://github.com/mobility-team/mobility/blob/stage-2-model/examples/trip_localizer/example.py

OK pour les remarques, je crée des issues séparées :