Otimizar os waypoints do trajeto

A otimização de waypoints é um recurso do Routes Preferred que estende o ComputeRoutes. Ele otimiza a ordem dos waypoints intermediários no trajeto de um viajante, garantindo que ele percorra o trajeto mais eficiente possível. A implementação de otimização de waypoints do ComputeRoutes é compatível com os seguintes meios de transporte:

  • Carro
  • Veículos motorizados de duas rodas
  • Ciclismo
  • A pé

Por que usar a otimização de waypoints?

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

Como funciona

Por padrão, o ComputeRoutes calcula um trajeto pelos waypoints na ordem em que foram fornecidos originalmente. Você pode fazer com que o ComputeRoutes otimize o trajeto reorganizando os waypoints intermediários em uma ordem mais eficiente. Você vai receber um trajeto com waypoints otimizados se definir o campo optimizeWaypointOrder no corpo da solicitação como true.

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

Receber pontos de passagem reordenados

Para receber um trajeto com pontos intermediários 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 dos pontos de passagem 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 um trajeto perto do campus da Universidade de Stanford. Os waypoints 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

Você encontra os índices de waypoints intermediários reordenados nos campos optimizedIntermediateWaypointIndex dentro do objeto de rotas no corpo da resposta. A polilinha codificada é a mesma da API Directions e de 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 deles.

Uma solicitação com waypoints otimizados leva mais tempo para ser processada do que uma solicitação de trajeto simples. Por isso, recomendamos que você defina um tempo limite maior na chamada de método, definindo um valor para o cabeçalho da 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 e condições de uso:

  • É possível especificar até o limite de uso para pontos intermediários no seu trajeto:

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

  • Adicione routes.optimizedIntermediateWaypointIndex à máscara de campo.

  • Se a solicitação tiver 25 ou mais waypoints intermediários, ela também precisará atender às seguintes condições:

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

    • O modo de viagem precisa ser DRIVE.