API Dispatch (Optimisation d’itinéraire)

Utilisez Dispatch pour optimiser des itinéraires avec plusieurs véhicules et de nombreux arrêts. Dispatch renvoie un itinéraire ordonné par véhicule avec des données de temps, de distance et d’affectation pour la livraison, le service terrain, les opérations de messagerie et la planification de flotte.

Vue d’ensemble de l’API Dispatch de TrackRoad montrant des véhicules et des arrêts transformés en itinéraires optimisés
Dispatch répartit les arrêts entre plusieurs véhicules et renvoie des itinéraires optimisés avec l’ordre des arrêts, l’ETA, la distance et la durée pour chaque véhicule.

Besoin du contrat complet ?

Utilisez Swagger pour les modèles REST et le WSDL pour les détails d’intégration SOAP.

Voir Swagger UI Voir le WSDL SOAP Vue d’ensemble de la référence API

Table des matières

  1. Ce que fait Dispatch
  2. Mode Optima, Time Window et TimeWindowDepot
  3. Enlèvements et livraisons multiples
  4. Endpoints et URL de base
  5. Authentification
  6. Schéma de requête
  7. Schéma de réponse
  8. Erreurs courantes
  9. Bonnes pratiques
  10. Endpoints associés
  11. FAQ

Ce que fait Dispatch#

Dispatch résout un problème de routage multi-véhicules. Il affecte les arrêts aux véhicules et ordonne chaque itinéraire en utilisant des contraintes telles que les créneaux horaires, la capacité, la priorité et les lieux de départ ou d’arrivée.

LatLong est à privilégier. Chaque arrêt devrait inclure LatLong lorsque c’est possible. Si LatLong n’est pas fourni, vous devez fournir Address afin que le service puisse géocoder l’arrêt.

La méthode Dispatch accepte une liste de véhicules et une liste de lieux d’arrêt. Chaque véhicule peut inclure un lieu de départ et un lieu d’arrivée facultatif. Chaque lieu peut contenir un nom, des champs d’adresse ainsi que la latitude et la longitude.

Si la latitude et la longitude sont présentes, TrackRoad les utilise directement. Sinon, le service géocode l’adresse afin d’obtenir des coordonnées.

Dispatch renvoie des éléments véhicule. Chaque élément véhicule contient l’itinéraire attribué sous la forme d’une liste ordonnée d’arrêts, optimisée selon l’emplacement, la capacité, le temps et d’autres facteurs de routage.

Lorsqu’un seul véhicule est disponible, Dispatch effectue uniquement une optimisation d’itinéraire. Les modes de dispatch comptent principalement lorsqu’il y a plusieurs véhicules disponibles.

Si vous ne savez pas quel mode de dispatch utiliser, commencez par Auto. Pour une optimisation très précise sur un seul véhicule, utilisez Optima.

Mode Optima, Time Window et TimeWindowDepot#

Dans certains langages, il peut être impossible de transmettre une valeur datetime nulle. Dans ce cas, utilisez 0001-01-01T00:00:00. Les dates antérieures au seuil système sont traitées comme des valeurs nulles.

Pour obtenir les meilleurs résultats, utilisez DispatchMode Optima.

Trois variables influencent le comportement du dispatch avec créneaux horaires :

  • CanArriveEarly
  • TimeConstraintArrival
  • TimeConstraintDeparture

Option 1 : CanArriveEarly = true

Lorsque CanArriveEarly vaut true, le créneau horaire commence au début de la journée. Si TimeConstraintArrival est null, l’arrêt peut être visité à tout moment dans la journée. Si TimeConstraintArrival est défini, il détermine l’heure d’arrivée maximale acceptable. L’heure de départ est ignorée.

Option 2 : CanArriveEarly = false

Lorsque CanArriveEarly vaut false, l’arrivée et le départ définissent le créneau horaire autorisé. Si l’arrivée est définie et le départ est null, l’arrêt est traité comme un rendez-vous précis. Si les deux sont définis, TrackRoad tente de visiter l’arrêt dans cette plage horaire.

