AngoraTek EN
← Retour au blog
Notes de terrain 12 min de lecture

Pourquoi les moteurs de routage ne sont jamais d'accord

Donnez un même trajet berlinois, de 52.52, 13.40 à 52.54, 13.42, à quatre moteurs de routage. Radar, le cinquième fournisseur couvert par notre bibliothèque cliente, ne modélise que quatre des dix domaines et reste hors de cette comparaison de routage. HERE, Google, TomTom et Mapbox répondent chacun en nettement moins d'une seconde, et chaque réponse est assurée d'elle-même : une polyligne, une heure d'arrivée estimée, une distance, une liste de virages. Les jours où nous avons capturé cette paire exacte, les quatre réponses ont rarement été d'accord sur davantage que le squelette du trajet : la rue de départ, le principal couloir le plus rapide, un endroit pour le quitter. La ligne ci-dessous enregistre l'une de ces captures ; nous ne moyenons pas les écarts en un chiffre que nous défendrions pour toujours, parce que le jour où vous benchmarkez change la réponse.

Ce désaccord n'est ni du bruit, ni un bug. Un itinéraire est le minimum de la fonction de coût de quelqu'un, calculé sur l'instantané privé de quelqu'un d'autre du réseau routier, et vendu dans le cadre du modèle économique d'un troisième. Ces instantanés, ces fonctions de coût et ces modèles économiques ont chacun été calibrés pour un client différent. Nous avons cessé de lire l'écart entre moteurs comme un terme d'erreur, parce qu'il porte une information qu'aucune réponse seule ne contient : il vous dit à qui chaque moteur pense avoir affaire. Un répartiteur, un chauffeur de camion et un cycliste ne posent pas la même question, et aucun moteur ne répond bien aux trois à la fois.

Quatre moteurs, une même paire de coordonnées, quatre avis

Rien dans la requête ne change d'une ligne à l'autre.

# one query, two providers shown; the other two behave the same
everymap --api-key $HERE_KEY route --origin "52.52,13.40" --destination "52.54,13.42" --transport car
everymap --provider google --api-key $GOOGLE_KEY route --origin "52.52,13.40" --destination "52.54,13.42" --transport car

Les deux commandes renvoient une sortie à peu près de même forme, et c'est bien là le but du client qui les exécute. everymap est un wrapper Rust que nous avons écrit et publié sous licence MIT, et son existence fait que la comparaison ci-dessus tient en deux lignes plutôt qu'en deux intégrations. Des entrées identiques font que toute différence dans les sorties parle des moteurs, pas de notre code. Les champs de durée des deux réponses n'ont jamais coïncidé, à aucun des jours où nous avons lancé cette paire : à quelques secondes d'écart les matins dégagés, à plusieurs minutes quand une carte connaît une fermeture que l'autre n'a pas encore ingérée. Rien dans l'une ou l'autre réponse ne vous dit quel moteur est plus proche de la vérité sur votre rue, le jour de votre trajet.

Chaque champ sort d'une décision prise en amont de la requête. Quatre décisions amont font presque tout le travail, et chacune mérite qu'on s'y attarde.

La carte est un pari, pas une photographie

Chaque fournisseur entretient sa propre image du réseau routier, assemblée à partir de relevés payants, de publications publiques, de flux commerciaux, de données de flotte et, dans au moins un cas, d'années de sondages téléphoniques anonymisés. L'image est retouchée en continu, mais uniquement là où quelqu'un a remarqué un problème. Deux fournisseurs peuvent couvrir la même ville et la couvrir différemment. Une restriction de virage manquée par l'un change le coût de chaque itinéraire qui franchit ce carrefour. Une route classée résidentielle dans un graphe et voie de service dans l'autre redéfinit discrètement quelles rues méritent d'être empruntées.

Les conséquences se sentent vite sur le terrain. La bretelle de sortie rouverte ce printemps peut figurer dans le graphe d'un fournisseur dès la fin de l'été et manquer encore à l'autre en ce mois d'octobre. Un planificateur de livraison qui tourne sur la carte la plus ancienne envoie alors la moitié de ses camions faire un détour autour d'un bâtiment qui n'en exige plus. Les deux moteurs annoncent des itinéraires sûrs d'eux-mêmes. Aucun ne ment. L'un a parié autrement sur quelles modifications comptaient, et le pari a expiré sans que personne ne soit prévenu.

Le même pari court sur toute la chaîne, jusqu'aux lieux qui ne bougent jamais : demandez à quatre moteurs où se trouve la porte de Brandebourg, et des différences d'interpolation peuvent écarter le pointeur de dizaines de mètres.

