Optimize tours by territories
Many transport companies operate in a mode where a driver-vehicle combination serves a certain geographic area, due to business constraints, to retain a strong customer relationship and for other reasons.
The Territory optimization feature allows programmatically distributing the vehicles between the specific districts or areas in the most advantageous way when optimizing tours. When optimizing territories while building your requests, you can control the balance between the workload and fleet capacity in the terms of location of the jobs to be executed. Assign your vehicles or groups of vehicles to the specific territories to allow them to operate on the desired territories, or restrict operating on the others.
In the Tour Planning, territories are used to define spatial restrictions on the jobs which a vehicle is allowed or preferred to take. When building a problem, each territory is referred to by its id, which is in full control of the user and not bound in any way to its geographical location or administrative nomenclature. The id of a territory is a unique identifier that is consistently used in both vehicle and job definitions. It is the responsibility of the user to assign territories to jobs so that they correctly represent the location of the jobs.
The following sections describe the exclusive, preferred, and prioritized territory types:
Exclusive Territories
The Exclusive Territories feature can be applied when you need to restrict vehicles or groups of vehicles to execute jobs only within the specific district or area. Consider a fleet where each vehicle is only allowed to visit a specific region, e.g., a city district.
For a given vehicle type, its territories field contains the id of the territory to which the vehicle is restricted - North in the example.
"fleet": {
"types": [
{
...
"territories": {
"strict": true,
"items": [{"id": "North"}]
}
}
]
}Each job has the id of its territory specified in territoryIds field - North in the example.
"plan": {
"jobs": [
{
...
"tasks": {
"deliveries": [
{
"places": [{
...
"territoryIds": ["North"]
}]
}
]
}
}
]
}In the example below we have 2 vehicles and 3 jobs to execute in different areas - job A in the North, job B in the South, and job C with no territory specified. In this problem, each vehicle is allowed to visit only one of those territories.
{
"fleet": {
"types": [
{
"id": "car_1",
"profile": "car_profile",
"costs": {
"distance": 0.0001,
"time": 0
},
"territories": {
"strict": true,
"items": [
{
"id": "North"
}
]
},
"shifts": [
{
"start": {
"time": "2021-07-04T06:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
},
"end": {
"time": "2021-07-04T13:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
}
}
],
"capacity": [
0
],
"amount": 1
},
{
"id": "car_2",
"profile": "car_profile",
"costs": {
"distance": 0.0001,
"time": 0
},
"territories": {
"strict": true,
"items": [
{
"id": "South"
}
]
},
"shifts": [
{
"start": {
"time": "2021-07-04T06:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
},
"end": {
"time": "2021-07-04T13:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
}
}
],
"capacity": [
0
],
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car_profile"
}
]
},
"plan": {
"jobs": [
{
"id": "A",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.628661,
"lng": -122.342312
},
"territoryIds": [
"North"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "B",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.623887,
"lng": -122.341163
},
"territoryIds": [
"South"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "C",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.622523,
"lng": -122.337323
},
"duration": 0
}
],
"demand": [
0
]
}
]
}
}
]
}
}In the solution for this problem, the vehicle car_1 is only assigned to the jobs where the territoryIds attribute contains North - in this case, only job A. Accordingly, the vehicle car_2 is assigned to the job B which is in territory South. Job C, which is neither in North nor in South, is not included in the tour at all.
{
"statistic": {
"cost": 0.2675,
"distance": 2675,
"duration": 447,
"times": {
"driving": 447,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "car_2_1",
"typeId": "car_2",
"stops": [
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:03:00Z",
"departure": "2021-07-04T06:03:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 47.623887,
"lng": -122.341163
},
"time": {
"arrival": "2021-07-04T06:04:54Z",
"departure": "2021-07-04T06:04:54Z"
},
"load": [
0
],
"activities": [
{
"jobId": "B",
"type": "delivery"
}
],
"distance": 630
},
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:06:33Z",
"departure": "2021-07-04T06:06:33Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 1155
}
],
"statistic": {
"cost": 0.1155,
"distance": 1155,
"duration": 213,
"times": {
"driving": 213,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
},
{
"vehicleId": "car_1_1",
"typeId": "car_1",
"stops": [
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:03:00Z",
"departure": "2021-07-04T06:03:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 47.628661,
"lng": -122.342312
},
"time": {
"arrival": "2021-07-04T06:04:48Z",
"departure": "2021-07-04T06:04:48Z"
},
"load": [
0
],
"activities": [
{
"jobId": "A",
"type": "delivery"
}
],
"distance": 760
},
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:06:54Z",
"departure": "2021-07-04T06:06:54Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 1520
}
],
"statistic": {
"cost": 0.152,
"distance": 1520,
"duration": 234,
"times": {
"driving": 234,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
],
"unassigned": [
{
"jobId": "C",
"reasons": [
{
"code": "TERRITORY_CONSTRAINT",
"description": "cannot be assigned due to territory constraint"
}
]
}
]
}Preferred Territories
There might be vehicles in a fleet that should have preferred territories - the areas where they would operate more efficiently for some reasons, so the dispatcher would like them to operate there preferably. But they should also pick up the jobs outside of those preferred territories, if they have spare capacity and timing, so only assigning them to the specific areas would be too restrictive. The Preferred territories option allows to schedule the jobs on those preferred districts with precedence, and if possible, the other jobs from the other territories can be scheduled.
In Tour Planning, such territory preference is marked by "strict": false, as opposed to the strict limitation to a territory denoted by "strict": true.
"fleet": {
"types": [
{
...
"territories": {
"strict": false,
"items": [{"id": "North"}]
}
}
]
}Note that a job without the territory specified in its place can be only picked up by vehicles with preferred territories and by vehicles without any territory assigned. Vehicles with strict territories cannot serve such jobs.
In the example below we have 2 vehicles. We set one of them to operate strictly in the territory North, and another one in the territory South, but without restriction. We need to execute 5 jobs, 2 of them in the territory North, one in the South, another one in the South-East (which is not assigned to any of the vehicles), and one job outside the preferred territories.
{
"fleet": {
"types": [
{
"id": "car_1",
"profile": "car_profile",
"costs": {
"distance": 0.0001,
"time": 0
},
"territories": {
"strict": true,
"items": [
{
"id": "North"
}
]
},
"shifts": [
{
"start": {
"time": "2021-07-04T06:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
},
"end": {
"time": "2021-07-04T06:08:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
}
}
],
"capacity": [
0
],
"amount": 1
},
{
"id": "car_2",
"profile": "car_profile",
"costs": {
"distance": 0.0001,
"time": 0
},
"territories": {
"strict": false,
"items": [
{
"id": "South"
}
]
},
"shifts": [
{
"start": {
"time": "2021-07-04T06:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
},
"end": {
"time": "2021-07-04T13:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
}
}
],
"capacity": [
0
],
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car_profile"
}
]
},
"plan": {
"jobs": [
{
"id": "A",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.628661,
"lng": -122.342312
},
"territoryIds": [
"North"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "B",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.623887,
"lng": -122.341163
},
"territoryIds": [
"South"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "C",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.622523,
"lng": -122.337323
},
"territoryIds": [
"South-East"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "D",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.624891,
"lng": -122.347445
},
"territoryIds": [
"North"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "E",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.623208,
"lng": -122.330536
},
"duration": 0
}
],
"demand": [
0
]
}
]
}
}
]
}
}From the solution, we can see that the vehicle type car_1 is only assigned to the job with territoryIds attribute North, since its territory assignment is strict. Due to the time restriction on its shift, only job A can be assigned to it.
The vehicle type car_2 is assigned to the job B, which is in its preferred territory South. Besides that, since it has spare capacity in its longer shift, it will be assigned to the job C from a territory that is not explicitly served by any vehicle (South-East), job E without any territory, and job D in the North which cannot be served by car_1 due to its time restriction.
{
"statistic": {
"cost": 0.5169,
"distance": 5169,
"duration": 849,
"times": {
"driving": 849,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "car_1_1",
"typeId": "car_1",
"stops": [
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:03:00Z",
"departure": "2021-07-04T06:03:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 47.628661,
"lng": -122.342312
},
"time": {
"arrival": "2021-07-04T06:04:48Z",
"departure": "2021-07-04T06:04:48Z"
},
"load": [
0
],
"activities": [
{
"jobId": "A",
"type": "delivery"
}
],
"distance": 760
},
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:06:54Z",
"departure": "2021-07-04T06:06:54Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 1520
}
],
"statistic": {
"cost": 0.152,
"distance": 1520,
"duration": 234,
"times": {
"driving": 234,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
},
{
"vehicleId": "car_2_1",
"typeId": "car_2",
"stops": [
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:03:00Z",
"departure": "2021-07-04T06:03:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 47.624891,
"lng": -122.347445
},
"time": {
"arrival": "2021-07-04T06:05:18Z",
"departure": "2021-07-04T06:05:18Z"
},
"load": [
0
],
"activities": [
{
"jobId": "D",
"type": "delivery"
}
],
"distance": 923
},
{
"location": {
"lat": 47.623887,
"lng": -122.341163
},
"time": {
"arrival": "2021-07-04T06:06:50Z",
"departure": "2021-07-04T06:06:50Z"
},
"load": [
0
],
"activities": [
{
"jobId": "B",
"type": "delivery"
}
],
"distance": 1532
},
{
"location": {
"lat": 47.622523,
"lng": -122.337323
},
"time": {
"arrival": "2021-07-04T06:09:10Z",
"departure": "2021-07-04T06:09:10Z"
},
"load": [
0
],
"activities": [
{
"jobId": "C",
"type": "delivery"
}
],
"distance": 2547
},
{
"location": {
"lat": 47.623208,
"lng": -122.330536
},
"time": {
"arrival": "2021-07-04T06:11:02Z",
"departure": "2021-07-04T06:11:02Z"
},
"load": [
0
],
"activities": [
{
"jobId": "E",
"type": "delivery"
}
],
"distance": 3248
},
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:13:15Z",
"departure": "2021-07-04T06:13:15Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 3609
}
],
"statistic": {
"cost": 0.3649,
"distance": 3649,
"duration": 615,
"times": {
"driving": 615,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}Prioritized Territories
If the territory limitations set for a vehicle are not strict, but more fine-grained control than offered by preferred territories is required, then the territories can be prioritized. That means that a vehicle can be assigned to several areas or districts with differing priorities. For example, to set the most prioritized territory, you should set its priority to 1, and use 2 for a territory with a lower priority, and so on, up to 5. Note that different territories can have the same priority. When evaluating schedules of the jobs for a vehicle, the jobs from its higher priority territories take precedence over the jobs from its lower priority territories.
"fleet": {
"types": [
{
...
"territories": {
"strict": true,
"items": [
{
"id": "North",
"priority": 1
},
{
"id": "South",
"priority": 2
},
{
"id": "South-East",
"priority": 2
}
]
}
}
]
}Note that the option of setting more than one territory with the same priority for a vehicle may solve the situation when the jobs cannot be executed by the standard territory-bound vehicles. When you set several territories (or all of them) with the lower priority for one of your vehicles, then such a vehicle will serve the jobs that cannot be assigned to the rest of the vehicles. Check the vehicle type joker in the example to see how it will operate.
In the example below we have 3 vehicles:
car_1operates strictly in 2 territories -Northwith higher priority andSouthwith lower priority.car_2operates strictly in 3 territories -Southwith higher priority, andNorthtogether withSouth-Eastwith lower priority.jokeroperates in all 3 territoriesNorth,South, andSouth-Eastwith lower priority than the rest of the fleet and is allowed to operate outside the territories as well.
Those vehicles are intended to execute 6 jobs in the different areas:
- job
Ain the North - job
Bin the South - job
Cin the South-East - job
Din the North - job
Eoutside the prioritized territories - job
Fin the South-East
{
"fleet": {
"types": [
{
"id": "car_1",
"profile": "car_profile",
"costs": {
"distance": 0.0001,
"time": 0
},
"territories": {
"strict": true,
"items": [
{
"id": "North",
"priority": 1
},
{
"id": "South",
"priority": 2
}
]
},
"shifts": [
{
"start": {
"time": "2021-07-04T06:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
},
"end": {
"time": "2021-07-04T06:08:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
}
}
],
"capacity": [
0
],
"amount": 1
},
{
"id": "car_2",
"profile": "car_profile",
"costs": {
"distance": 0.0001,
"time": 0
},
"territories": {
"strict": true,
"items": [
{
"id": "South",
"priority": 1
},
{
"id": "North",
"priority": 2
},
{
"id": "South-East",
"priority": 2
}
]
},
"shifts": [
{
"start": {
"time": "2021-07-04T06:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
},
"end": {
"time": "2021-07-04T06:11:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
}
}
],
"capacity": [
0
],
"amount": 1
},
{
"id": "joker",
"profile": "car_profile",
"costs": {
"distance": 0.0001,
"time": 0
},
"territories": {
"strict": false,
"items": [
{
"id": "North",
"priority": 3
},
{
"id": "South",
"priority": 3
},
{
"id": "South-East",
"priority": 3
}
]
},
"shifts": [
{
"start": {
"time": "2021-07-04T06:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
},
"end": {
"time": "2021-07-04T13:03:00Z",
"location": {
"lat": 47.625729,
"lng": -122.337255
}
}
}
],
"capacity": [
0
],
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car_profile"
}
]
},
"plan": {
"jobs": [
{
"id": "A",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.628661,
"lng": -122.342312
},
"territoryIds": [
"North"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "B",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.623887,
"lng": -122.341163
},
"territoryIds": [
"South"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "C",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.622523,
"lng": -122.337323
},
"territoryIds": [
"South-East"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "D",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.624891,
"lng": -122.347445
},
"territoryIds": [
"North"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "E",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.623208,
"lng": -122.330536
},
"duration": 0
}
],
"demand": [
0
]
}
]
}
},
{
"id": "F",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 47.621933,
"lng": -122.334567
},
"territoryIds": [
"South-East"
],
"duration": 0
}
],
"demand": [
0
]
}
]
}
}
]
}
}In the solution, the vehicle type car_1 serves job A as it is in its high priority zone North, but is not assigned job D in the North or job F in South-East due to its shift time restriction.
Vehicle type car_2 serves job B as it is in its highest priority territory South, and also job D that is in its lower priority territory North, and job C in its lower priority territory South-East.
And finally, since the joker's territory preference is not strict, it will execute job F in the South-West, and job E outside the prioritized territories.
{
"statistic": {
"cost": 0.6223000000000001,
"distance": 6223,
"duration": 1066,
"times": {
"driving": 1066,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "car_1_1",
"typeId": "car_1",
"stops": [
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:03:00Z",
"departure": "2021-07-04T06:03:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 47.628661,
"lng": -122.342312
},
"time": {
"arrival": "2021-07-04T06:04:48Z",
"departure": "2021-07-04T06:04:48Z"
},
"load": [
0
],
"activities": [
{
"jobId": "A",
"type": "delivery"
}
],
"distance": 923
},
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:06:54Z",
"departure": "2021-07-04T06:06:54Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 1532
}
],
"statistic": {
"cost": 0.152,
"distance": 1520,
"duration": 234,
"times": {
"driving": 234,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
},
{
"vehicleId": "car_2_1",
"typeId": "car_2",
"stops": [
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:03:00Z",
"departure": "2021-07-04T06:03:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 47.624891,
"lng": -122.347445
},
"time": {
"arrival": "2021-07-04T06:05:18Z",
"departure": "2021-07-04T06:05:18Z"
},
"load": [
0
],
"activities": [
{
"jobId": "D",
"type": "delivery"
}
],
"distance": 923
},
{
"location": {
"lat": 47.623887,
"lng": -122.341163
},
"time": {
"arrival": "2021-07-04T06:06:50Z",
"departure": "2021-07-04T06:06:50Z"
},
"load": [
0
],
"activities": [
{
"jobId": "B",
"type": "delivery"
}
],
"distance": 1532
},
{
"location": {
"lat": 47.622523,
"lng": -122.337323
},
"time": {
"arrival": "2021-07-04T06:09:10Z",
"departure": "2021-07-04T06:09:10Z"
},
"load": [
0
],
"activities": [
{
"jobId": "C",
"type": "delivery"
}
],
"distance": 2246
},
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:10:59Z",
"departure": "2021-07-04T06:10:59Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 2607
}
],
"statistic": {
"cost": 0.2811,
"distance": 2811,
"duration": 479,
"times": {
"driving": 479,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
},
{
"vehicleId": "joker_1",
"typeId": "joker",
"stops": [
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:03:00Z",
"departure": "2021-07-04T06:03:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 47.623208,
"lng": -122.330536
},
"time": {
"arrival": "2021-07-04T06:05:22Z",
"departure": "2021-07-04T06:05:22Z"
},
"load": [
0
],
"activities": [
{
"jobId": "E",
"type": "delivery"
}
],
"distance": 923
},
{
"location": {
"lat": 47.621933,
"lng": -122.334567
},
"time": {
"arrival": "2021-07-04T06:06:48Z",
"departure": "2021-07-04T06:06:48Z"
},
"load": [
0
],
"activities": [
{
"jobId": "F",
"type": "delivery"
}
],
"distance": 1532
},
{
"location": {
"lat": 47.625729,
"lng": -122.337255
},
"time": {
"arrival": "2021-07-04T06:08:53Z",
"departure": "2021-07-04T06:08:53Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 2246
}
],
"statistic": {
"cost": 0.18920000000000003,
"distance": 1892,
"duration": 353,
"times": {
"driving": 353,
"serving": 0,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}Next steps
For more information, see:
Updated 28 days ago