Option 3 : Deux créneaux horaires

Vous pouvez également définir un second créneau horaire à l’aide de TimeConstraintArrival2 et TimeConstraintDeparture2. Cela est utile lorsqu’un arrêt ne peut être visité que pendant deux périodes distinctes, par exemple des horaires de livraison restreints en centre-ville. TimeWindowDepot suit la même logique, mais suppose que les véhicules démarrent et terminent dans un dépôt commun.

Les pauses peuvent être modélisées avec LocationType = Break. Les chaînes d’enlèvements et de livraisons multiples ne prennent en charge qu’un seul créneau horaire de livraison au niveau de la livraison, et cette contrainte temporelle enfant ne peut pas être plus stricte que la contrainte parent.

Enlèvements et livraisons multiples#

Dispatch prend en charge l’enchaînement des enlèvements et des livraisons. Cela est utile pour les opérations de messagerie et les workflows dans lesquels un arrêt doit être visité avant un autre.

Utilisez Midway pour le premier arrêt d’une chaîne et Delivery pour spécifier le lieu lié suivant. Utilisez DeliveryNonStop pour déterminer si la livraison liée suivante doit avoir lieu immédiatement ou peut intervenir plus tard sur le même itinéraire.

Par exemple, si un colis est collecté à l’emplacement B et livré à l’emplacement M, TrackRoad préserve la relation requise entre l’enlèvement et la livraison tout en optimisant l’itinéraire autour des autres arrêts.

DeliveryNonStop = true

Lorsque DeliveryNonStop vaut true, l’arrêt de livraison lié doit être visité immédiatement après l’arrêt d’enlèvement.

DeliveryNonStop = false

Lorsque DeliveryNonStop vaut false, la livraison liée doit toujours avoir lieu après l’enlèvement, mais elle ne doit pas forcément intervenir immédiatement.

Vous pouvez chaîner plusieurs livraisons, par exemple B → M → N, en définissant Delivery et KeepSameOrder sur chaque arrêt lié.

Pour les tournées aller-retour, définissez les emplacements d’enlèvement, de livraison et de retour sous forme de chaîne. Une recommandation courante est DeliveryNonStop = false et KeepSameOrder = true pour une optimisation plus souple tout en conservant l’ordre métier.

Exemple d’arrêts aller-retour de l’API TrackRoad
Exemple : arrêts aller-retour.
Exemple d’itinéraire aller-retour de l’API TrackRoad
Exemple : itinéraire aller-retour.

Endpoints et URL de base#

REST

Élément Valeur
URL de base https://trackservice.trackroad.com
Endpoint POST /rest/dispatch
URL complète https://trackservice.trackroad.com/rest/dispatch
Content-Type application/json

SOAP

Élément Valeur
Endpoint https://trackservice.trackroad.com/TrackService.asmx
WSDL https://trackservice.trackroad.com/TrackService.asmx?WSDL
Méthode Dispatch
SOAPAction http://trackservice.trackroad.com/Dispatch

SOAP utilise les mêmes modèles DispatchSpecification et DispatchResult. La principale différence réside dans l’enveloppe SOAP et l’authentification par en-tête.

Authentification#

Authentification REST (X-API-Key)

Incluez votre TrackServiceKey dans l’en-tête X-API-Key pour chaque requête. Générez la clé dans votre compte TrackRoad à Authentification API .

curl -X POST "https://trackservice.trackroad.com/rest/dispatch" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_TRACKSERVICEKEY" \
  -d '{ "RoutingService": 0, "DistanceUnit": 0, "RouteOptimize": 0, "Vehicles": [], "Locations": [] }'

Conservez les clés API côté serveur. N’intégrez pas de clés dans le code du navigateur ou d’un client mobile.

Authentification SOAP (SessionIDHeader)