# one address, four answerers
everymap --api-key $HERE_KEY geocode "Brandenburg Gate, Berlin"
everymap --provider google --api-key $GOOGLE_KEY geocode "Brandenburg Gate, Berlin"

Un itinéraire est le minimum de la fonction de coût de quelqu'un

Donnez à n'importe quel moteur le même point de départ, la même destination et trois modes de transport, et vous obtiendrez trois philosophies différentes de la route. Le profil voiture achète surtout du temps. Le profil camion obéit à la route telle qu'elle est écrite pour une remorque de 13,6 m : gabarits, limites par essieu, restrictions de tonnage, classes de marchandises dangereuses. Son chemin le moins cher est donc légal d'abord, rapide ensuite. Le profil VE pèse les pentes, parce qu'une côte est une décision de batterie, et il insérera une pause de recharge dans un itinéraire auquel une voiture à essence ne penserait jamais.

Le désaccord plus subtil se joue entre deux moteurs dans le même mode. L'un pondère un virage à gauche en travers de la circulation comme une taxe et accepte de faire trois pâtés de maisons de plus pour l'éviter ; l'autre le compte à peine. L'un facture une pénalité lourde par feu tricolore, l'autre dilue les feux dans un retard moyen au carrefour mesuré il y a des années sur d'autres rues. Même origine, même destination, routes différentes, et aucun des deux moteurs n'a commis d'erreur. Chacun a optimisé la question qu'on lui a posée. L'utilisateur qu'on n'a pas consulté, c'est celui qui tient le téléphone.

Les modèles de trafic divergent parce qu'ils mesurent des véhicules différents

La couche de trafic est là où les moteurs s'écartent le plus, parce que les sources physiques diffèrent. Les vitesses en direct de Google proviennent en très grande majorité de téléphones grand public qui exécutent son logiciel, d'où une couverture en ville extraordinaire et une couverture des pistes forestières maigre au mieux. TomTom et HERE fusionnent des flux de sondes avec des historiques de vitesse, ce type de modèle capable de décrire à quoi ressemble habituellement un mardi 08:00 même quand personne ne transmet aujourd'hui. Mapbox construit ses estimations à partir de traces anonymisées qui transitent par les SDK que ses clients embarquent.

Confrontez ces modèles à une même route et le désaccord apparaît selon un motif, pas au hasard. Une autoroute équipée de boucles de comptage et dense en navetteurs est bien mesurée par toutes les sources, et les quatre ETA se regroupent. Une traversée de quartier résidentiel peine à apparaître dans les flux commerciaux, et les moteurs divergent. Conséquence pratique : un moteur peut être le meilleur disponible le dimanche matin et le pire disponible le lundi matin, sur les mêmes rues, parce que son modèle du mardi matin a été calibré sur les mardis de quelqu'un d'autre.

La couche la plus fraîche est aussi une décision tarifaire

La fréquence de mise à jour est le multiplicateur silencieux. Chaque fournisseur rafraîchit son graphe, sa couche de trafic et ses profils historiques à son propre rythme. Les uns recalculent le trafic en direct toutes les quelques minutes, les autres publient leurs mises à jour de profils sur des cycles plus lents, et l'API que vous interrogez peut refléter un graphe vieux de plusieurs mois tandis que l'application grand public de la même société affiche celui du matin même. La cadence n'est pas annoncée bien fort, et elle n'est pas uniforme entre les produits d'un même fournisseur.

Le tarif façonne lui aussi la réponse. Des moteurs facturés à la transaction ont intérêt à vous tenir en mode requête plutôt qu'en précalcul, et certains des attributs les plus précieux, les dimensions camion et les restrictions légales au niveau du virage, se trouvent derrière des paliers de contrat supérieurs. Sans citer de chiffres qui changent chaque mois : la carte que vous recevez est en partie fonction de la facture que vous avez acceptée. Quand un fournisseur abandonne une partie de sa grille tarifaire, vos itinéraires peuvent changer sans qu'une seule ligne de votre code ne bouge.

Nous avons passé deux semaines à comparer des captures d'écran

La première version de cette comparaison, la nôtre, fut une impasse, et elle a droit à ses deux phrases franches. Au printemps 2026, avant que la CLI ne soit publiée, nous comparions les moteurs en lançant les mêmes requêtes côte à côte et en lisant à l'œil des réponses formatées de quatre manières différentes, plus les fils de forum que nous pouvions dénicher. Cela produisait des convictions solides et aucune donnée. Chaque désaccord sur une ETA avait trois explications candidates : un graphe plus récent, une pénalité de virage différente, un modèle de trafic calibré sur un autre jour. Et l'œil ne peut pas les départager.

