Маршрут транспортного средства можно разложить по оси времени следующим образом (предполагаем, что имеется n посещений):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
Обратите внимание, что мы делаем различие между:
- «пунктуальные события», такие как начало и окончание движения транспортного средства, а также начало и окончание каждого визита (т.е. прибытие и отправление). Они происходят в определённую секунду.
- «временные интервалы», такие как сами посещения и переходы между посещениями. Хотя временные интервалы иногда могут иметь нулевую длительность, то есть начинаться и заканчиваться в одну и ту же секунду, часто они имеют положительную длительность.
Инварианты:
- Если посещений n, то переходов n+1.
- Визит всегда окружен переходом до него (тот же индекс) и переходом после него (индекс + 1).
- За стартом транспортного средства всегда следует переход №0.
- Концу транспортного средства всегда предшествует переход #n.
Увеличивая масштаб, можно увидеть, что происходит во время Transition и Visit :
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
Наконец, вот как можно организовать ПУТЕШЕСТВИЕ, ПЕРЕРЫВЫ, ЗАДЕРЖКУ и ОЖИДАНИЕ во время перехода.
- Они не пересекаются.
- Значение DELAY уникально и должно охватывать непрерывный период времени непосредственно перед следующим посещением (или окончанием движения транспортного средства). Таким образом, для определения времени начала и окончания задержки достаточно знать её длительность.
- ПЕРЕРЫВЫ — это непрерывные, неперекрывающиеся периоды времени. В ответе указывается время начала и продолжительность каждого перерыва.
- TRAVEL и WAIT являются «прерываемыми»: они могут прерываться несколько раз в течение этого перехода. Клиенты могут предполагать, что поездка произойдет «как можно скорее», а «ожидание» заполнит оставшееся время.
(Сложный) пример:
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
| JSON-представление |
|---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
| Поля | |
|---|---|
vehicleIndex | Транспортное средство, выполняющее маршрут, идентифицируется по его индексу в исходной |
vehicleLabel | Метка транспортного средства, выполняющего этот маршрут, равная |
vehicleStartTime | Время начала движения транспортного средства по маршруту. Использует RFC 3339, согласно которому сгенерированный вывод всегда будет нормализован по оси Z и содержать 0, 3, 6 или 9 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: |
vehicleEndTime | Время окончания маршрута транспортного средства. Использует RFC 3339, согласно которому сгенерированный вывод всегда будет нормализован по оси Z и содержать 0, 3, 6 или 9 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: |
visits[] | Упорядоченная последовательность посещений, образующая маршрут. visits[i] — i-е посещение в маршруте. Если это поле пусто, транспортное средство считается неиспользованным. |
transitions[] | Упорядоченный список переходов по маршруту. |
hasTrafficInfeasibilities | Если Прибытие в пункт назначения next_visit, вероятно, произойдет позже текущего временного окна из-за увеличения предполагаемого времени в пути |
routePolyline | Кодированное представление маршрута в виде ломаной линии. Это поле заполняется только в том случае, если |
breaks[] | Перерывы, запланированные для транспортного средства, следующего по этому маршруту. Последовательность |
metrics | Метрики длительности, расстояния и загрузки для этого маршрута. Поля |
vehicleFullness | Поле Экспериментальный: поведение или существование этого поля может измениться в будущем. |
routeCosts | Стоимость маршрута, разбитая по полям запроса, связанным со стоимостью. Ключами являются прото-пути относительно входного запроса OptimizeToursRequest, например, "model.shipments.pickups.cost", а значениями — общая стоимость, сгенерированная соответствующим полем стоимости, агрегированная по всему маршруту. Другими словами, costs["model.shipments.pickups.cost"] — это сумма всех расходов на забор груза по маршруту. Здесь подробно представлены все расходы, определенные в модели, за исключением расходов, связанных с TransitionAttributes, которые с января 2022 года отображаются только в агрегированном виде. |
routeTotalCost | Общая стоимость маршрута. Сумма всех расходов в карте стоимости. |
Посещать
Посещение, совершённое в ходе маршрута. Этот визит соответствует забору или доставке Shipment .
| JSON-представление |
|---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
| Поля | |
|---|---|
shipmentIndex | Индекс поля |
isPickup | Если значение true, посещение соответствует самовывозу |
visitRequestIndex | Индекс |
startTime | Время начала визита. Обратите внимание, что транспортное средство может прибыть к месту визита раньше. Время соответствует Использует RFC 3339, согласно которому сгенерированный вывод всегда будет нормализован по оси Z и содержать 0, 3, 6 или 9 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: |
loadDemands | Общий спрос на загрузку за посещение рассчитывается как сумма отгрузки и запроса на посещение |
detour | Дополнительное время объезда, обусловленное посещением грузов по маршруту до визита, и потенциальным временем ожидания, вызванным временными окнами. Если визит связан с доставкой, время объезда рассчитывается на основе соответствующего визита для забора товара и равно: В противном случае он вычисляется на основе Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « |
shipmentLabel | Копия соответствующей |
visitLabel | Копия соответствующего |
injectedSolutionLocationToken | Непрозрачный токен, представляющий информацию о месте посещения. Это поле может быть заполнено в результатах посещений маршрутов, если для этого посещения Экспериментальный вариант: более подробную информацию см. на странице https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request . |
Переход
Переход между двумя событиями на маршруте. См. описание ShipmentRoute .
Если у транспортного средства нет startLocation и/или endLocation , соответствующие метрики перемещения равны 0.
| JSON-представление |
|---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
| Поля | |
|---|---|
travelDuration | Продолжительность поездки во время этого перехода. Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « |
travelDistanceMeters | Расстояние, пройденное за время перехода. |
trafficInfoUnavailable | Когда трафик запрашивается через |
delayDuration | Сумма длительностей задержек, применяемых к этому переходу. Если задержка есть, она начинается ровно за Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « |
breakDuration | Суммарная продолжительность перерывов, возникающих во время данного перехода, если таковые имеются. Подробная информация о времени начала и продолжительности каждого перерыва хранится в Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « |
waitDuration | Время ожидания во время этого перехода. Длительность ожидания соответствует времени простоя и не включает время перерыва. Также обратите внимание, что это время ожидания может быть разделено на несколько несмежных интервалов. Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « |
totalDuration | Общая продолжительность перехода, указанная для удобства, равна:
Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « |
startTime | Время начала этого перехода. Использует RFC 3339, согласно которому сгенерированный вывод всегда будет нормализован по оси Z и содержать 0, 3, 6 или 9 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: |
routePolyline | Кодированное ломаное представление маршрута, пройденного во время перехода. Это поле заполняется только в том случае, если параметр |
routeToken | Только выходные данные. Непрозрачный токен, который можно передать в Navigation SDK для реконструкции маршрута во время навигации и, в случае изменения маршрута, учитывать исходное намерение при его создании. Относитесь к этому токену как к непрозрачному объекту. Не сравнивайте его значение между запросами, так как оно может измениться, даже если служба возвращает тот же маршрут. Это поле заполняется только в том случае, если для |
vehicleLoads | Загрузка транспортного средства во время этого перехода для каждого типа, который либо появляется в Нагрузки, полученные во время первого перехода, являются начальными нагрузками маршрута транспортного средства. Затем, после каждого посещения, |
EncodedPolyline
Кодированное представление полилинии. Более подробную информацию о кодировании полилиний можно найти здесь: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding .
| JSON-представление |
|---|
{ "points": string } |
| Поля | |
|---|---|
points | Строка, представляющая закодированные точки полилинии. |
Перерыв
Данные, отображающие выполнение разрыва.
| JSON-представление |
|---|
{ "startTime": string, "duration": string } |
| Поля | |
|---|---|
startTime | Время начала перерыва. Использует RFC 3339, согласно которому сгенерированный вывод всегда будет нормализован по оси Z и содержать 0, 3, 6 или 9 знаков после запятой. Также допускаются смещения, отличные от «Z». Примеры: |
duration | Продолжительность перерыва. Длительность в секундах, содержащая до девяти знаков после запятой, заканчивается на « |
Заполненность транспортного средства
VehicleFullness — это метрика, которая вычисляет степень заполнения транспортного средства. Каждое поле VehicleFullness принимает значения от 0 до 1 и рассчитывается как отношение поля метрики с ограничением (например, AggregatedMetrics.travel_distance_meters ) к соответствующему ограничению для транспортного средства (например, Vehicle.route_distance_limit ), если оно задано. В противном случае коэффициент заполнения не устанавливается. Если ограничение равно 0, значение поля равно 1. Примечание: если маршрут ограничен транспортными средствами, некоторые исходные коэффициенты заполнения могут превышать 1,0, например, транспортное средство может превысить установленный лимит пробега. В таких случаях мы устанавливаем ограничение на значение 1,0.
| JSON-представление |
|---|
{ "maxFullness": number, "distance": number, "travelDuration": number, "activeDuration": number, "maxLoad": number, "activeSpan": number } |
| Поля | |
|---|---|
maxFullness | Максимальное из всех остальных полей в этом сообщении. |
distance | Соотношение между |
travelDuration | Соотношение между [AggregatedMetrics.travel_duration_seconds][] и |
activeDuration | Соотношение между [AggregatedMetrics.total_duration_seconds][] и |
maxLoad | Максимальное соотношение между всеми типами [AggregatedMetrics.max_load][] и соответствующими им значениями |
activeSpan | Отношение (vehicleEndTime - vehicleStartTime) / (latestVehicleEndTime - earliestVehicleStartTime) для заданного транспортного средства. Если знаменатель отсутствует, используется ( |