Pour les requêtes SOAP, envoyez votre TrackServiceKey dans SessionIDHeader comme SessionID. Les anciens appels Login et Logout ne sont pas nécessaires lorsque vous utilisez l’authentification TrackServiceKey.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <SessionIDHeader xmlns="http://trackservice.trackroad.com/">
      <SessionID>YOUR_TRACKSERVICEKEY</SessionID>
    </SessionIDHeader>
  </soap:Header>
  <soap:Body>
    <Dispatch xmlns="http://trackservice.trackroad.com/">
      <specification>
        <RoutingService>0</RoutingService>
        <DistanceUnit>0</DistanceUnit>
        <RouteOptimize>0</RouteOptimize>
        <Vehicles />
        <Locations />
      </specification>
    </Dispatch>
  </soap:Body>
</soap:Envelope>

Les namespaces et préfixes SOAP peuvent varier selon votre outillage. Un client généré depuis le WSDL est généralement l’option la plus simple.

Schéma de requête#

Le corps de la requête est un objet unique : DispatchSpecification. Au minimum, fournissez les véhicules et les emplacements.

DispatchSpecification

Propriété Type Obligatoire Description
RoutingServiceint (enum)NonMoteur de routage. 0 = NetRoad, 1 = TrackRoad, 2 = Bing. Recommandé : 0 = NetRoad.
IsNeedMatchCodeboolNonSi true, inclut les codes de qualité de correspondance de géocodage lorsque c’est pertinent.
CurrentTimestring (date-time)NonRéférence temporelle actuelle utilisée pour les contraintes horaires au format ISO 8601.
DispatchModeint (enum)NonStratégie d’optimisation. Pour les recommandations de mode, voir Modes de Dispatch.
MinimumOptimizationintNonSeuil d’intensité de l’optimisation. Plage typique : de 1 à 10.
DistanceUnitint (enum)Non0 = Mile, 1 = Kilomètre.
RouteOptimizeint (enum)Non0 = MinimizeTime, 1 = MinimizeDistance. Recommandé : 0 = MinimizeTime.
VehiclesVehicle[]NonVéhicules disponibles pour le dispatch.
LocationsLocation[]OuiArrêts à affecter et à ordonner.

DispatchMode

Propriété Type Valeur Description
Autoint0Sélectionne automatiquement une stratégie de dispatch adaptée. Meilleur point de départ par défaut.
EqualStopint1Tente de répartir un nombre égal d’arrêts entre les véhicules.
SingleRegionint2Utile lorsque les véhicules sont géographiquement dispersés mais desservent des arrêts dans des zones similaires.
MultipleRegionint3Utile pour les véhicules opérant dans différentes villes ou régions éloignées et pour le dispatch terrain en temps réel.
EqualHourint4Tente de répartir le travail en itinéraires ayant une durée totale similaire.
EqualDistanceint5Tente de répartir le travail en itinéraires ayant une distance totale similaire.
TimeWindowint6Priorise les rendez-vous et les créneaux de livraison. L’optimisation peut être réduite pour respecter les contraintes temporelles.
TimeWindowDepotint7Mode de créneau horaire supposant un dépôt central partagé par les véhicules.
Optimaint8Mode de haute précision pour un seul véhicule, avec ou sans créneaux horaires.
BalanceLocationint9Équilibre le nombre d’arrêts attribués entre plusieurs conducteurs.
BalanceTimeint10Équilibre le temps de parcours entre plusieurs conducteurs.
MinimumVehiclesint11Sélectionne le nombre minimal de véhicules requis pour desservir tous les arrêts, en tenant compte des facteurs de routage.

Vehicle

