API Optimize
Unmap Optimize affecte les envois aux véhicules et ordonne leurs arrêts. Un envoi est un ramassage, une livraison, ou un ramassage associé à sa livraison. Le solveur cherche un plan de faible coût qui respecte vos fenêtres horaires, capacités de charge, pauses et limites de tournée, et renvoie une tournée par véhicule.
Le point de terminaison est en service à POST https://api.unmap.dev/optimize. Il accepte le
format OptimizeToursRequest de l'API Route Optimization de Google Maps Platform et renvoie un
OptimizeToursResponse. Les intégrations REST peuvent utiliser l'hôte et la clé API d'Unmap,
sous réserve des champs pris en charge et des
différences de comportement.
Unmap n'est ni affilié à Google ni approuvé par Google.
Utilisez Optimize pour affecter les envois à un parc de véhicules ou planifier avec des fenêtres
horaires, des capacités ou des pauses. Pour ordonner les arrêts d'un seul véhicule sans ces
contraintes, utilisez /optimized-route.
Pour essayer une requête sans écrire de code, ouvrez le banc d'essai Optimize : collez une requête ou choisissez l'un des exemples commentés, exécutez-la avec votre clé et voyez chaque tournée sur une carte, avec son coût, ses heures et les envois écartés.
Votre première requête
Cet exemple affecte deux colis à une fourgonnette au centre-ville de Calgary. Il utilise des trajets
en ligne droite à 10 mètres par seconde et ne dépend donc pas du réseau routier. Retirez
useGeodesicDistances et geodesicMetersPerSecond pour planifier avec les temps de trajet routiers.
Définissez UNMAP_API_KEY pour curl, ou key pour TypeScript, avec votre
clé API. Fixez les heures globales de début et de fin du modèle
à la journée que vous voulez planifier.
curl -X POST "https://api.unmap.dev/optimize" \
-H "X-API-Key: $UNMAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"useGeodesicDistances": true,
"geodesicMetersPerSecond": 10,
"model": {
"globalStartTime": "2026-10-13T15:00:00Z",
"globalEndTime": "2026-10-14T03:00:00Z",
"shipments": [
{ "label": "parcel-1", "deliveries": [{ "arrivalLocation": { "latitude": 51.0478, "longitude": -114.0593 } }] },
{ "label": "parcel-2", "deliveries": [{ "arrivalLocation": { "latitude": 51.0375, "longitude": -114.0814 } }] }
],
"vehicles": [
{ "label": "van-1", "startLocation": { "latitude": 51.0447, "longitude": -114.0719 }, "costPerKilometer": 1 }
]
}
}'import { optimizeTours } from "@unmap/routing";
const { response, billableShipments } = await optimizeTours(
{
useGeodesicDistances: true,
geodesicMetersPerSecond: 10,
model: {
globalStartTime: "2026-10-13T15:00:00Z",
globalEndTime: "2026-10-14T03:00:00Z",
shipments: [
{ label: "parcel-1", deliveries: [{ arrivalLocation: { latitude: 51.0478, longitude: -114.0593 } }] },
{ label: "parcel-2", deliveries: [{ arrivalLocation: { latitude: 51.0375, longitude: -114.0814 } }] },
],
vehicles: [
{ label: "van-1", startLocation: { latitude: 51.0447, longitude: -114.0719 }, costPerKilometer: 1 },
],
},
},
{ key },
);La réponse ci-dessous provient d'une exécution locale de cette requête avec le même traitement et le même solveur. L'ordre des visites et les heures peuvent varier entre les exécutions. Le solveur utilise un budget de temps pour chercher un plan de moindre coût.
// 200, avec X-Unmap-Billable-Shipments: 2
{
"routes": [
{
"vehicleIndex": 0,
"vehicleLabel": "van-1",
"vehicleStartTime": "2026-10-13T15:00:00Z",
"vehicleEndTime": "2026-10-13T15:04:47Z",
"visits": [
{ "shipmentIndex": 0, "isPickup": false, "visitRequestIndex": 0, "startTime": "2026-10-13T15:01:35Z", "detour": "0s", "shipmentLabel": "parcel-1" },
{ "shipmentIndex": 1, "isPickup": false, "visitRequestIndex": 0, "startTime": "2026-10-13T15:04:47Z", "detour": "183s", "shipmentLabel": "parcel-2" }
],
"transitions": [
{ "travelDuration": "95s", "travelDistanceMeters": 946, "waitDuration": "0s", "breakDuration": "0s", "delayDuration": "0s", "totalDuration": "95s", "startTime": "2026-10-13T15:00:00Z" },
{ "travelDuration": "192s", "travelDistanceMeters": 1923, "waitDuration": "0s", "breakDuration": "0s", "delayDuration": "0s", "totalDuration": "192s", "startTime": "2026-10-13T15:01:35Z" },
{ "travelDuration": "0s", "travelDistanceMeters": 0, "waitDuration": "0s", "breakDuration": "0s", "delayDuration": "0s", "totalDuration": "0s", "startTime": "2026-10-13T15:04:47Z" }
],
"metrics": {
"performedShipmentCount": 2,
"travelDuration": "287s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "287s",
"travelDistanceMeters": 2869
},
"routeCosts": { "model.vehicles.cost_per_kilometer": 2.869 },
"routeTotalCost": 2.869
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 2,
"travelDuration": "287s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "287s",
"travelDistanceMeters": 2869
},
"skippedMandatoryShipmentCount": 0,
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2026-10-13T15:00:00Z",
"latestVehicleEndTime": "2026-10-13T15:04:47Z",
"costs": { "model.vehicles.cost_per_kilometer": 2.869 },
"totalCost": 2.869
}
}routes: une par véhicule, dans l'ordre de la requête.visitsdonne l'ordre à suivre, chaque visite avec l'heure où le service commence.transitionscompte une entrée de plus quevisits: les trajets avant chaque visite, et le trajet jusqu'à l'arrivée du véhicule.- La fourgonnette n'a pas d'
endLocation, donc sa tournée se termine à son dernier arrêt et la dernière transition a un temps et une distance de trajet nuls. DéfinissezendLocationpour la ramener à l'entrepôt. metrics.totalCostinclut les coûts des tournées et les pénalités des envois facultatifs écartés. Ici, il correspond àcostPerKilometermultiplié par la distance parcourue. Les coûts utilisent les unités que vous choisissez et ne représentent pas les frais d'API. Les horodatages de réponse sont en RFC 3339 et en UTC; les durées sont des chaînes en secondes, comme"95s".- Les envois non servis figurent dans
skippedShipments;reasonspeut être absent lorsqu'aucune cause précise n'est identifiée. Un envoi sanspenaltyCostest obligatoire, sauf siignore: true. Si le solveur ne peut pas servir tous les envois obligatoires, la requête échoue avec400FAILED_PRECONDITION.
Points de terminaison
POST /optimize
POST /v1/projects/{project}:optimizeTours
POST /v1/projects/{project}/locations/{location}:optimizeTours
POST /projects/{project}:optimizeTours
POST /projects/{project}/locations/{location}:optimizeTours
Les cinq chemins acceptent la même requête et renvoient le même format de réponse. Utilisez
/optimize pour les nouvelles intégrations. Les quatre autres permettent de conserver les chemins
des intégrations REST de Google Route Optimization. {project} et {location} sont ignorés, tout
comme parent dans le corps, qui produit un avertissement. La clé API identifie le compte qui
exécute et paie la requête. Seule la méthode :optimizeTours
existe; tout autre suffixe de méthode est un 404 NOT_FOUND.
Envoyez la clé dans Authorization: Bearer <key>, X-API-Key, X-Goog-Api-Key ou ?key=. Gardez la clé hors
de l'URL pour les appels côté serveur. Voir Authentification.
Le corps est en JSON, d'au plus 4 Mio (au-delà, c'est un 413). Les noms de champs peuvent être en
camelCase ou en snake_case; la réponse est en camelCase. Chaque réponse qu'écrit le gestionnaire
d'Optimize, une résolution ou l'une de ses erreurs, porte Cache-Control: no-store; un refus de la
vérification de clé placée devant lui, comme un 401, porte plutôt les en-têtes habituels de la
passerelle.
Temps de trajet
Une requête tire ses temps de trajet de l'une de trois sources :
- Le réseau routier (par défaut). Les temps et distances de conduite viennent du même graphe
routier canadien que les Itinéraires, en circulation fluide.
considerRoadTrafficest accepté et ignoré, avec un avertissement si sa valeur esttrue. Les arrêts doivent être proches de routes au Canada, et chaque véhicule doit pouvoir atteindre ses arrêts. Les trajets locaux sur une île peuvent fonctionner même sans liaison routière avec le continent. Un envoi obligatoire injoignable fait échouer la requête avec400FAILED_PRECONDITION; un envoi facultatif injoignable est écarté. Les trajets routiers sont limités à 200 lieux distincts par requête, ou à la limite inférieure du forfait. Pour les requêtes plus grandes, utilisez les trajets en ligne droite ou vos propres matrices. Deux arrêts à plus de 1 000 km l'un de l'autre à vol d'oiseau sont traités comme injoignables entre eux, et une requête aussi étendue peut être refusée comme trop grosse pour une seule résolution; découpez-la par région. - La ligne droite.
useGeodesicDistances: trueavecgeodesicMetersPerSecond(au moins1) : la distance orthodromique à vitesse fixe. Fonctionne partout, y compris hors du Canada. - Vos propres matrices.
model.durationDistanceMatricesavecdurationDistanceMatrixSrcTagsetdurationDistanceMatrixDstTags. Chaque arrêt et chaque véhicule est alors placé partagsplutôt que par coordonnées, et une matrice parvehicleStartTagdonne des trajets différents à des véhicules différents.
Les véhicules conduisent (travelMode DRIVING). Unmap ajoute un champ au véhicule,
unmapProfile, qui nomme le profil routier; auto est la seule valeur pour l'instant.
Avec populatePolylines: true, Unmap tente d'ajouter routePolyline.points à chaque tournée utilisée.
Il s'agit d'une polyligne encodée à la précision 5, tracée sur les routes canadiennes. Si le tracé
échoue ou manque de temps, la tournée reste valide et revient sans polyligne, avec l'avertissement
ROUTE_POLYLINE_UNAVAILABLE. Pour les requêtes géodésiques, une polyligne routière ne modifie pas
les temps ni les distances en ligne droite utilisés pour planifier. Les requêtes avec vos propres
matrices n'ont pas de coordonnées et ne renvoient pas de polylignes.
Ce qu'il planifie
Pris en charge aujourd'hui :
- Des envois avec un ramassage, une livraison, ou les deux (une paire est servie par un seul
véhicule, ramassage d'abord), chaque visite avec un lieu, une durée de service (
duration) et des fenêtres horaires strictes (timeWindows). - Les charges :
loadDemandssur l'envoi face auxloadLimits(maxLoad) du véhicule, par nom de type de charge. - Les envois facultatifs :
penaltyCostajoute un coût lorsqu'un envoi est écarté. Le solveur peut l'écarter pour réduire le coût total, respecter les contraintes, ou faute de trouver un plan qui l'inclut dans son budget de temps.ignore: trueexclut un envoi de la planification, sans pénalité. allowedVehicleIndices, pour limiter les véhicules qui peuvent servir un envoi.- Des véhicules avec un lieu de départ et d'arrivée (ou des extrémités ouvertes), une fenêtre de
départ et une fenêtre d'arrivée,
fixedCost,costPerHour,costPerTraveledHouretcostPerKilometer. - Les limites strictes
routeDurationLimit,travelDurationLimitetrouteDistanceLimit. - Des fenêtres horaires souples sur les visites et sur le départ et l'arrivée d'un véhicule
(
softStartTime,softEndTimeet leurs coûts horaires), des limites souples de durée de tournée et de temps de conduite, une limite souple de distance et une charge maximale souple, chacune rapportée sous sa propre clé dansmetrics.costs. - Les pauses des chauffeurs :
breakRule.breakRequests, chacune avec un début au plus tôt, un début au plus tard et une durée minimale. - Des étiquettes sur la requête, les envois, les visites et les véhicules, renvoyées dans la réponse.
searchMode:RETURN_FASTcesse d'améliorer le plan peu après une première solution,CONSUME_ALL_AVAILABLE_TIMEutilise tout letimeout.
Les champs énumérés acceptent le nom ou l'entier, comme les clients de Google les envoient
("travelMode": 1).
Pas encore : les limites de durée souples quadratiques, plus d'une option de ramassage ou de
livraison par envoi, plus d'une fenêtre de départ ou d'arrivée par véhicule, les types d'envois et
les règles de précédence, les solutions injectées et la marche. Chacun est refusé avec
FIELD_NOT_SUPPORTED_YET ou VALUE_NOT_SUPPORTED_YET plutôt qu'abandonné en silence, parce qu'un
plan qui ignorerait une de vos contraintes serait faux sans vous le dire. Comme les limites de durée
souples quadratiques, routeDistanceLimit.costPerKilometerBelowSoftMax est refusé, mais pour de bon
et avec INVALID_VALUE : GMPRO ne le prend pas en charge non plus. Un identifiant de lieu Google
est refusé aussi : géocodez l'adresse avec /geocode/search et envoyez
des coordonnées. Champs pris en charge par Optimize donne chaque champ et
son statut.
Valider sans résoudre
Envoyez "solvingMode": "VALIDATE_ONLY" pour vérifier une requête. Rien n'est calculé ni résolu, et
ce n'est jamais facturé. Une requête valide répond 200 avec {}. Une requête invalide répond 200
avec chaque problème trouvé, jusqu'à maxValidationErrors (100 par défaut) :
// 200
{
"validationErrors": [
{
"code": 11,
"displayName": "MISSING_REQUIRED_FIELD",
"fields": [{ "name": "geodesicMetersPerSecond" }],
"errorMessage": "geodesicMetersPerSecond is required when useGeodesicDistances is true."
}
]
}Dans le mode de résolution par défaut, ces problèmes renvoient 400 INVALID_ARGUMENT, avec une
violation de champ par erreur. VALIDATE_ONLY vérifie les champs et les contraintes de la requête;
il ne vérifie ni l'accessibilité routière ni la possibilité de servir tous les envois ensemble.
L'authentification, l'analyse du corps, sa taille et les limites du nombre d'envois ou de véhicules
s'appliquent toujours et peuvent produire une réponse autre qu'un 200 avant la validation.
Limites par forfait
| Forfait | Envois | Véhicules | Lieux | Résolution la plus longue | Résolutions simultanées |
|---|---|---|---|---|---|
| Hobby | 25 | 5 | 100 | 10 s | 1 |
| Indie | 500 | 50 | 500 | 30 s | 2 |
| Growth | 2 000 | 200 | 1 000 | 60 s | 2 |
- Envois compte chaque entrée de
model.shipments, y compris les envois ignorés. Lieux compte les endroits distincts entre lesquels il faut se déplacer, une fois les doublons fusionnés. Une requête qui dépasse un compte est un400INVALID_ARGUMENTqui nomme la limite; découpez-la en requêtes plus petites. - Sur tous les forfaits, une requête peut utiliser au plus 16 noms de types de charge distincts,
toutes ses clés
loadDemandsetloadLimitsconfondues. Un de plus est un400INVALID_ARGUMENT(OUT_OF_RANGE). - Le nombre total de cellules des matrices est limité au carré de la limite de lieux du forfait : 10 000 pour Hobby, 250 000 pour Indie et 1 000 000 pour Growth. Les matrices de plusieurs véhicules partagent cette limite. La limite de 4 Mio du corps s'applique aussi aux matrices fournies.
- Résolution la plus longue plafonne
timeout. Un délai plus long est ramené à la limite, avec un en-têteWarning: 299 - "timeout clamped to 30s for this plan"et un avertissementTIMEOUT_CLAMPED. Sanstimeout, la résolution reçoitmin(plafond, max(2, ceil(visites / 25)))secondes, où les visites sont les ramassages et les livraisons de la requête. - Résolutions simultanées vaut par compte, pour toutes ses clés. Une de plus est un
429RESOURCE_EXHAUSTEDavecRetry-After. - Les trajets routiers et la réponse du solveur partagent un budget de 140 secondes. Une étape qui
dépasse le temps qui lui est alloué renvoie
504DEADLINE_EXCEEDED. Le tracé facultatif des polylignes dispose de 30 secondes supplémentaires, pour un budget total maximal de 170 secondes. Une polyligne manquante ne fait jamais échouer la résolution.
Ce sont des valeurs de départ, fixées avant que le service ait été mesuré sous la charge de production, et elles peuvent changer.
Tarification
Un envoi effectué compte pour un appel des appels inclus dans votre forfait, la même réserve que
celle des tuiles, du géocodage et des itinéraires. Un envoi effectué est un envoi visité sur une
tournée lors d'une résolution réussie (200). Au-delà des appels inclus, Indie et Growth facturent
le dépassement à leur prix habituel par appel, et Hobby s'arrête. Voir
Forfaits et limites.
Gratuit :
VALIDATE_ONLY, quoi qu'il trouve.- Toute réponse autre qu'un
200: erreurs de validation, limites, délais dépassés, pannes. - Chaque envoi de
skippedShipments, ignoré ou non servi. - Un envoi résolu de nouveau dans les 24 heures qui suivent la résolution qui l'a d'abord facturé.
Contrairement aux autres points de terminaison, Optimize facture une requête provenant d'une origine
de développement (localhost, *.pages.dev, *.workers.dev) comme n'importe quelle autre. Grâce à
la nouvelle résolution gratuite ci-dessus, itérer sur une même requête reste peu coûteux.
Nouvelles résolutions. Les répartiteurs replanifient quand une fenêtre bouge ou qu'un chauffeur
se déclare malade, et ce sont toujours les mêmes livraisons. Un envoi qui porte un label est donc
reconnu par son étiquette et les lieux de ses visites, et un envoi sans étiquette par tout son
contenu. Dans les 24 heures qui suivent la résolution qui l'a d'abord facturé, le même envoi est
gratuit; une nouvelle résolution ne prolonge pas cette période. Une étiquette recyclée sur d'autres
arrêts est un nouvel envoi. Quand la requête fournit ses propres matrices, l'identité couvre aussi
les matrices et les startTags et endTags de chaque véhicule : de nouvelles données de trajet, ou
un véhicule passé à une autre matrice, sont facturées de nouveau.
L'en-tête X-Unmap-Billable-Shipments indique le nombre d'envois facturables, y compris 0.
Avant les trajets routiers ou la résolution, Unmap vérifie si le quota restant ou le plafond de
dépenses couvre tous les nouveaux envois non ignorés de la requête. Les envois facultatifs comptent
dans cette estimation, même si le solveur pourrait les écarter. Si l'estimation dépasse les appels
disponibles, la requête renvoie 429 RESOURCE_EXHAUSTED avec le code de premier niveau
quota_exceeded ou spend_cap.
La gratuité des nouvelles résolutions s'applique à toutes les clés d'un compte. Les envois en double
dans une requête comptent comme des unités distinctes. Si la vérification de cette gratuité est
indisponible après une résolution réussie, tous les envois effectués sont facturables. Consultez
X-Unmap-Billable-Shipments pour connaître le nombre réel.
En-têtes de réponse
| En-tête | Quand | Quoi |
|---|---|---|
X-Unmap-Billable-Shipments | chaque 200 | Les envois facturés par cette requête. |
X-Unmap-Optimize-Warnings | quand il y a un avertissement | Un tableau JSON de { code, field?, path?, count, message }, en ASCII seulement, d'au plus 4 Ko. |
Warning | timeout a été ramené à la limite | 299 - "timeout clamped to <n>s for this plan". |
Retry-After | 429 et 503 qu'on peut réessayer | Les secondes à attendre. |
Les avertissements ne changent jamais le corps de la réponse, qui garde la forme qu'attend un client
Google. Les codes sont FIELD_IGNORED (un champ accepté qu'Unmap ne peut pas respecter),
TIMEOUT_CLAMPED, ROAD_TRAVEL_DEGRADED et ROAD_TRAVEL_UNCONFIRMED (un budget de calcul
d'itinéraires, et non le réseau routier, a décidé que certaines cellules étaient injoignables; un
arrêt laissé de côté pourrait donc être servi, découpez la requête), ROUTE_POLYLINE_UNAVAILABLE et
WARNINGS_TRUNCATED. Un navigateur peut lire les quatre en-têtes : la passerelle les expose par
CORS.
Erreurs
Sur ces chemins, les erreurs ont la forme de celles de Google, avec la chaîne code de la passerelle
à côté, pour qu'un client Google comme un client Unmap puisse les lire. Le statut est dans
error.status (INVALID_ARGUMENT, FAILED_PRECONDITION, RESOURCE_EXHAUSTED, etc.), et les
erreurs de validation donnent une entrée fieldViolations par problème, avec le chemin exact du
champ. Là où Google peut répondre 200 en laissant de côté un envoi obligatoire, Unmap refuse avec
un 400 FAILED_PRECONDITION.
Erreurs donne le corps complet, chaque statut, code de validation, avertissement et raison d'exclusion, avec la cause et le correctif.
Depuis la bibliothèque cliente
optimizeTours() dans @unmap/routing envoie la clé dans X-API-Key, jamais dans l'URL, et
renvoie la réponse d'Unmap au format Google, plus les informations des en-têtes. Elle est offerte dans
@unmap/routing et @unmap/sdk depuis la 0.21.0.
import { optimizeTours, UnmapOptimizeError } from "@unmap/routing";
try {
const { response, warnings, billableShipments, timeoutClamped } = await optimizeTours(
{
timeout: "10s",
model: {
shipments: [{ label: "order-1", deliveries: [{ arrivalLocation: { latitude: 51.05, longitude: -114.07 } }] }],
vehicles: [{ label: "van-1", startLocation: { latitude: 51.04, longitude: -114.06 } }],
},
},
{ key },
);
console.log(response.routes, warnings, billableShipments, timeoutClamped);
} catch (e) {
if (e instanceof UnmapOptimizeError) console.error(e.status, e.googleStatus, e.details);
}- Le même appel est
router.optimizeTours(request)sur unRouter, etunmap.router.optimizeTours(request)depuis@unmap/sdk. warningsest l'en-têteX-Unmap-Optimize-Warningsdécodé,billableShipmentsl'en-têteX-Unmap-Billable-Shipmentsdécodé, ettimeoutClampedavecclampedTimeoutSecondsdisent si votretimeouta été raccourci.- Un échec lève
UnmapOptimizeError:statusest le statut HTTP,codele code de la passerelle,googleStatusle nom de statut de Google etdetailsleserror.detailsde Google. Les429,502,503et les pannes de transport sont réessayés par défaut.
Champs pris en charge
Chaque champ du format OptimizeToursRequest qu'utilise l'API Route Optimization de Google Maps Platform, et ce qu'en fait Unmap Optimize. Les noms et l'imbrication des champs suivent la référence REST publique de Google; les descriptions sont celles d'Unmap. Unmap n'est ni affilié à Google ni approuvé par Google.
Cette section est générée à partir de la table de champs du validateur; les vérifications du dépôt la gardent à jour. Elle compte 191 lignes : 126 pris en charge, 16 ignoré, 5 refusé, 30 prévu (V2), 14 prévu (V3).
Comment lire les tableaux
| Statut | Ce que fait Unmap |
|---|---|
| pris en charge | Respecte le champ. |
| ignoré | Accepte le champ sans rien en faire. Une valeur autre que celle par défaut ajoute une entrée FIELD_IGNORED à l'en-tête de réponse X-Unmap-Optimize-Warnings (une par champ, avec un compte). Jamais une erreur. |
| refusé | Refuse le champ avec l'erreur indiquée. Unmap ne prévoit pas de le prendre en charge. |
| prévu (V2), prévu (V3) | Refuse le champ avec FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut, parce qu'abandonner une contrainte en silence renverrait un plan que vous n'avez pas demandé. Envoyé à sa valeur par défaut (false, 0, "0s", [], {}, une énumération _UNSPECIFIED, ou la valeur indiquée), il est accepté. |
Un chemin comme model.shipments[].deliveries[].timeWindows[].startTime désigne un champ : nom[] est un élément d'un tableau, et nom{} est une valeur d'un dictionnaire dont les clés sont les vôtres (des noms de types de charge, comme loadLimits{}). Les champs situés sous un champ refusé ou ignoré ne sont pas listés, parce que rien en dessous n'est lu.
Règles qui valent pour tout le corps :
- Les noms de champs peuvent être en camelCase ou en snake_case. Envoyer les deux graphies d'un même champ dans un même objet est une erreur
CONFLICTING_FIELD_NAMES. Les clés de dictionnaire et les valeurs de chaîne ne sont jamais réécrites. - Un champ absent de ces tables est une erreur
UNKNOWN_FIELD, pour qu'une faute de frappe n'abandonne jamais une contrainte en silence. - Les durées sont des chaînes comme
"300s"ou"1.5s". Les horodatages sont des chaînes RFC 3339 ou{ "seconds": ..., "nanos": ... }. Les entiers de 64 bits peuvent être des chaînes décimales ou des entiers JSON jusqu'à 2^53 - 1. - La validation s'arrête après
maxValidationErrorserreurs (100 par défaut, au plus 10 000). - Une requête peut utiliser au plus 16 noms de types de charge distincts, comptés sur toutes les clés
loadDemandsetloadLimitsdu modèle. Le premier nom au-delà est une erreurOUT_OF_RANGE. - Un identifiant de lieu Google (
placeId) estPLACE_ID_NOT_SUPPORTED; géocodez l'adresse avec/geocode/searchet envoyez des coordonnées. Aucun champ ne prend d'URI : les méthodes par lots qui lisent les URI Cloud Storagegs://ne sont pas offertes (elles répondent par un404), etGCS_URI_NOT_SUPPORTEDleur est réservé; rien ne le renvoie aujourd'hui.
Chaque code d'erreur est expliqué dans Erreurs.
La prise en charge des champs décrit la validation et le comportement offert. Elle ne garantit pas qu'une requête a une solution réalisable. populatePolylines tente un tracé routier pour les tournées avec coordonnées; les requêtes avec matrices fournies ne renvoient pas de polylignes. Voir les temps de trajet et les limites par forfait.
Les messages d'erreur et d'avertissement sont cités tels que l'API les renvoie, en anglais.
Champs de la requête
| Champ | Statut | Comportement |
|---|---|---|
parent | ignoré | Le projet Google Cloud auquel la requête appartient. Type string. Avertissement FIELD_IGNORED quand il est fixé : « parent is ignored: Unmap has no projects, so the request runs under the API key's account. » |
timeout | pris en charge | Temps que le solveur peut consacrer à la résolution; plafonné par le forfait, avec une valeur par défaut en son absence. Type duration. |
solvingMode | pris en charge | Résoudre le modèle, ou seulement le valider. Type enum. Valeur par défaut DEFAULT_SOLVE. Valeurs : DEFAULT_SOLVE, VALIDATE_ONLY prises en charge; DETECT_SOME_INFEASIBLE_SHIPMENTS refusée, prévue (V2); TRANSFORM_AND_RETURN_REQUEST refusée, prévue (V3). |
searchMode | pris en charge | Échange la qualité de la solution contre un temps de réponse plus court : RETURN_FAST cesse d'améliorer peu après la première solution, CONSUME_ALL_AVAILABLE_TIME (le comportement par défaut) cherche jusqu'à la fin du délai. Type enum. Valeurs : SEARCH_MODE_UNSPECIFIED, RETURN_FAST, CONSUME_ALL_AVAILABLE_TIME prises en charge. |
injectedFirstSolutionRoutes | prévu (V2) | Tournées d'où part le solveur au lieu de construire sa propre première solution. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « injectedFirstSolutionRoutes is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
injectedSolutionConstraint | prévu (V2) | Une solution précédente dont les visites sont figées ou contraintes, pour une réoptimisation. Type message. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « injectedSolutionConstraint is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
refreshDetailsRoutes | prévu (V2) | Tournées existantes dont les horaires et les mesures sont recalculés sans nouvelle résolution. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « refreshDetailsRoutes is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
interpretInjectedSolutionsUsingLabels | prévu (V2) | Associe les tournées injectées au modèle par étiquette plutôt que par indice. Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « interpretInjectedSolutionsUsingLabels is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
considerRoadTraffic | ignoré | Demande des temps de trajet qui tiennent compte de la circulation. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « considerRoadTraffic is ignored: Unmap travel times do not use live or historical traffic yet. » Ignoré plutôt que refusé : le plan reste valable avec des temps en circulation fluide, et la V3 ajoute des vitesses historiques. |
populatePolylines | pris en charge | Ajoute une polyligne encodée pour chaque tournée utilisée, dans routes[].routePolyline. Type boolean. Valeur par défaut false. |
populateTransitionPolylines | ignoré | Demande une polyligne encodée par transition entre deux arrêts. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « populateTransitionPolylines is ignored: Unmap returns one polyline per route, as routes[].routePolyline when populatePolylines is true. » Ignoré plutôt que refusé : la polyligne de la tournée porte la même géométrie, donc un client perd du détail, pas de l'exactitude. |
allowLargeDeadlineDespiteInterruptionRisk | ignoré | Permet un long délai sur l'infrastructure de Google, au risque d'une interruption. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « allowLargeDeadlineDespiteInterruptionRisk is ignored: Unmap caps the timeout per plan and clamps anything longer. » |
useGeodesicDistances | pris en charge | Utilise des distances à vol d'oiseau et une vitesse fixe au lieu des temps de trajet sur le réseau routier. Type boolean. Valeur par défaut false. |
label | pris en charge | Étiquette de la requête fournie par l'appelant, renvoyée comme requestLabel dans la réponse. Type string. |
geodesicMetersPerSecond | pris en charge | Vitesse utilisée avec useGeodesicDistances, en mètres par seconde; au moins 1. Type number. Requis quand useGeodesicDistances vaut true : erreur MISSING_REQUIRED_FIELD. |
maxValidationErrors | pris en charge | Nombre maximal d'erreurs de validation à renvoyer; 100 par défaut, plafonné à 10 000. Type int32. Valeur par défaut 100. |
Champs du modèle
| Champ | Statut | Comportement |
|---|---|---|
model | pris en charge | Les envois, les véhicules et les contraintes globales à planifier. Type object. |
model.objectives | prévu (V3) | Objectifs d'optimisation de rechange qui remplacent le modèle de coûts (expérimental dans GMPRO). Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.objectives is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.globalStartTime | pris en charge | Début de l'horizon de planification; rien ne se passe avant. Type timestamp. Valeur par défaut 1970-01-01T00:00:00Z. |
model.globalEndTime | pris en charge | Fin de l'horizon de planification; rien ne se passe après. Au plus 999 999 999 secondes (environ 31 ans) après globalStartTime. Type timestamp. Valeur par défaut 1971-01-01T00:00:00Z. |
model.globalDurationCostPerHour | prévu (V2) | Coût horaire de toute la durée du plan, du départ le plus hâtif à l'arrivée la plus tardive. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.globalDurationCostPerHour is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.durationDistanceMatrices | pris en charge | Durées et distances de trajet fournies par l'appelant, utilisées au lieu du réseau routier ou du vol d'oiseau. Avec elles, chaque arrêt est placé par balises : les visites et les véhicules ne doivent pas porter de coordonnées, et useGeodesicDistances ne doit pas valoir true. Type object[]. |
model.durationDistanceMatrices[].rows | pris en charge | Une ligne par balise d'origine, dans l'ordre de durationDistanceMatrixSrcTags. Type object[]. |
model.durationDistanceMatrices[].rows[].durations | pris en charge | Durées de trajet de l'origine de cette ligne vers chaque balise de destination. Type duration[]. |
model.durationDistanceMatrices[].rows[].meters | pris en charge | Distances de trajet en mètres de l'origine de cette ligne vers chaque balise de destination. Type number[]. |
model.durationDistanceMatrices[].vehicleStartTag | pris en charge | La balise de départ de véhicule qui sélectionne cette matrice; les startTags de chaque véhicule doivent en désigner exactement une. Vide, la matrice s'applique à tous les véhicules, ce qui n'est permis que s'il n'y a qu'une matrice. Type string. |
model.durationDistanceMatrixSrcTags | pris en charge | Balises qui nomment les lignes des matrices; uniques, non vides, et requises exactement quand durationDistanceMatrices est présent. Type string[]. |
model.durationDistanceMatrixDstTags | pris en charge | Balises qui nomment les colonnes des matrices; uniques, non vides, et requises exactement quand durationDistanceMatrices est présent. Type string[]. |
model.transitionAttributes | prévu (V3) | Coûts, délais et limites supplémentaires sur les trajets entre arrêts balisés. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.transitionAttributes is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipmentTypeIncompatibilities | prévu (V2) | Types d'envois qui ne doivent pas partager un véhicule. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipmentTypeIncompatibilities is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipmentTypeRequirements | prévu (V2) | Types d'envois qui exigent un autre type dans le même véhicule. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipmentTypeRequirements is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.precedenceRules | prévu (V3) | Règles d'ordre entre les visites d'envois différents. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.precedenceRules is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.maxActiveVehicles | prévu (V2) | Nombre maximal de véhicules que le plan peut utiliser. Type int32. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.maxActiveVehicles is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
Champs des envois
| Champ | Statut | Comportement |
|---|---|---|
model.shipments | pris en charge | Tout ce qu'il faut ramasser ou livrer. Type object[]. |
model.shipments[].displayName | pris en charge | Nom destiné aux personnes; il n'influe pas sur la résolution. Type string. |
model.shipments[].pickups | pris en charge | Le ramassage de l'envoi; la V1 en accepte au plus un. Type object[]. Plus de 1 : erreur VALUE_NOT_SUPPORTED_YET, « A shipment with more than one pickup alternative is not supported yet (planned for V2). » |
model.shipments[].pickups[].arrivalLocation | pris en charge | Coordonnées de l'arrêt de ramassage, en degrés WGS84; envoyez ce champ ou arrivalWaypoint, et aucun des deux quand le modèle a des durationDistanceMatrices. Type object. |
model.shipments[].pickups[].arrivalLocation.latitude | pris en charge | Latitude en degrés, de -90 à 90. Type number. Valeur par défaut 0. |
model.shipments[].pickups[].arrivalLocation.longitude | pris en charge | Longitude en degrés, de -180 à 180. Type number. Valeur par défaut 0. |
model.shipments[].pickups[].arrivalWaypoint | pris en charge | L'arrêt de ramassage sous forme de point de passage; envoyez ce champ ou arrivalLocation, pas les deux. Type object. |
model.shipments[].pickups[].arrivalWaypoint.location | pris en charge | La position du point de passage; requise, parce que les identifiants de lieu ne sont pas pris en charge. Type object. |
model.shipments[].pickups[].arrivalWaypoint.location.latLng | pris en charge | Coordonnées du point de passage, en degrés WGS84. Type object. |
model.shipments[].pickups[].arrivalWaypoint.location.latLng.latitude | pris en charge | Latitude en degrés, de -90 à 90. Type number. Valeur par défaut 0. |
model.shipments[].pickups[].arrivalWaypoint.location.latLng.longitude | pris en charge | Longitude en degrés, de -180 à 180. Type number. Valeur par défaut 0. |
model.shipments[].pickups[].arrivalWaypoint.location.heading | ignoré | Cap du déplacement au point de passage, en degrés. Type int32. Avertissement FIELD_IGNORED quand il est fixé : « location.heading is ignored: Unmap snaps a location to the nearest road whatever the direction of travel. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google. |
model.shipments[].pickups[].arrivalWaypoint.placeId | refusé | Un identifiant Google Places pour le point de passage. Type string. Erreur PLACE_ID_NOT_SUPPORTED quand il est fixé : « Google place IDs are not supported: Unmap cannot resolve them. » Conseil : Géocodez l'adresse avec /geocode/search d'Unmap et envoyez ses coordonnées dans arrivalWaypoint.location.latLng ou arrivalLocation. Refusé : un identifiant de lieu renvoie à la base de données de Google, et deviner un emplacement pour lui mènerait au mauvais endroit. |
model.shipments[].pickups[].arrivalWaypoint.sideOfRoad | ignoré | Demande que le véhicule s'arrête du côté de la rue où se trouve le point de passage. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « sideOfRoad is ignored: Unmap travel times do not model which side of the road a stop is on. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google. |
model.shipments[].pickups[].arrivalWaypoint.vehicleStopover | ignoré | Désigne le point de passage comme un endroit où le véhicule s'arrête pour ramasser ou déposer. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « vehicleStopover is ignored: Unmap snaps every stop to the nearest road a vehicle can use. » Ignoré plutôt que refusé : chaque arrêt Unmap est déjà traité comme un arrêt sur une route carrossable. |
model.shipments[].pickups[].departureLocation | prévu (V2) | L'endroit d'où le véhicule repart après le ramassage, quand il diffère de celui où il est arrivé. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].departureLocation is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].pickups[].departureWaypoint | prévu (V2) | Le point de passage d'où le véhicule repart après le ramassage, quand il diffère de celui où il est arrivé. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].departureWaypoint is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].pickups[].tags | pris en charge | Balises qui placent le ramassage dans les lignes et les colonnes de durationDistanceMatrices; uniques et non vides, et requises quand le modèle a des matrices. Type string[]. |
model.shipments[].pickups[].timeWindows | pris en charge | Fenêtres horaires strictes pour le début du ramassage; triées, sans chevauchement et non contiguës. Type object[]. |
model.shipments[].pickups[].timeWindows[].startTime | pris en charge | Heure permise la plus hâtive; model.globalStartTime par défaut. Type timestamp. |
model.shipments[].pickups[].timeWindows[].endTime | pris en charge | Heure permise la plus tardive; model.globalEndTime par défaut. Type timestamp. |
model.shipments[].pickups[].timeWindows[].softStartTime | pris en charge | Début souple : un événement qui a lieu avant est permis et coûte costPerHourBeforeSoftStartTime par heure d'avance. Seulement sur une liste d'une seule fenêtre, à startTime ou après, dans la fenêtre globale. Type timestamp. |
model.shipments[].pickups[].timeWindows[].softEndTime | pris en charge | Fin souple : un événement qui a lieu après est permis et coûte costPerHourAfterSoftEndTime par heure de retard. Seulement sur une liste d'une seule fenêtre, à endTime ou avant, dans la fenêtre globale. Type timestamp. |
model.shipments[].pickups[].timeWindows[].costPerHourBeforeSoftStartTime | pris en charge | Coût horaire d'un événement avant softStartTime; exige softStartTime. Type number. |
model.shipments[].pickups[].timeWindows[].costPerHourAfterSoftEndTime | pris en charge | Coût horaire d'un événement après softEndTime; exige softEndTime. Type number. |
model.shipments[].pickups[].duration | pris en charge | Temps passé à l'arrêt pour effectuer le ramassage. Type duration. Valeur par défaut 0s. |
model.shipments[].pickups[].cost | prévu (V2) | Coût supplémentaire pour choisir cette option de ramassage plutôt qu'une autre. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].cost is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].pickups[].loadDemands | prévu (V2) | Variations de charge qui s'appliquent seulement quand cette option de ramassage est choisie. Type map<string, object>. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].loadDemands is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].pickups[].visitTypes | prévu (V2) | Types qui ajoutent au ramassage une durée supplémentaire propre au véhicule. Type string[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].visitTypes is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].pickups[].label | pris en charge | Étiquette du ramassage fournie par l'appelant, renvoyée comme visitLabel dans la réponse. Type string. |
model.shipments[].pickups[].avoidUTurns | prévu (V3) | Demande des tournées qui évitent les demi-tours à l'arrêt de ramassage (expérimental dans GMPRO). Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].avoidUTurns is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].deliveries | pris en charge | La livraison de l'envoi; la V1 en accepte au plus une. Type object[]. Plus de 1 : erreur VALUE_NOT_SUPPORTED_YET, « A shipment with more than one delivery alternative is not supported yet (planned for V2). » |
model.shipments[].deliveries[].arrivalLocation | pris en charge | Coordonnées de l'arrêt de livraison, en degrés WGS84; envoyez ce champ ou arrivalWaypoint, et aucun des deux quand le modèle a des durationDistanceMatrices. Type object. |
model.shipments[].deliveries[].arrivalLocation.latitude | pris en charge | Latitude en degrés, de -90 à 90. Type number. Valeur par défaut 0. |
model.shipments[].deliveries[].arrivalLocation.longitude | pris en charge | Longitude en degrés, de -180 à 180. Type number. Valeur par défaut 0. |
model.shipments[].deliveries[].arrivalWaypoint | pris en charge | L'arrêt de livraison sous forme de point de passage; envoyez ce champ ou arrivalLocation, pas les deux. Type object. |
model.shipments[].deliveries[].arrivalWaypoint.location | pris en charge | La position du point de passage; requise, parce que les identifiants de lieu ne sont pas pris en charge. Type object. |
model.shipments[].deliveries[].arrivalWaypoint.location.latLng | pris en charge | Coordonnées du point de passage, en degrés WGS84. Type object. |
model.shipments[].deliveries[].arrivalWaypoint.location.latLng.latitude | pris en charge | Latitude en degrés, de -90 à 90. Type number. Valeur par défaut 0. |
model.shipments[].deliveries[].arrivalWaypoint.location.latLng.longitude | pris en charge | Longitude en degrés, de -180 à 180. Type number. Valeur par défaut 0. |
model.shipments[].deliveries[].arrivalWaypoint.location.heading | ignoré | Cap du déplacement au point de passage, en degrés. Type int32. Avertissement FIELD_IGNORED quand il est fixé : « location.heading is ignored: Unmap snaps a location to the nearest road whatever the direction of travel. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google. |
model.shipments[].deliveries[].arrivalWaypoint.placeId | refusé | Un identifiant Google Places pour le point de passage. Type string. Erreur PLACE_ID_NOT_SUPPORTED quand il est fixé : « Google place IDs are not supported: Unmap cannot resolve them. » Conseil : Géocodez l'adresse avec /geocode/search d'Unmap et envoyez ses coordonnées dans arrivalWaypoint.location.latLng ou arrivalLocation. Refusé : un identifiant de lieu renvoie à la base de données de Google, et deviner un emplacement pour lui mènerait au mauvais endroit. |
model.shipments[].deliveries[].arrivalWaypoint.sideOfRoad | ignoré | Demande que le véhicule s'arrête du côté de la rue où se trouve le point de passage. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « sideOfRoad is ignored: Unmap travel times do not model which side of the road a stop is on. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google. |
model.shipments[].deliveries[].arrivalWaypoint.vehicleStopover | ignoré | Désigne le point de passage comme un endroit où le véhicule s'arrête pour ramasser ou déposer. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « vehicleStopover is ignored: Unmap snaps every stop to the nearest road a vehicle can use. » Ignoré plutôt que refusé : chaque arrêt Unmap est déjà traité comme un arrêt sur une route carrossable. |
model.shipments[].deliveries[].departureLocation | prévu (V2) | L'endroit d'où le véhicule repart après la livraison, quand il diffère de celui où il est arrivé. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].departureLocation is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].deliveries[].departureWaypoint | prévu (V2) | Le point de passage d'où le véhicule repart après la livraison, quand il diffère de celui où il est arrivé. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].departureWaypoint is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].deliveries[].tags | pris en charge | Balises qui placent la livraison dans les lignes et les colonnes de durationDistanceMatrices; uniques et non vides, et requises quand le modèle a des matrices. Type string[]. |
model.shipments[].deliveries[].timeWindows | pris en charge | Fenêtres horaires strictes pour le début de la livraison; triées, sans chevauchement et non contiguës. Type object[]. |
model.shipments[].deliveries[].timeWindows[].startTime | pris en charge | Heure permise la plus hâtive; model.globalStartTime par défaut. Type timestamp. |
model.shipments[].deliveries[].timeWindows[].endTime | pris en charge | Heure permise la plus tardive; model.globalEndTime par défaut. Type timestamp. |
model.shipments[].deliveries[].timeWindows[].softStartTime | pris en charge | Début souple : un événement qui a lieu avant est permis et coûte costPerHourBeforeSoftStartTime par heure d'avance. Seulement sur une liste d'une seule fenêtre, à startTime ou après, dans la fenêtre globale. Type timestamp. |
model.shipments[].deliveries[].timeWindows[].softEndTime | pris en charge | Fin souple : un événement qui a lieu après est permis et coûte costPerHourAfterSoftEndTime par heure de retard. Seulement sur une liste d'une seule fenêtre, à endTime ou avant, dans la fenêtre globale. Type timestamp. |
model.shipments[].deliveries[].timeWindows[].costPerHourBeforeSoftStartTime | pris en charge | Coût horaire d'un événement avant softStartTime; exige softStartTime. Type number. |
model.shipments[].deliveries[].timeWindows[].costPerHourAfterSoftEndTime | pris en charge | Coût horaire d'un événement après softEndTime; exige softEndTime. Type number. |
model.shipments[].deliveries[].duration | pris en charge | Temps passé à l'arrêt pour effectuer la livraison. Type duration. Valeur par défaut 0s. |
model.shipments[].deliveries[].cost | prévu (V2) | Coût supplémentaire pour choisir cette option de livraison plutôt qu'une autre. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].cost is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].deliveries[].loadDemands | prévu (V2) | Variations de charge qui s'appliquent seulement quand cette option de livraison est choisie. Type map<string, object>. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].loadDemands is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].deliveries[].visitTypes | prévu (V2) | Types qui ajoutent à la livraison une durée supplémentaire propre au véhicule. Type string[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].visitTypes is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].deliveries[].label | pris en charge | Étiquette de la livraison fournie par l'appelant, renvoyée comme visitLabel dans la réponse. Type string. |
model.shipments[].deliveries[].avoidUTurns | prévu (V3) | Demande des tournées qui évitent les demi-tours à l'arrêt de livraison (expérimental dans GMPRO). Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].avoidUTurns is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].loadDemands | pris en charge | Charge que l'envoi ajoute à son ramassage et retire à sa livraison, par nom de type de charge. Une requête peut utiliser au plus 16 noms de types de charge distincts, tous les dictionnaires loadDemands et loadLimits confondus : erreur OUT_OF_RANGE au-delà. Type map<string, object>. |
model.shipments[].loadDemands{}.amount | pris en charge | Unités de ce type de charge. Les quantités d'un même type, sur tous les ramassages et toutes les livraisons de la requête, doivent totaliser au plus 2^53 - 1. Type int64. Valeur par défaut 0. |
model.shipments[].penaltyCost | pris en charge | Coût de ne pas servir l'envoi; absent, l'envoi est obligatoire. Type number. |
model.shipments[].allowedVehicleIndices | pris en charge | Indices des seuls véhicules qui peuvent servir l'envoi; vide, n'importe lequel le peut. Type int32[]. |
model.shipments[].costsPerVehicle | prévu (V2) | Coût supplémentaire quand un véhicule donné sert l'envoi. Type number[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].costsPerVehicle is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].costsPerVehicleIndices | prévu (V2) | Les véhicules auxquels costsPerVehicle fait référence. Type int32[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].costsPerVehicleIndices is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].pickupToDeliveryRelativeDetourLimit | prévu (V2) | Durée maximale permise entre le ramassage et la livraison, relative au trajet direct. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickupToDeliveryRelativeDetourLimit is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].pickupToDeliveryAbsoluteDetourLimit | prévu (V2) | Temps supplémentaire maximal permis entre le ramassage et la livraison par rapport au trajet direct. Type duration. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickupToDeliveryAbsoluteDetourLimit is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].pickupToDeliveryTimeLimit | prévu (V2) | Durée maximale permise entre le début du ramassage et le début de la livraison. Type duration. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickupToDeliveryTimeLimit is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].shipmentType | prévu (V2) | Nom de type utilisé par les règles d'incompatibilité et d'exigence. Type string. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].shipmentType is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.shipments[].label | pris en charge | Étiquette de l'envoi fournie par l'appelant, renvoyée comme shipmentLabel et utilisée pour reconnaître les nouvelles résolutions à la facturation. Type string. |
model.shipments[].ignore | pris en charge | À true, l'envoi est exclu de la résolution, inscrit dans skippedShipments avec la raison SHIPMENT_IGNORED, et n'est pas facturé. Type boolean. Valeur par défaut false. |
Champs des véhicules
| Champ | Statut | Comportement |
|---|---|---|
model.vehicles | pris en charge | Le parc de véhicules qui effectue les envois. Type object[]. |
model.vehicles[].displayName | pris en charge | Nom destiné aux personnes; il n'influe pas sur la résolution. Type string. |
model.vehicles[].travelMode | pris en charge | Mode de déplacement du véhicule; la V1 conduit. Type enum. Valeur par défaut DRIVING. Valeurs : TRAVEL_MODE_UNSPECIFIED, DRIVING prises en charge; WALKING refusée, prévue (V2). |
model.vehicles[].routeModifiers | prévu (V3) | Préférences routières, comme éviter les péages, les autoroutes ou les traversiers. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].routeModifiers is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].startLocation | pris en charge | Point de départ du véhicule, en degrés WGS84; sans lieu ni point de passage de départ, la tournée commence à son premier arrêt. Interdit quand le modèle a des durationDistanceMatrices. Type object. |
model.vehicles[].startLocation.latitude | pris en charge | Latitude en degrés, de -90 à 90. Type number. Valeur par défaut 0. |
model.vehicles[].startLocation.longitude | pris en charge | Longitude en degrés, de -180 à 180. Type number. Valeur par défaut 0. |
model.vehicles[].startWaypoint | pris en charge | Le départ du véhicule sous forme de point de passage; envoyez ce champ ou startLocation, pas les deux. Type object. |
model.vehicles[].startWaypoint.location | pris en charge | La position du point de passage; requise, parce que les identifiants de lieu ne sont pas pris en charge. Type object. |
model.vehicles[].startWaypoint.location.latLng | pris en charge | Coordonnées du point de passage, en degrés WGS84. Type object. |
model.vehicles[].startWaypoint.location.latLng.latitude | pris en charge | Latitude en degrés, de -90 à 90. Type number. Valeur par défaut 0. |
model.vehicles[].startWaypoint.location.latLng.longitude | pris en charge | Longitude en degrés, de -180 à 180. Type number. Valeur par défaut 0. |
model.vehicles[].startWaypoint.location.heading | ignoré | Cap du déplacement au point de passage, en degrés. Type int32. Avertissement FIELD_IGNORED quand il est fixé : « location.heading is ignored: Unmap snaps a location to the nearest road whatever the direction of travel. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google. |
model.vehicles[].startWaypoint.placeId | refusé | Un identifiant Google Places pour le point de passage. Type string. Erreur PLACE_ID_NOT_SUPPORTED quand il est fixé : « Google place IDs are not supported: Unmap cannot resolve them. » Conseil : Géocodez l'adresse avec /geocode/search d'Unmap et envoyez ses coordonnées dans startWaypoint.location.latLng ou startLocation. Refusé : un identifiant de lieu renvoie à la base de données de Google, et deviner un emplacement pour lui mènerait au mauvais endroit. |
model.vehicles[].startWaypoint.sideOfRoad | ignoré | Demande que le véhicule s'arrête du côté de la rue où se trouve le point de passage. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « sideOfRoad is ignored: Unmap travel times do not model which side of the road a stop is on. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google. |
model.vehicles[].startWaypoint.vehicleStopover | ignoré | Désigne le point de passage comme un endroit où le véhicule s'arrête pour ramasser ou déposer. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « vehicleStopover is ignored: Unmap snaps every stop to the nearest road a vehicle can use. » Ignoré plutôt que refusé : chaque arrêt Unmap est déjà traité comme un arrêt sur une route carrossable. |
model.vehicles[].startTags | pris en charge | Balises qui placent le départ du véhicule dans durationDistanceMatrices et choisissent sa matrice par vehicleStartTag; uniques et non vides; sans startTags, la tournée commence à son premier arrêt. Type string[]. |
model.vehicles[].startTimeWindows | pris en charge | Fenêtre horaire stricte pour l'heure de départ du véhicule; la V1 en accepte au plus une (GMPRO en permet plusieurs, triées, sans chevauchement et non contiguës). Type object[]. Plus de 1 : erreur VALUE_NOT_SUPPORTED_YET, « A vehicle with more than one startTimeWindows entry is not supported yet (planned for V2). » |
model.vehicles[].startTimeWindows[].startTime | pris en charge | Heure permise la plus hâtive; model.globalStartTime par défaut. Type timestamp. |
model.vehicles[].startTimeWindows[].endTime | pris en charge | Heure permise la plus tardive; model.globalEndTime par défaut. Type timestamp. |
model.vehicles[].startTimeWindows[].softStartTime | pris en charge | Début souple : un événement qui a lieu avant est permis et coûte costPerHourBeforeSoftStartTime par heure d'avance. Seulement sur une liste d'une seule fenêtre, à startTime ou après, dans la fenêtre globale. Type timestamp. |
model.vehicles[].startTimeWindows[].softEndTime | pris en charge | Fin souple : un événement qui a lieu après est permis et coûte costPerHourAfterSoftEndTime par heure de retard. Seulement sur une liste d'une seule fenêtre, à endTime ou avant, dans la fenêtre globale. Type timestamp. |
model.vehicles[].startTimeWindows[].costPerHourBeforeSoftStartTime | pris en charge | Coût horaire d'un événement avant softStartTime; exige softStartTime. Type number. |
model.vehicles[].startTimeWindows[].costPerHourAfterSoftEndTime | pris en charge | Coût horaire d'un événement après softEndTime; exige softEndTime. Type number. |
model.vehicles[].endLocation | pris en charge | Point d'arrivée du véhicule, en degrés WGS84; sans lieu ni point de passage d'arrivée, la tournée se termine à son dernier arrêt. Interdit quand le modèle a des durationDistanceMatrices. Type object. |
model.vehicles[].endLocation.latitude | pris en charge | Latitude en degrés, de -90 à 90. Type number. Valeur par défaut 0. |
model.vehicles[].endLocation.longitude | pris en charge | Longitude en degrés, de -180 à 180. Type number. Valeur par défaut 0. |
model.vehicles[].endWaypoint | pris en charge | L'arrivée du véhicule sous forme de point de passage; envoyez ce champ ou endLocation, pas les deux. Type object. |
model.vehicles[].endWaypoint.location | pris en charge | La position du point de passage; requise, parce que les identifiants de lieu ne sont pas pris en charge. Type object. |
model.vehicles[].endWaypoint.location.latLng | pris en charge | Coordonnées du point de passage, en degrés WGS84. Type object. |
model.vehicles[].endWaypoint.location.latLng.latitude | pris en charge | Latitude en degrés, de -90 à 90. Type number. Valeur par défaut 0. |
model.vehicles[].endWaypoint.location.latLng.longitude | pris en charge | Longitude en degrés, de -180 à 180. Type number. Valeur par défaut 0. |
model.vehicles[].endWaypoint.location.heading | ignoré | Cap du déplacement au point de passage, en degrés. Type int32. Avertissement FIELD_IGNORED quand il est fixé : « location.heading is ignored: Unmap snaps a location to the nearest road whatever the direction of travel. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google. |
model.vehicles[].endWaypoint.placeId | refusé | Un identifiant Google Places pour le point de passage. Type string. Erreur PLACE_ID_NOT_SUPPORTED quand il est fixé : « Google place IDs are not supported: Unmap cannot resolve them. » Conseil : Géocodez l'adresse avec /geocode/search d'Unmap et envoyez ses coordonnées dans endWaypoint.location.latLng ou endLocation. Refusé : un identifiant de lieu renvoie à la base de données de Google, et deviner un emplacement pour lui mènerait au mauvais endroit. |
model.vehicles[].endWaypoint.sideOfRoad | ignoré | Demande que le véhicule s'arrête du côté de la rue où se trouve le point de passage. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « sideOfRoad is ignored: Unmap travel times do not model which side of the road a stop is on. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google. |
model.vehicles[].endWaypoint.vehicleStopover | ignoré | Désigne le point de passage comme un endroit où le véhicule s'arrête pour ramasser ou déposer. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « vehicleStopover is ignored: Unmap snaps every stop to the nearest road a vehicle can use. » Ignoré plutôt que refusé : chaque arrêt Unmap est déjà traité comme un arrêt sur une route carrossable. |
model.vehicles[].endTags | pris en charge | Balises qui placent l'arrivée du véhicule dans durationDistanceMatrices; uniques et non vides; sans endTags, la tournée se termine à son dernier arrêt. Type string[]. |
model.vehicles[].endTimeWindows | pris en charge | Fenêtre horaire stricte pour l'heure d'arrivée du véhicule; la V1 en accepte au plus une (GMPRO en permet plusieurs, triées, sans chevauchement et non contiguës). Elle ne doit pas se fermer avant l'ouverture de startTimeWindows. Type object[]. Plus de 1 : erreur VALUE_NOT_SUPPORTED_YET, « A vehicle with more than one endTimeWindows entry is not supported yet (planned for V2). » |
model.vehicles[].endTimeWindows[].startTime | pris en charge | Heure permise la plus hâtive; model.globalStartTime par défaut. Type timestamp. |
model.vehicles[].endTimeWindows[].endTime | pris en charge | Heure permise la plus tardive; model.globalEndTime par défaut. Type timestamp. |
model.vehicles[].endTimeWindows[].softStartTime | pris en charge | Début souple : un événement qui a lieu avant est permis et coûte costPerHourBeforeSoftStartTime par heure d'avance. Seulement sur une liste d'une seule fenêtre, à startTime ou après, dans la fenêtre globale. Type timestamp. |
model.vehicles[].endTimeWindows[].softEndTime | pris en charge | Fin souple : un événement qui a lieu après est permis et coûte costPerHourAfterSoftEndTime par heure de retard. Seulement sur une liste d'une seule fenêtre, à endTime ou avant, dans la fenêtre globale. Type timestamp. |
model.vehicles[].endTimeWindows[].costPerHourBeforeSoftStartTime | pris en charge | Coût horaire d'un événement avant softStartTime; exige softStartTime. Type number. |
model.vehicles[].endTimeWindows[].costPerHourAfterSoftEndTime | pris en charge | Coût horaire d'un événement après softEndTime; exige softEndTime. Type number. |
model.vehicles[].unloadingPolicy | prévu (V3) | Ordre des livraisons : dernier entré, premier sorti, ou premier entré, premier sorti. Type enum. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].unloadingPolicy is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].loadLimits | pris en charge | Capacité par nom de type de charge. Ses clés comptent parmi les 16 types de charge distincts qu'une requête peut utiliser. Type map<string, object>. |
model.vehicles[].loadLimits{}.maxLoad | pris en charge | Nombre maximal d'unités de ce type de charge que le véhicule peut transporter à la fois; absent, sans limite. Type int64. |
model.vehicles[].loadLimits{}.softMaxLoad | pris en charge | Charge au-delà de laquelle chaque unité supplémentaire coûte costPerUnitAboveSoftMax; 0 si absente. Ne coûte rien sans un coût supérieur à 0. Type int64. |
model.vehicles[].loadLimits{}.costPerUnitAboveSoftMax | pris en charge | Coût par unité de charge maximale au-delà de softMaxLoad (0 si absente). Un coût supérieur à 0 exige un type de charge que seuls les ramassages ou seules les livraisons utilisent. Type number. |
model.vehicles[].loadLimits{}.startLoadInterval | prévu (V2) | Charge permise au départ de la tournée. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].loadLimits{}.startLoadInterval is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].loadLimits{}.endLoadInterval | prévu (V2) | Charge permise à la fin de la tournée. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].loadLimits{}.endLoadInterval is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].loadLimits{}.costPerKilometer | prévu (V3) | Coût au kilomètre qui dépend de la charge (expérimental dans GMPRO). Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].loadLimits{}.costPerKilometer is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].loadLimits{}.costPerTraveledHour | prévu (V3) | Coût par heure de trajet qui dépend de la charge (expérimental dans GMPRO). Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].loadLimits{}.costPerTraveledHour is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].costPerHour | pris en charge | Coût horaire de la tournée, du départ à l'arrivée du véhicule. Type number. Valeur par défaut 0. |
model.vehicles[].costPerTraveledHour | pris en charge | Coût par heure de conduite. Type number. Valeur par défaut 0. |
model.vehicles[].costPerKilometer | pris en charge | Coût par kilomètre parcouru. Type number. Valeur par défaut 0. |
model.vehicles[].fixedCost | pris en charge | Coût facturé une seule fois si le véhicule sert au moins un envoi. Type number. Valeur par défaut 0. |
model.vehicles[].usedIfRouteIsEmpty | prévu (V2) | Compte les coûts et la durée d'une tournée vide comme si le véhicule roulait du départ à l'arrivée. Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].usedIfRouteIsEmpty is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].routeDurationLimit | pris en charge | Limites de durée de la tournée, du départ à l'arrivée du véhicule. Type object. |
model.vehicles[].routeDurationLimit.maxDuration | pris en charge | Durée maximale stricte de la tournée, du départ à l'arrivée du véhicule. Type duration. |
model.vehicles[].routeDurationLimit.softMaxDuration | pris en charge | Durée maximale souple de la tournée, du départ à l'arrivée du véhicule : la dépasser coûte costPerHourAfterSoftMax par heure; inférieure à maxDuration quand les deux sont fixées. Type duration. |
model.vehicles[].routeDurationLimit.quadraticSoftMaxDuration | prévu (V3) | Durée maximale souple de la tournée, du départ à l'arrivée du véhicule, avec un coût qui croît comme le carré du dépassement. Type duration. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].routeDurationLimit.quadraticSoftMaxDuration is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].routeDurationLimit.costPerHourAfterSoftMax | pris en charge | Coût horaire au-delà de softMaxDuration; exige softMaxDuration. Type number. |
model.vehicles[].routeDurationLimit.costPerSquareHourAfterQuadraticSoftMax | prévu (V3) | Coût par heure au carré au-delà du maximum souple quadratique. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].routeDurationLimit.costPerSquareHourAfterQuadraticSoftMax is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].travelDurationLimit | pris en charge | Limites de temps de conduite sur la tournée. Type object. |
model.vehicles[].travelDurationLimit.maxDuration | pris en charge | Temps de conduite maximal strict sur la tournée. Type duration. |
model.vehicles[].travelDurationLimit.softMaxDuration | pris en charge | Temps de conduite maximal souple sur la tournée : le dépasser coûte costPerHourAfterSoftMax par heure; inférieur à maxDuration quand les deux sont fixés. Type duration. |
model.vehicles[].travelDurationLimit.quadraticSoftMaxDuration | prévu (V3) | Temps de conduite maximal souple sur la tournée, avec un coût qui croît comme le carré du dépassement. Type duration. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].travelDurationLimit.quadraticSoftMaxDuration is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].travelDurationLimit.costPerHourAfterSoftMax | pris en charge | Coût horaire au-delà de softMaxDuration; exige softMaxDuration. Type number. |
model.vehicles[].travelDurationLimit.costPerSquareHourAfterQuadraticSoftMax | prévu (V3) | Coût par heure au carré au-delà du maximum souple quadratique. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].travelDurationLimit.costPerSquareHourAfterQuadraticSoftMax is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].routeDistanceLimit | pris en charge | Limites de la distance parcourue sur la tournée. Type object. |
model.vehicles[].routeDistanceLimit.maxMeters | pris en charge | Distance maximale stricte, en mètres, au plus 1 000 000 000 (la valeur d'inaccessibilité du solveur). Type int64. |
model.vehicles[].routeDistanceLimit.softMaxMeters | pris en charge | Distance maximale souple, en mètres : la dépasser coûte costPerKilometerAboveSoftMax par kilomètre; inférieure à maxMeters quand les deux sont fixées. Type int64. |
model.vehicles[].routeDistanceLimit.costPerKilometerBelowSoftMax | refusé | Coût au kilomètre jusqu'au maximum souple. Type number. Erreur INVALID_VALUE quand il est fixé : « routeDistanceLimit.costPerKilometerBelowSoftMax is not supported: GMPRO does not support it in route_distance_limit either. » Conseil : Retirez le champ; costPerKilometer facture chaque kilomètre parcouru. Refusé : le proto de GMPRO lui-même indique que ce coût n'est pas pris en charge dans route_distance_limit, alors aucune requête GMPRO ne peut en dépendre. |
model.vehicles[].routeDistanceLimit.costPerKilometerAboveSoftMax | pris en charge | Coût au kilomètre au-delà de softMaxMeters; exige softMaxMeters. Type number. |
model.vehicles[].extraVisitDurationForVisitType | prévu (V2) | Temps supplémentaire que ce véhicule passe aux visites d'un type donné. Type map<string, duration>. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].extraVisitDurationForVisitType is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].breakRule | pris en charge | Pauses que le chauffeur doit prendre. Type object. |
model.vehicles[].breakRule.breakRequests | pris en charge | Pauses, dans l'ordre où elles doivent avoir lieu. Type object[]. |
model.vehicles[].breakRule.breakRequests[].earliestStartTime | pris en charge | Heure la plus hâtive à laquelle la pause peut commencer. Type timestamp. Requis. |
model.vehicles[].breakRule.breakRequests[].latestStartTime | pris en charge | Heure la plus tardive à laquelle la pause peut commencer. Type timestamp. Requis. |
model.vehicles[].breakRule.breakRequests[].minDuration | pris en charge | Durée minimale permise de la pause; doit être positive. Type duration. Requis. |
model.vehicles[].breakRule.frequencyConstraints | prévu (V3) | Règles de fréquence des pauses, à la manière des règles sur les heures de service. Type object[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].breakRule.frequencyConstraints is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].label | pris en charge | Étiquette du véhicule fournie par l'appelant, renvoyée comme vehicleLabel dans la réponse. Type string. |
model.vehicles[].ignore | prévu (V2) | Exclut le véhicule du plan. Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].ignore is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].travelDurationMultiple | prévu (V2) | Multiplie chaque durée de trajet de ce véhicule, pour les véhicules plus lents ou plus rapides. Type number. Valeur par défaut 1. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].travelDurationMultiple is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut. |
model.vehicles[].unmapProfile | pris en charge | Extension Unmap : le profil du réseau routier d'où viennent les temps de trajet du véhicule. Type enum. Valeur par défaut auto. Valeurs : auto prise en charge; truck, pedestrian refusées, prévues (V2). |
Prochaines étapes
- Des exemples, chacun une requête complète à copier : livraisons du dernier kilomètre, service sur le terrain avec pauses, et une messagerie avec ramassage et livraison.
- Erreurs : chaque erreur, avertissement et raison d'exclusion.
- Depuis Google Route Optimization : faire passer une intégration existante.