← Retour aux issues

Plans de transport v2

publié le , mis à jour

⚙️ Ceci est une proposition de changement de code.

Rendez-vous sur sa page Coderberg pour l'osculter.

Avatar Codeberg de laemlaem
  • Réflexion préliminaire
<details><summary>Dérouler</summary> - changer la structure de agency.points. Nul besoin de lourds geojsons, juste des tuple [nom de l'arrêt, id, position] - à partir de là côté client on peut aggréger les arrêts par nom pour créer une table nom -> barycentre du groupement d'arrêts - un groupement peut être les deux sens d'un bus simple ; 4 arrêts de deux bus qui s'arrêtent au même lieu mais à quelques dizaines de mètres ; des pôles de transport comme République à Rennes - puis le faire aussi en prenant en compte la géoloc (pour éviter de regrouper "stade" au nord de la ville et "stade" au sud) - les polylines doivent maintenant faire référence aux points via leurs id et donc à la table points - actuellement on a d'un côté : - la liste des noms d'arrêt : pour l'interface uniquement je suppose avec le désavantage de ne pas être cliquable - la polyline qui représente le tracé calculé par notre serveur - dans quel sens se fait ce tracé ? On prend au hasard l'une des directions en ignorant donc totalement l'autre ? - non, c'est plus simple : on prend les stops du trip qui en a le plus ! L'omnibus. - on pourrait faire de même pour l'autre sens : à partir d'un certain zoom, l'utilisateur verrait alors deux lignes pour le bus C1 ; et surtout avant de zoomer, il verrait comme arrêt de la ligne unique le barycentre des arrêts des deux sens, ce qui est bien plus pertinent qu'un sélection au pif de la direction </details>
  • Nouveau schéma des plans d'agence
  • première version du dessin de l'agence Star en mode symbolique (zoom faible), en reconstruisant les segments à partir du couple routes, stopNames. Prioritaire : ça permettra de valider ou nom notre schéma de données et design d'ensemble
  • je crois que le calcul des computeFrequencyPerDay est complètement pété haha. À revoir.

Adapter l'interface

De mémoire les fonctions d'enrichissement en vue de l'affichage étaient assez lourdes.

On va distinguer 3 niveaux de zoom.

Faible

Par agence, on n'affiche que les "meta arrêts" de bus. Quand une route a un segment entre deux meta et qu'une autre a la même chose, on les affiche en parallèle. Pour ça, créer une map a1->a2 : [routes]. Possible que ça fasse ronronner les ordinateurs sur les grosses agences comme à Paris, à voir. On pourra le faire côté serveur si c'est le cas, même si ça pourrait augmenter la taille du transfert de données (Geojson donc) avant compression.

L'ordre doit être géré : une route qui est au-dessus de A à B ne soit pas passez en-dessous de B à C. Pas dur.

On a le droit à l'erreur, ce sera je pense dans tous les cas vachement mieux que l'existant.

Il faudra gérer le clic sur une route : est-ce qu'on filtre l'affichage en gardant cette agrégation, ou est-ce qu'on passe au réel ?

Même souci pour les directions que ci-dessous.

Moyen (optionnel)

On affiche les routes avec leurs arrêts réels mais agrégés pour les deux directions : pour chaque arrêt, barycentre entre les deux. Pas trivial, car il faut grouper les arrêts par couples : on peut s'en occuper dans un second temps.

Fort

On affiche les deux directions de chaque route dans la même couleur, si possible en affichant sur la carte une ellipse sur les couples d'arrêts. C'est facile en apparence... mais !

Partie difficile : comment éviter que ne se chevauchent les routes qui partagent précisément le même tracé sur certains segments ? Beaucoup d'arrêts de bus partagent deux routes. N'a-t-on pas intérêt à appliquer tout simplement le même algo que pour le zoom faible, mais avec le stop_id comme clef de la Map ? Ça mérite très clairement d'être testé !

Autre option plus facile : on ne trace les routes exactes qu'au clic sur une route, en mode focus. Moins puissant, mais peut-être plus simple pour l'utilisateur, et on concentre les efforts sur le mode symbolique

C'est parti

  • ajouter les arrêts
  • blancs (pôle d'échange) ou couleur
  • chevauchement C1 & C2 entre croix-saint-hélier et gares ?
  • rétablir l'importance des lignes pour comparer avec le plan de Rennes, potentiellement factice avec "C" et autres filtres pour comparer à "lignes urbaines"
    • en fait, compliqué de faire marcher ça sans rétablir le clic sur les lignes, qui permet d'explorer les données directement depuis l'app en dev plutôt qu'à la main dans le GTFS
  • si nettement plus satisfaisant que l'actuel, go go go tout coder !

Tout coder

  • intégrer les route_desc dans la fiche ligne, très utiles à Rennes
  • gérer l'affichage détaillée des lignes (zoom fort)
  • faire marcher sur Rennes la diversité des types de lignes : nuit, etc.
    • rétablir l'affichage du filtrage des lignes sur le plan (en gardant les arrêts globaux ? ) ; d'une ligne au clic sur la ligne ; des lignes d'un arrêt
    • définir la taille des arrêts sur l'ensemble du réseau, puis n'afficher que les arrêts des lignes sélectionnées. Donc extraire la création des features depuis drawTransitMap dans une fonction à réutiliser en amont, juste les filtrer au draw
  • implémenter le plan pour les autres villes, avec choix automatique de la gamme de lignes : si plein de métros + tram + BHNS (comment les repérer, comme à Lyon, il y a un type générique ?), pas de bus sur la gamme principale ; puis bus majeurs ; puis évènementiel / nuit / scolaire.
    • Bien sûr l'IDF rame ! Il faudra de belles optimisations pour corriger ça. Mais le métro rend super bien !
  • tester l'optimisation par claudecode : plus rapide ++ sur IDF ? quel diff json sur plusieurs agences ? OK c'est bon, elle ne fait une diff' que d'un stop en plus (en mode bouclage du cercle) dans une ligne de bus de nuit de Nantes, bon à savoir mais pas grave. Identique pour Rennes. 2 à 3 fois plus rapide en fonction de la taille du jeu !
  • gérer à nouveau la SNCF
    • sur la base du nouveau jeu de données du futur !1143
    • gérer l'affichage : le TGV pose problème !295
    • report à nouveau du sujet train : il faut d'abord qu'on mette en ligne l'actuel demain
  • améliorer la perf : Lyon doit être presque instantané, Paris ne ramer qu'un peu
    • réécrire l'affichage de la liste
    • et le calcul des points pour le dessin, très lent
  • ainsi que les réseaux nationaux voir européens comme Flixbus / Blabla, à mettre dans un lot groupé
  • le nom des arrêts, avec priorité (comment gérer ça, dans Maplibre sur le chevauchement ?) aux gros

Par la suite

  • breizhgo : lignes trop étroites, on voit pas à fort niveau de zoom
  • plutôt que des segments unitaires arrêt A -> arrêt B, coder des segments multiples A->B->C pour éviter que l'offset créée un cassure à B. Maintenir l'offset constant pour une ligne. Idéalement, donner l'offset le plus faible aux lignes qui arrivent et partent à gauche. Haha pas simple 😅
  • faire des effets au survol pour distinguer les lignes Eurostar entre-elles par exemple. C'est pas simple : ni setFeatureState (ne permet que de surligner par id, or plein de segments ont le même id) ni setFilter (trop instable) ne suffisent
  • les noms des lignes, bien sûr

Le liseré ça rend pas bien. Générer une palette de couleurs à partir des couleurs en conflit ?

image

  • représenter les superpositions comme avec une ombre portée sur la ligne qui se fait superposer, pour montrer l'addition en relief. Line-gap-width ?

image

Encore plus par la suite

  • les parkings relais, depuis OSM
  • facile d'intégrer les parkings vélos comme on le fait dans useTransportStopData ?
  1. Avatar Codeberg de laemlaem

    Cool voilà le premier résultat visuel pour l’agrégation des arrêts par nom.

    Avant image

    Après image

    On voit le problème évident : l'agrégation écrase invisibilise encore plus les lignes qui se chevauchent !

    Voilà ce que ça donne avec un offset tout bête fait en 5 minutes.

    image

    Reste à voir si on arrivera à faire mieux héhé.

  2. Avatar Codeberg de laemlaem

    [ancienne todo]

  3. Avatar Codeberg de etienneJretienneJr

    @laem wrote in https://codeberg.org/cartes/web/pulls/1254#issuecomment-8322926:

    Cool voilà le premier résultat visuel pour l’agrégation des arrêts par nom.

    C'est génial, ça change tout !

  4. Avatar Codeberg de laemlaem

    Avec les arrêts, et sans filtre sur les lignes (par fréquence pour n'afficher que les principales, ou en excluant les lignes de nuit), ça commence à rendre bien :)

    Après quelques itérations sur la déduplication des lignes.

    image

    Vs le plan à la main :

    image

    Vs le plan numérique officiel :

    image

  5. Avatar Codeberg de laemlaem

    Très satisfait de ce premier résultat. La carte numérique doit avoir plein d'intéractions :)

  6. Avatar Codeberg de etienneJretienneJr

    Super beau, bravo ! En comparant les captures, je me dis que tu pourrais rajouter les noms des arrêts ? (les arrêts agrégés, à zoom faible)

  7. Avatar Codeberg de laemlaem

    Oui bien sûr, j'ai encore du pain sur la planche. J'ai MAJ la TODO plus haut :)

  8. Avatar Codeberg de etienneJretienneJr

    T'as essayé de mettre un smoothing pour ne pas avoir que des lignes droites entre les arrêts mais une trajectoire plus "douce" ?

  9. Avatar Codeberg de laemlaem

    T'as essayé de mettre un smoothing pour ne pas avoir que des lignes droites entre les arrêts mais une trajectoire plus "douce" ?

    Oui j'y avais passé quelques heures dans le passé, c'est compliqué de faire un truc bien. Ça ferait diverger plein de lignes qui sont maintenant regrouper, car si elles sont identiques de D à E, elles divergent de E à F.

    Et c'est compliqué de créer des courbes tout en respectant les arrêts géographiques. C'est bien pour un plan symbolique non calqué sur un plan géographique, comme les plans de métro des capitales, mais pour cet usage il faut utiliser l'existant, loom. Leur mode non-géo est intéressant, mais hors périmètre pour l'instant, et leur mode géo n'est pas bon je trouve, il garde des complexités inutiles : par exemple sur cette capture, toutes ces petites variations de ligne sont inutiles.

    image

    Dans tous les cas, pour faire des plans interactifs, difficile de réutiliser leur logiciel.

  10. Avatar Codeberg de laemlaem

    Suite des évolutions : avec les noms des arrêts c'est déjà bien plus ancré dans la réalité :)

    image

    Correction (enfin !) du calcul de fréquence par ligne avec des stats qui me semble cohérentes, ce qui nous permet de classer les lignes par importance. Logiquement le métro est devant, puis les bus Chronostar, puis les bus à deux chiffres, puis à 3 et évenementiel. Tout semble aller bien ! Dans tous les cas, on n'a pas de base pour comparer nos résultat, impossible de trouver la donnée du nombre de trajet moyen par jour hors GTFS.

    image

  11. Avatar Codeberg de etienneJretienneJr

    C'est génial avec les noms en plus, ça fait hyper pro 😍

  12. Avatar Codeberg de etienneJretienneJr

    Comment t'as fait pour gérer les offsets quelque soit le nombre de lignes sur un tronçon ? (la question se posera à l'identique pour les itinéraires de rando)

  13. Avatar Codeberg de laemlaem

    Comment t'as fait pour gérer les offsets quelque soit le nombre de lignes sur un tronçon ? (la question se posera à l'identique pour les itinéraires de rando)

    C'est un algo côté client : on va calculer toutes les lignes qui passent par chaque segment de point C->D et leur attribuer à chacune un offset égal à l'épaisseur de la somme de toutes les lignes précédentes sur ce segment. Pas possible de faire ça avec la spec MapLibre à ma connaissance. Par contre ça romp la continuité des lignes d'un segment à l'autre, mais ça me semble secondaire pour l'instant par rapport au gain énorme de lisibilité :)

  14. Avatar Codeberg de laemlaem

    Maintenant que les filtres sont rétablis (il reste du boulot sur les arrêts, des noms ont disparu, c'est noté), en sélectionnant seulement les lignes principales, le plan commence à être bien lisible.

    Dans cette comparaison, on affiche moins de ligne sur notre version, donc on a un avantage, mais c'est le but d'un plan interactif : filtrer dynamiquement pour plus de clarté.

    image image

  15. Avatar Codeberg de laemlaem

    L'iDF c'est compliqué haha. Mais je suis quand même content du résultat.

    image

  16. Avatar Codeberg de etienneJretienneJr

    @laem wrote in https://codeberg.org/cartes/web/pulls/1254#issuecomment-8479308:

    L'iDF c'est compliqué haha. Mais je suis quand même content du résultat.

    Tu as de quoi, c'est déjà franchement pas mal du tout !

  17. Avatar Codeberg de laemlaem

    C'est en ligne depuis la semaine deriière :)


✏️ Participer à la discussion