Propriété Type Obligatoire Description
NamestringRecommandéIdentifiant du véhicule affiché dans les résultats.
EmailstringNonContact facultatif du conducteur ou du véhicule.
GroupstringNonChamp de regroupement facultatif tel qu’équipe, dépôt ou région.
SpeedintNonRemplacement facultatif de la vitesse. Si défini sur 0, la vitesse routière par défaut est utilisée.
MaxStopsintNonNombre maximal d’arrêts par itinéraire pour le véhicule.
MaxWeightdoubleNonCapacité maximale de poids du véhicule.
MaxSkidsintNonCapacité maximale en palettes/skids du véhicule.
MaxVolumedoubleNonCapacité maximale de volume du véhicule.
MaxMinutesintNonDurée maximale d’itinéraire pour le véhicule.
FuelCostdoubleNonParamètre de coût facultatif utilisé par certains modes d’optimisation.
OnTheRoadboolNonSi true, un itinéraire sur plusieurs jours peut continuer depuis le lieu de fin du jour précédent au lieu de revenir au point de départ initial.
Tinstring (date-time)NonHorodatage à partir duquel le véhicule est disponible.
Toutstring (date-time)NonHorodatage jusqu’auquel le véhicule est disponible.
StartLocationLocationNonDépôt de départ ou position de départ facultatif pour le véhicule.
FinishLocationLocationNonDépôt d’arrivée ou position de fin facultatif pour le véhicule.
RolesstringNonChaîne de rôle facultative pouvant être mise en correspondance avec les conditions des arrêts.
TransportTypeint (enum)NonMode de transport tel que voiture, camion, bus, moto, piéton, scooter ou vélo.
ExcludeTollsboolNonIndique si les routes à péage doivent être évitées.
ExcludeHighwaysboolNonIndique si les autoroutes doivent être évitées.
UseTruckRouteboolNonIndique si les itinéraires poids lourds doivent être privilégiés ou autorisés.
WidthfloatNonLargeur du véhicule en mètres.
HeightfloatNonHauteur du véhicule en mètres.
LengthfloatNonLongueur du véhicule en mètres.
AxleLoadfloatNonCharge par essieu du véhicule en tonnes métriques.
AxleCountintNonNombre d’essieux.
Exemple de la fonctionnalité OnTheRoad d’un véhicule dans l’API TrackRoad
Exemple : comportement quotidien d’un itinéraire avec OnTheRoad activé ou désactivé.

Location

Chaque lieu devrait inclure LatLong lorsque c’est possible. Si les coordonnées sont absentes, Address est requis afin que TrackRoad puisse géocoder l’arrêt.

Propriété Type Obligatoire Description
MatchCodeint (enum)NonCode de qualité de correspondance du géocodage.
NamestringNonLibellé de l’arrêt affiché dans les résultats.
DeliverystringNonNom du lieu de livraison lié ou libellé client.
DeliveryNonStopboolNonDétermine si la livraison liée doit avoir lieu immédiatement après l’arrêt en cours.
KeepSameOrderboolNonSi true, préserve l’ordre relatif défini dans la requête.
VehiclestringNonPré-affectation facultative à un véhicule spécifique par son nom.
DescriptionstringNonNotes ou description facultatives.
PhonestringNonNuméro de téléphone de contact facultatif.
LatLongLatLongConditionnelSaisie de coordonnées à privilégier. Requise si Address n’est pas fournie.
AddressAddressConditionnelAdresse utilisée pour le géocodage lorsque LatLong n’est pas fourni.
PriorityintNonIndice de priorité pour l’optimisation.
WaitintNonTemps de service ou d’attente à l’arrêt.
VolumedoubleNonDemande de volume consommée sur la capacité du véhicule.
WeightdoubleNonDemande de poids consommée sur la capacité du véhicule.
SkidsintNonDemande de palettes/skids consommée sur la capacité du véhicule.
TimeConstraintArrivalstring (date-time)NonValeur d’arrivée du créneau horaire principal.
TimeConstraintDeparturestring (date-time)NonValeur de départ du créneau horaire principal.
TimeConstraintArrival2string (date-time)NonValeur d’arrivée facultative du second créneau horaire.
TimeConstraintDeparture2string (date-time)NonValeur de départ facultative du second créneau horaire.
LocationTypeint (enum)Non0 = Midway, 1 = Start, 2 = Finish, 3 = Delivery, 4 = MidwayDrop, 5 = Break.
CanArriveEarlyboolNonSi false, l’arrivée avant le créneau horaire autorisé n’est pas permise.
ConditionsstringNonRègle métier ou condition de correspondance de rôle facultative.

