O trajeto de um veículo pode ser decomposto ao longo do eixo de tempo, desta forma (consideramos que há n visitas):
| | | | | 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
Observe que fazemos uma diferença entre:
- "Eventos pontuais", como o início e o fim do veículo e o início e o fim de cada visita (ou seja, a chegada e a partida). Eles acontecem em um determinado segundo.
- "intervalos de tempo", como as visitas em si e a transição entre elas. Embora os intervalos de tempo às vezes tenham duração zero, ou seja, começam e terminam no mesmo segundo, eles geralmente têm uma duração positiva.
Invariantes:
- Se houver n visitas, haverá n+1 transições.
- Uma visita é sempre cercada por uma transição anterior (mesmo índice) e uma transição posterior (índice + 1).
- A partida do veículo é sempre seguida pela transição #0.
- O fim do veículo é sempre precedido pela transição #n.
Aumentando o zoom, confira o que acontece durante uma Transition
e uma 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
Por fim, confira como TRAVEL, BREAKS, DELAY e WAIT podem ser organizados durante uma transição.
- Elas não se sobrepõem.
- O DELAY é único e precisa ser um período contíguo de tempo antes da próxima visita (ou término do veículo). Portanto, basta saber a duração do atraso para saber o início e o fim.
- As INTERVALOS são períodos contíguos e não sobrepostos. A resposta especifica o horário de início e a duração de cada intervalo.
- TRAVEL e WAIT são "preemptáveis": eles podem ser interrompidos várias vezes durante essa transição. Os clientes podem presumir que a viagem vai acontecer "assim que possível" e que o tempo restante será preenchido com "espera".
Um exemplo (complexo):
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 | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
Representação JSON |
---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
Campos | |
---|---|
vehicleIndex |
O veículo que faz o trajeto, identificado pelo índice na |
vehicleLabel |
Rótulo do veículo que realiza esse trajeto, igual a |
vehicleStartTime |
Horário em que o veículo inicia o trajeto. Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
vehicleEndTime |
Hora em que o veículo termina o trajeto. Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
visits[] |
Sequência ordenada de visitas que representam um trajeto. visitas[i] é a i-ésima visita no trajeto. Se este campo estiver vazio, o veículo será considerado não utilizado. |
transitions[] |
Lista ordenada de transições para a rota. |
hasTrafficInfeasibilities |
Quando
A chegada em next_visit provavelmente vai acontecer depois da janela de tempo atual devido ao aumento da estimativa do tempo de viagem de |
routePolyline |
A representação da polilinha codificada do trajeto. Esse campo só será preenchido se |
breaks[] |
Intervalos programados para o veículo que executa este trajeto. A sequência |
metrics |
Métricas de duração, distância e carga para essa rota. Os campos de |
routeCosts |
Custo da rota, detalhado por campos de solicitação relacionados ao custo. As chaves são caminhos proto, relativos à entrada OptimizeToursRequests, por exemplo, "model.shipments.pickups.cost", e os valores são o custo total gerado pelo campo de custo correspondente, agregado em toda a rota. Em outras palavras, costs["model.shipments.pickups.cost"] é a soma de todos os custos de retirada no trajeto. Todos os custos definidos no modelo são informados em detalhes aqui, com exceção dos custos relacionados a TransitionAttributes que só foram informados de maneira agregada a partir de 2022/01. |
routeTotalCost |
Custo total da rota. A soma de todos os custos no mapa de custos. |
Acesse
Uma visita realizada durante um trajeto. Essa visita corresponde à retirada ou entrega de um Shipment
.
Representação JSON |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
Campos | |
---|---|
shipmentIndex |
Índice do campo |
isPickup |
Se verdadeiro, a visita corresponde a um embarque de |
visitRequestIndex |
Índice de |
startTime |
Horário em que a visita começa. O veículo pode chegar antes disso ao local da visita. Os horários são consistentes com o Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
loadDemands |
Demanda total de carga de visitas como a soma do envio e da solicitação de visita |
detour |
Tempo extra de desvio devido às remessas visitadas no trajeto antes da visita e ao potencial tempo de espera induzido pelas janelas de tempo. Se a visita for uma entrega, o desvio será calculado a partir da visita de embarque correspondente e será igual a:
Caso contrário, ele é calculado com base no
Duração em segundos com até nove dígitos fracionários, terminando em " |
shipmentLabel |
Cópia do |
visitLabel |
Cópia do |
Transição
Transição entre dois eventos na rota. Veja a descrição de ShipmentRoute
.
Se o veículo não tiver um startLocation
e/ou endLocation
, as métricas de viagem correspondentes serão 0.
Representação JSON |
---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
Campos | |
---|---|
travelDuration |
Duração da viagem durante essa transição. Duração em segundos com até nove dígitos fracionários, terminando em " |
travelDistanceMeters |
Distância percorrida durante a transição. |
trafficInfoUnavailable |
Quando o tráfego é solicitado por |
delayDuration |
Soma das durações de atraso aplicadas a essa transição. Se houver, o atraso começa exatamente Duração em segundos com até nove dígitos fracionários, terminando em " |
breakDuration |
Soma da duração das pausas ocorridas durante essa transição, se houver. Os detalhes sobre o horário de início e a duração de cada intervalo são armazenados no Duração em segundos com até nove dígitos fracionários, terminando em " |
waitDuration |
Tempo gasto em espera durante a transição. A duração da espera corresponde ao tempo de inatividade e não inclui o tempo de intervalo. Esse tempo de espera pode ser dividido em vários intervalos não contíguos. Duração em segundos com até nove dígitos fracionários, terminando em " |
totalDuration |
Duração total da transição, fornecida para conveniência. É igual a:
Duração em segundos com até nove dígitos fracionários, terminando em " |
startTime |
Horário de início dessa transição. Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
routePolyline |
A representação codificada da polilinha da rota seguida durante a transição. Esse campo só será preenchido se |
routeToken |
Apenas saída. Um token opaco que pode ser transmitido ao SDK Navigation para reconstruir a rota durante a navegação e, em caso de redirecionamento, respeitar a intenção original quando a rota foi criada. Tratar esse token como um blob opaco. Não compare o valor dele entre solicitações, porque ele pode mudar mesmo que o serviço retorne exatamente a mesma rota. Esse campo só será preenchido se |
vehicleLoads |
Cargas de veículos durante essa transição, para cada tipo que aparece na As cargas durante a primeira transição são as cargas iniciais da rota do veículo. Depois, após cada visita, o |
EncodedPolyline
A representação codificada de uma polilinha. Veja mais informações sobre a codificação de polilinhas aqui: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.
Representação JSON |
---|
{ "points": string } |
Campos | |
---|---|
points |
String que representa os pontos codificados da polilinha. |
Intervalo
Dados que representam a execução de uma pausa.
Representação JSON |
---|
{ "startTime": string, "duration": string } |
Campos | |
---|---|
startTime |
Início do intervalo. Um carimbo de data/hora no formato RFC3339 UTC "Zulu", com resolução de nanossegundos e até nove dígitos fracionários. Exemplos: |
duration |
Duração de uma pausa. Duração em segundos com até nove dígitos fracionários, terminando em " |