Calculateur d'itinéraire multimodal Toulouse et Haute-Garonne

Après le plan interactif Tisséo, j’ai le plaisir de vous présenter un autre projet réalisé avec SYNTHESE en préparation depuis plusieurs mois à Tisséo : le Calculateur d’Itinéraire Multi-Modal (CIMM).

Ce projet, entièrement réalisé par nos équipes Tisséo est le fruit d’un partenariat entre plusieurs organisations publiques : l’état, la région Midi-Pyrennées, le département de la Haute-Garonne, Toulouse-Métropôle, et Tisséo.


Le périmètre du calculateur est plus grand que le département

Ce calculateur permet d’effectuer des itinéraires en mixant:


Pour voir en détail comment tout ceçi peut être combiné, je vous invite à essayer :

Le formulaire de calcul d'itinéraire multimodal



Comme vous pouvez le voir, ce calculateur est directement intégrable dans n’importe quel site via un widget JavaScript : c’est une marque blanche
ATTENTION : L’intégration du widget est aujourd’hui réservée à des sites explicitement autorisés, qui sont aujourd’hui exlusivement des sites d’organismes publics (je dispose d’un petit passe droit ;-)

En plus de l’incontournable xavierraffin.com, le calculateur est disponible sur les sites suivants :<ul>

  • tisseo.fr</i>
  • toulouse-metropole.fr
  • haute-garonne.fr
  • sicoval.fr
  • Mairie de Balma
  • Mairie de Colomiers
  • Mairie de Cornebarieu
  • Mairie de Plaisance du Touch
  • Mairie d'Aucamville
  • Mairie de Labarthe sur Lèze
  • Mairie de Saint Genies Bellevue
  • Mairie d'Escalquens
  • Mairie de Seilh
  • Mairie de Fonsorbe
  • Mairie de Launaguet
  • Mairie de Villeneuve-Tolosane
  • Mairie de Gratentour
  • et la liste s'allonge toutes les semaines...
  • </ul>

    Explications techniques

    Intégration dans un site web

    Techniquement, le calculateur est hébergé et administré chez Tisséo, et la technique d'intégration retenue pour ce widget s'appelle le JSONP :
    Intégration du calculateur dans une page web

    Sur la page du "site hôte", il suffit d'ajouter le code HTML suivant :
    <script type="text/javascript" src=".../jquery.min.js" ></script>
    <script type="text/javascript" src=".../OpenLayers.js" ></script>
    <link rel="stylesheet" href="http://cimm.tisseo.fr/direct-mb-cimm-1.0/cimm.css" type="text/css"/>
    <script src="http://cimm.tisseo.fr/ci-multimodal-v2.0" type="text/javascript"></script>
    <div id="div_load_calculateur"></div>
    Les éléments importants sont :
    La balise d'accroche du widget : c'est à cet endroit de la page que va s'insérer le formulaire :
    <div id="div_load_calculateur"></div>
    Le script de chargement du formulaire : il charge les données depuis les serveurs Tisséo et remplace la balise précédente par le formulaire
    <script src="http://cimm.tisseo.fr/ci-multimodal-v2.0" type="text/javascript"></script>
    Vous remarquerez que le domaine utilisé içi est cimm.tisseo.fr : ce n'est pas le domaine du site hôte.

    C'est cela qui permet de contourner les restrictions de sécurité "Cross Domain" des navigateurs.

    En effet, une fois le formulaire chargé, celui-ci dialogue avec le serveur Tisséo (pour l'autocomplétion, et l'affichage des résultats) sans rechargement de la page.

    Or le JavaScript interdit toujours la communication Ajax avec un autre domaine sauf dans le cas d'un chargement d'un script de ce domaine par le HTML. C'est cette technique qu'on appelle le JSONP.

    Note: Il existe une nouvelle technique normalisé par le W3C qui permet de faire la même chose plus simplement : le CORS.
    Cependant, cette technique n'est pas supportée par les plus vieux navigateurs (notament IE)


    Enfin, concernant l'apparence du widget, le site hôte peut :
    • soit utiliser la CSS prédéfinie par Tisséo (comme c'est le cas sur cette page)
    • soit modifier cette CSS et la charger localement : cela permet par exemple de changer les couleurs et les dimensions

    Spécificités du calcul mixte


    Une des grosses nouveautés fonctionnelle introduite par ce calculateur est la possibilité d'effectuer des calculs mixtes "Voiture + Piéton" (ou "Vélo + Piéton") de manière automatique.

    Il faut comprendre içi que c'est le calculateur qui choisi le point de rupture entre les modes.

    Trop de voiture !

    Quand on compare les temps de trajets "Routier" et "Transport en Commun", il sera presque toujours plus rapide de prendre la voiture.


    C'est généralement faux en pratique car les bouchons pénalisent le temps de trajet voiture


    Pour éviter d'encourager l'utilisation de la voiture individuelle, nous avons introduit des notions "politiques" :
    • un ratio : on limite la proportion de trajet effectuée en voiture
    • une mesure de densité d'offre : à 4 heures du matin, ou dans un village de montagne, les trajets "Transport en commun" sont souvent assez ridicules peu performants.
      Dans ces cas là, il faut donc autoriser un plus grand nombre de kilomètres en voiture pour obtenir un temps de trajet acceptable.

    Voici ce que ça donne en pratique :

    Influence de la densité d'offre sur le trajet en voiture (en noir)

    Sur la figure précédente, on voit que lorsque l'offre de Transport public est plus forte le calculateur propose un trajet en voiture plus court.

    Voyons maintenant plus en détail comment nous avons mis cela en musique :

    Architecture hybride


    Les choix fonctionnels effectués pour ce calculateur, étant parfois éloigné de la roadmap SYNTHESE et du cap fixé par ça communauté, il nous a fallu introduire certaines fonctionnalités dans une surcouche.

    Concrètement, cela signifie que les requêtes adressées au serveur Tisséo transitent par un "proxy applicatif" qui enchaine les appels à SYNTHESE et les enrichit de données tierces :


    Symfony compose avec "intelligence" les réponses aux requêtes utilisateurs

    Pour le mode "Transport en Commun", le Symfony se contente de transmettre la requête à SYNTHESE et de renvoyer la réponse à l'internaute.

    Pour les trajets mixtes "Routier" + "Transport en Commun" Symfony interroge plusieurs services SYNTHESE, prend des décisions et compose une réponse à l'internaute:
    1. Requête de densité d'offre: dans quel rayon autour du point de départ et dans un intervalle d'une heure après l'heure de départ demandée y a-t-il 50 services au départ ?
    2. Si rayon > 1km : Requête de trajet mixte "Transport en Commun" + "Routier" : calcul d'itinéraire en limitant la distance parcourue en voiture à la distance obtenue précédement (avec application d'un ratio et en s'assurant que le rapport distance en voiture / distance total reste inférieur à 1/3)
    3. Si rayon < 1km : Requête de trajet "Transport en Commun" </i> : calcul d'itinéraire en Transport en Commun seulement : en effet, on ne prend pas sa voiture pour faire 500 mètres
    4. </ol>

      Principe de fonctionnement du service de "Densité de Service"
      que j'ai codé directement dans le code de SYNTHESE


      Autre exemple mixte "Routier" + "Transport en Commun" mais avec un rabattement sur les parcs relais
      1. Requête spatiale postGIS : pour trouver les 5 parcs relais les plus proches à vol d'oiseau
      2. 5 Requetes de calcul routier vers les XY obtenus: pour trier dans l'ordre les parcs relais les plus proches par la route (ce qui peut être très différent du résultat à vol d'oiseau suivant la topologie (peu de ponts sur la garonne par exemple))
      3. 1 Requete "Transport en Commun": depuis le parcs relais le plus proche jusqu'au lieu d'arrivée
      La réponse renvoyée à l'internaute sera l'agrégation du trajet routier jusqu'au parc relais suivi du trajet TC.

      Enfin pour d'autres requêtes comme la recherche spatiale de station VélôToulouse Symfony fait le travail sans SYNTHESE en utilisant simplement une base PostGIS.

      Conclusion


      Ce premier projet "multi-réseaux" sur lequel j'ai été amené à travailler a été une expérience éprouvante mais finalement passionante.
      En effet, les délais impartis pour la réalisation étaient particulièrement serrés, et le résultat soumis au jugement de nombreux acteurs professionels du transport.
      Il nous a aussi fallu progresser de façon très importante sur notre système de gestion de données : l'intégration quotidienne des données de plusieurs réseaux au sein d'un même système nécessite des processus très industrialisés.

      Sur le résultat :

      Nous sommes assez fiers des possibilités puissantes du calcul mixte "Routier" + "Transport en commun" qui offre une alternative crédible au tout voiture pour les zones péri-urbaines : ces concepts seront peut-être généralisés aux autres services Tisséo (c'est en réflexion).

      L'outil semble trouver son public : la fréquentation du premier mois ayant été très encourageante pour une plateforme multimodale (plus de 500 calculs par jour pour le premier mois tout sites confondus)