LatLong

Propriété Type Obligatoire Description
LatitudedoubleOuiLatitude en degrés (-90 à 90).
LongitudedoubleOuiLongitude en degrés (-180 à 180).

Address

Propriété Type Obligatoire Description
StreetstringRecommandéAdresse de rue.
CitystringRecommandéVille.
StatestringNonÉtat ou région.
PostalCodestringNonCode postal.
CountrystringRecommandéPays.

Schéma de réponse#

Une réponse réussie renvoie DispatchResult contenant des éléments d’itinéraire par véhicule, ainsi que d’éventuelles erreurs ou alertes.

DispatchResult

Propriété Type Description
ItemsVehicleItem[]Éléments de résultat par véhicule contenant l’itinéraire attribué.
ErrorsError[]Erreurs ou alertes facultatives.
Statusint (enum)Statut de l’opération : 0 = None, 1 = Success, 2 = Failed, 3 = SuccessWithErrors.

VehicleItem

Propriété Type Description
VehicleVehicleLe véhicule associé à cet itinéraire.
LocationsLocation[]Emplacements ordonnés attribués à ce véhicule.

Error

Propriété Type Description
MessagestringMessage d’erreur ou d’alerte lisible par un humain.

Exemples#

Les blocs de code d’exemple de requête et de réponse peuvent rester inchangés et n’ont pas besoin d’être localisés.

{
  "RoutingService": 0,
  "DistanceUnit": 0,
  "RouteOptimize": 0,
  "DispatchMode": 0,
  "Vehicles": [
    {
      "Name": "Truck 1",
      "StartLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 1 },
      "FinishLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 2 }
    }
  ],
  "Locations": [
    { "Name": "Stop A", "LatLong": { "Latitude": 37.7897, "Longitude": -122.4011 }, "LocationType": 0 },
    { "Name": "Stop B", "LatLong": { "Latitude": 37.7810, "Longitude": -122.4110 }, "LocationType": 0 }
  ]
}

REST request examples (multiple languages)#

curl -X POST "https://trackservice.trackroad.com/rest/dispatch" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_TRACKSERVICEKEY" \
  -d '{
    "RoutingService": 0,
    "DistanceUnit": 0,
    "RouteOptimize": 0,
    "DispatchMode": 0,
    "Vehicles": [
      {
        "Name": "Truck 1",
        "StartLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 1 },
        "FinishLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 2 }
      }
    ],
    "Locations": [
      { "Name": "Stop A", "LatLong": { "Latitude": 37.7897, "Longitude": -122.4011 }, "LocationType": 0 },
      { "Name": "Stop B", "LatLong": { "Latitude": 37.7810, "Longitude": -122.4110 }, "LocationType": 0 }
    ]
  }'

SOAP request examples (multiple languages)#

SOAP uses the same DispatchSpecification model, but it’s wrapped in a SOAP envelope and authenticated via SessionIDHeader (SessionID = TrackServiceKey).

curl -X POST "https://trackservice.trackroad.com/TrackService.asmx" \
  -H "Content-Type: text/xml; charset=utf-8" \
  -H "SOAPAction: http://trackservice.trackroad.com/Dispatch" \
  -d @dispatch-soap.xml