La solution n'était pas plus de données, mais des entrées corrigées. C'est toute la raison pour laquelle everymap a gagné un harnais de benchmark dans sa v0.2.2, publiée pour la première fois le 15 septembre 2026. everymap-bench fait passer les mêmes paires origine-destination par chaque fournisseur configuré, dans le même mode de transport, et émet une sortie en tableau, en JSON ou en markdown, si bien qu'un désaccord devient une ligne dans un fichier au lieu d'une capture d'écran dans un fil. Cela ne rend pas les fournisseurs parfaitement comparables. Cela rend leur désaccord reproductible, et c'est bien là la seule partie sur laquelle on peut agir.

Ce qu'est réellement une comparaison contrôlée

Trois choses sont maintenues constantes, et les trois ne coûtent presque rien à maintenir dès que la plomberie tient en un seul client.

Les paires viennent de la ville où vous opérez, pas de l'adresse de démonstration d'un fournisseur. Un benchmark de la porte de Brandebourg à la Potsdamer Platz en dit quelque chose à un exploitant logistique berlinois, presque rien à un coursier toulousain.

Le jour et les créneaux horaires sont fixés et consignés, parce que mardi 07:30 est une autre carte que dimanche 11:00.

Une règle de score par domaine, décidée avant la campagne : distance et nombre de virages pour un système de répartition, vraisemblance d'arrivée contre un horaire fixe pour un service de navette, nombre d'arrêts de recharge pour la planification d'autonomie d'un VE.

pair     origin       destination    transport   captured
ber-001  52.52,13.40  52.54,13.42    car         2026-09-08 07:30 CEST

La limite honnête, c'est que le trafic ne se rejoue pas. Un accident ou un match de football déplace les routes davantage que la plupart des différences de modèles, et rien de tout cela ne peut être maintenu constant entre deux campagnes. Une capture d'un jour est une affirmation au sujet d'un jour capturé. Lancez les paires à répétition quand la décision coûte cher, et acceptez qu'un benchmark répond « qui est meilleur aujourd'hui » avec bien plus d'assurance que « qui est meilleur ».

Le désaccord est une carte de vos utilisateurs

Une fois l'écart mesuré, il devient un sélecteur. Le tableau ci-dessous est notre triage, forgé sur les paires que nous lançons. C'est une opinion avec sa source, pas une évaluation neutre des fournisseurs, et il faudra le relancer à chaque renouvellement de contrat.

La question poséeLe moteur qui tend à gagnerPourquoi il tend à gagnerCe que cela vous coûte
Routage camion avec gabarits et règles d'essieuHEREl'empilement d'attributs routiers le plus profond des quatreun outillage grand public mince autour des données
Trafic en direct grand public dans les villes densesGoogleune couverture par téléphone qu'aucun réseau de capteurs routiers n'égaleaucune visibilité sur le modèle, aucun contrôle
Autonomie VE et planification des arrêts de rechargeTomTomdes attributs de charge et d'autonomie proches du routeurun écosystème développeur plus étroit
Profils de coût personnalisés dans votre propre codeMapboxun routeur conçu pour que les développeurs réajustent les pondérationsdes estimations de trafic impossibles à inspecter
Si le tableau est une carte des utilisateurs plutôt qu'un classement des moteurs, c'est que la même origine et la même destination se font noter de trois manières différentes par trois personnes. Le répartiteur les note en minutes de flotte. Le chauffeur les note en certitude d'arriver. Le cycliste les note à ceci près : l'itinéraire ne doit jamais l'envoyer en plein dans quatre voies de circulation. Ces trois personnes sont souvent mieux servies par trois moteurs différents, et une fois les questions proprement écrites, un « meilleur » mono-fournisseur n'existe pas. L'erreur consiste à écraser les trois utilisateurs sur un seul contrat parce qu'un seul tableau de bord est plus lisible.

Où ce raisonnement s'arrête

Les limites ont besoin d'autant de place que les victoires. Nos paires de benchmark se comptent en dizaines, pas en milliers : le harnais répond à des questions de triage, il n'est pas un classement. Les moteurs changent leurs graphes et leurs contrats sous le benchmark, si bien que toute conclusion porte la date du jour et expire au moment de renégocier. Et les règles de score sont des opinions avec des unités attachées : dès que le coût réel de vos utilisateurs s'écarte de la règle, redérivez la règle depuis l'utilisateur plutôt que depuis le benchmark.

Quatre moteurs en désaccord sur les mêmes deux points, ce ne sont pas quatre échecs. Ce sont quatre définitions du « meilleur », chacune avec son client attaché, et le travail consiste à déterminer précisément qui pose la question.

Merci d'avoir lu jusqu'ici. Si cela ressemble au problème sur lequel vous butez, parlez-nous-en. Un fondateur lit chaque message.

Engager la conversation