Otimizar os waypoints do trajeto

A otimização de pontos de passagem é um recurso de rota preferido que estende ComputeRoutes. Ele otimiza a ordem dos waypoints intermediários na rota de um viajante, garantindo que ele faça o trajeto mais eficiente possível. A implementação ComputeRoutes da otimização de ponto de passagem oferece suporte aos seguintes modos de viagem:

  • Carro
  • Motocicleta
  • Ciclismo
  • Caminhada

Por que usar a otimização de waypoints?

Ao criar um app que orienta os usuários por vários pontos de passagem no caminho até um destino, é importante que o viajante percorra os pontos de passagem na ordem ideal. Isso garante que o viajante chegue a cada ponto de passagem no menor tempo possível.

Como funciona

Por padrão, ComputeRoutes calcula um trajeto pelos waypoints, na ordem em que foram informados. Você pode usar ComputeRoutes para otimizar o trajeto reorganizando os waypoints intermediários em uma ordem mais eficiente. Você vai receber uma rota com pontos de passagem otimizados se definir o campo optimizeWaypointOrder no corpo da solicitação como true.

Observação: o cálculo de otimização do ponto de passagem é baseado principalmente no tempo de viagem, mas o recurso também considera outros fatores, como distância e número de curvas.

Receber pontos de passagem reordenados

Para receber uma rota com pontos de passagem reordenados, defina o campo booleano optimizeWaypointOrder como true no corpo da solicitação para ComputeRoutes. Além disso, inclua o campo optimizedIntermediateWaypointIndex na máscara de campo. O corpo da resposta contém a ordem otimizada de waypoints nos campos optimizedIntermediateWaypointIndex.

Observação: o campo optimizedIntermediateWaypointIndex retorna valores baseados em zero.

Exemplo de solicitação

O exemplo de solicitação a seguir fornece uma rota perto do campus da Universidade de Stanford. Os pontos de passagem do trajeto foram fornecidos sequencialmente na solicitação. A solicitação contém uma origem e um destino, com dois waypoints intermediários.

POST /v1alpha:computeRoutes
Host: routespreferred.googleapis.com
Content-Type: application/json
X-Server-Timeout: 10
X-Goog-Api-Key: YOUR_API_KEY
X-Goog-FieldMask: routes.optimizedIntermediateWaypointIndex,routes.duration,routes.distanceMeters,routes.polyline.encodedPolyline
{
  "origin":{
    "location":{
      "latLng":{
        "latitude": 37.418956,
        "longitude": -122.160815
      }
    }
  },
  "intermediates": [
    {
      "location":{
        "latLng":{
          "latitude": 37.4176423,
          "longitude":-122.1102246
        }
      }
    },
    {
      "location":{
        "latLng":{
          "latitude": 37.407689,
          "longitude": -122.1360597
        }
      }
    }
  ],
  "destination":{
    "location":{
      "latLng":{
        "latitude": 37.4032137,
        "longitude": -122.0349119
      }
    }
  },
  "travelMode": "DRIVE",
  "optimizeWaypointOrder": true,
  "routingPreference": "TRAFFIC_AWARE"}

Exemplo de resposta

É possível encontrar os índices de ponto de passagem intermediário reordenados nos campos optimizedIntermediateWaypointIndex no objeto de rotas no corpo da resposta. A poligonal codificada é a mesma da API Directions e da ComputeRoutes.

routes {
  distance_meters: 17647
  duration {
    seconds: 1866
  }
  polyline {
    encoded_polyline: "wkkcFvorhVU{@Ec@C}CG}@Mm@[}@i@y@[[g@_@Tk@BSjCgGfF|D\\Pv@Lj@@XaCTeC\\aCTs@`ByD`@k@h@e@x@Yh@GtADhBF|@G`AWpAs@lAsAdA{A`BmDr@cBmUqQoS}OyGmFiBsAgEwD}CaCU_@Og@@e@Hy@nGkO~@sBr@cBlDqIlByEp@}AjIfGnBbBHLLd@^p@~ErDfNrKrA~@DIhEeBTQ~AqDlE{KjBgE|FnEh@aAi@`A}FoE~AmD`A}BcAm@mHwFwD}CkLwIsDqCgF_EG[GKnCsDrA_BrC_CnCoBpEkD`EyClCsBcBeBIAkGkH]k@eJmKQKsAuA_@g@wCoDGQmEmFmIqROKaDuHvBkBxAgANCRH^f@v@dBHDD?`AUiBqEhBpEaATMCQYm@wAY]SIOByAfAwBjB_ByDaAwBiCeIA[c@aBqEuNOm@IQbA{c@p@aZFmCTuBLg@Tc@BUAKxOeV~Vy_@nBoDv@_BvAcDzA_EdG{RdC{HtIsY|B{Hx@mDbAuFdBsMbKsv@TaBf@}AdF{Sn@_DJq@Lo@aE`@]GUQmAmAQk@@g@RK`Ce@d@UDEPc@f@cCrAyGJs@X{AbIem@bA{JD_AIaAMg@o@{A_Ad@y@NaCLCsCK_FGI"
  }
  optimizedIntermediateWaypointIndex: 1
  optimizedIntermediateWaypointIndex: 0
}

Neste exemplo, observe que a otimização dos waypoints inverte a ordem original.

Uma solicitação com pontos de passagem otimizados leva mais tempo para ser processada do que uma solicitação de roteamento simples. Portanto, recomendamos que você defina um tempo limite maior na chamada de método definindo um valor para o cabeçalho de solicitação X-Server-Timeout de pelo menos dez segundos. Se você continuar recebendo erros de tempo limite, adicione mais um segundo e tente novamente.

Limitações de uso

Para usar a otimização de waypoints, siga estas limitações de uso e condições:

  • É possível especificar até o limite de uso para pontos intermediários na rota:

    • Até 98 pontos de passagem usando apenas coordenadas de latitude e longitude.
    • Até 25 waypoints se você especificar waypoints usando IDs de lugares.
  • Todos os seus waypoints precisam ser do tipo stopover. Nenhum dos seus pontos de passagem pode ser do tipo via.

  • É necessário adicionar routes.optimizedIntermediateWaypointIndex à máscara de campo.

  • Se a solicitação tiver 25 ou mais pontos intermediários, ela também precisará estar de acordo com as seguintes condições:

    • A distância acumulada em linha reta entre todos os waypoints precisa ser menor que 1.000 km. Essa distância inclui a origem e o destino.

    • O modo de transporte precisa ser DIRIGIR.