SOAP: Raw request (Envelope + SessionIDHeader)#

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <SessionIDHeader xmlns="http://trackservice.trackroad.com/">
      <SessionID>YOUR_TRACKSERVICEKEY</SessionID>
    </SessionIDHeader>
  </soap:Header>
  <soap:Body>
    <Dispatch xmlns="http://trackservice.trackroad.com/">
      <specification>
        <RoutingService>0</RoutingService>
        <DistanceUnit>0</DistanceUnit>
        <RouteOptimize>0</RouteOptimize>
        <DispatchMode>0</DispatchMode>
        <Vehicles></Vehicles>
        <Locations></Locations>
      </specification>
    </Dispatch>
  </soap:Body>
</soap:Envelope>

JSON: Response example#

{
  "Items": [
    {
      "Vehicle": { "Name": "Truck 1" },
      "Locations": [
        { "Name": "Stop A", "LatLong": { "Latitude": 37.7897, "Longitude": -122.4011 } },
        { "Name": "Stop B", "LatLong": { "Latitude": 37.7810, "Longitude": -122.4110 } }
      ]
    }
  ],
  "Errors": [],
  "Status": 1
}

SOAP: Response example#

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <DispatchResponse xmlns="http://trackservice.trackroad.com/">
      <DispatchResult>
        <Status>1</Status>
        <Errors />

        <Items>
          <VehicleItem>
            <Vehicle>
              <Name>Truck 1</Name>
            </Vehicle>

            <Locations>
              <Location>
                <Name>Stop A</Name>
                <LocationType>0</LocationType>
                <LatLong>
                  <Latitude>37.7897</Latitude>
                  <Longitude>-122.4011</Longitude>
                </LatLong>
              </Location>

              <Location>
                <Name>Stop B</Name>
                <LocationType>0</LocationType>
                <LatLong>
                  <Latitude>37.7810</Latitude>
                  <Longitude>-122.4110</Longitude>
                </LatLong>
              </Location>
            </Locations>
          </VehicleItem>
        </Items>

      </DispatchResult>
    </DispatchResponse>
  </soap:Body>
</soap:Envelope>

Erreurs courantes#

  • REST 401 / Unauthorized : X-API-Key manquant ou invalide.
  • REST 403 / Forbidden : La clé est valide mais bloquée, expirée ou sans crédit.
  • Erreurs de validation : Un arrêt ne contient ni LatLong ni Address, ou les coordonnées sont invalides.
  • Erreurs d’authentification SOAP : SessionIDHeader manquant/invalide ou SessionID vide.

Bonnes pratiques

  • Privilégiez LatLong afin d’éviter les ambiguïtés de géocodage et d’améliorer la cohérence du routage.
  • Utilisez StartLocation et FinishLocation pour un routage basé dépôt et de meilleures ETA.
  • Ajoutez des contraintes de capacité telles que le poids, le volume et les skids pour obtenir une affectation plus réaliste des itinéraires.
  • Utilisez des créneaux horaires lorsque les arrêts doivent être visités dans des plages horaires client ou opérationnelles.
  • Pour SOAP, utilisez le TrackServiceKey dans le SessionIDHeader. L’ancien flux de connexion n’est pas nécessaire.

FAQ#

Que fait l’API Dispatch ?
Dispatch optimise les arrêts sur plusieurs véhicules et renvoie des itinéraires ordonnés par véhicule avec des résultats de temps et de distance.
Comment m’authentifier à Dispatch REST et SOAP ?
REST utilise votre TrackServiceKey dans l’en-tête X-API-Key. SOAP utilise le même TrackServiceKey dans SessionIDHeader comme SessionID.
Ai-je besoin de LatLong ou d’Address pour les arrêts ?
LatLong est à privilégier. Si LatLong n’est pas fourni, Address est requis afin que TrackRoad puisse géocoder l’arrêt.

Prêt à optimiser vos itinéraires ?

Générez votre clé API, puis commencez à intégrer Dispatch pour l’optimisation d’itinéraires multi-véhicules via REST ou SOAP.

Obtenir une clé API WSDL SOAP Swagger UI