API Dispatch (Otimização de Rotas)

Utilize o Dispatch para otimizar rotas em múltiplos veículos e muitas paragens. O Dispatch devolve uma rota ordenada por veículo com saída de horários, distância e atribuição para roteamento de entregas, assistência no terreno, operações de estafetas e planeamento de frotas.

Visão geral da API Dispatch da TrackRoad mostrando veículos e paragens a fluírem para rotas otimizadas
O Dispatch atribui paragens a vários veículos e devolve rotas otimizadas com ordem das paragens, ETA, distância e duração para cada veículo.

Precisa do contrato completo?

Utilize o Swagger para modelos REST e o WSDL para detalhes de integração SOAP.

Ver Swagger UI Ver WSDL SOAP Visão geral da referência da API

Índice

  1. O que faz o Dispatch
  2. Modo Optima, Time Window & TimeWindowDepot
  3. Múltiplas recolhas e entregas
  4. Endpoints e URLs base
  5. Autenticação
  6. Esquema do pedido
  7. Esquema da resposta
  8. Erros comuns
  9. Boas práticas
  10. Endpoints relacionados
  11. FAQ

O que faz o Dispatch#

O Dispatch resolve um problema de roteamento multi-veículo. Atribui paragens a veículos e ordena cada rota usando restrições como janelas temporais, capacidade, prioridade e locais de início ou fim.

LatLong é preferível. Cada paragem deve incluir LatLong sempre que possível. Se LatLong não for fornecido, tem de fornecer Address para que o serviço possa geocodificar a paragem.

O método Dispatch aceita uma lista de veículos e uma lista de localizações de paragem. Cada veículo pode incluir um local de início e um local de fim opcional. Cada localização pode conter um nome, campos de morada e latitude e longitude.

Se a latitude e a longitude estiverem presentes, a TrackRoad utiliza-as diretamente. Caso contrário, o serviço geocodifica a morada para obter coordenadas.

O Dispatch devolve itens de veículo. Cada item de veículo contém a rota atribuída como uma lista ordenada de paragens, otimizada por localização, capacidade, horários e outros fatores de roteamento.

Quando apenas um veículo está disponível, o Dispatch executa apenas a otimização de rota. Os modos de dispatch são sobretudo importantes quando existem vários veículos disponíveis.

Se não tiver a certeza de qual o modo de dispatch a utilizar, comece com Auto. Para uma otimização altamente precisa com um único veículo, utilize Optima.

Modo Optima, Time Window & TimeWindowDepot#

Em algumas linguagens pode não ser possível passar um datetime nulo. Nesse caso, utilize 0001-01-01T00:00:00. Datas anteriores ao limite do sistema são tratadas como valores nulos.

Para melhores resultados, utilize o DispatchMode Optima.

Três variáveis afetam o comportamento do dispatch com janelas temporais:

  • CanArriveEarly
  • TimeConstraintArrival
  • TimeConstraintDeparture

Opção 1: CanArriveEarly = true

Quando CanArriveEarly é true, a janela temporal começa no início do dia. Se TimeConstraintArrival for nulo, a paragem pode ser visitada a qualquer hora durante o dia. Se TimeConstraintArrival estiver definido, define a hora máxima de chegada aceitável. A hora de partida é ignorada.

Opção 2: CanArriveEarly = false

Quando CanArriveEarly é false, a chegada e a partida definem a janela temporal permitida. Se a chegada estiver definida e a partida for nula, a paragem é tratada como um agendamento exato. Se ambas estiverem definidas, a TrackRoad tenta visitar a paragem dentro desse intervalo temporal.

Opção 3: Duas janelas temporais

Também pode especificar uma segunda janela temporal utilizando TimeConstraintArrival2 e TimeConstraintDeparture2. Isto é útil quando uma paragem só pode ser visitada em dois períodos distintos, como horários restritos de entregas no centro da cidade. O TimeWindowDepot segue a mesma lógica, mas assume que os veículos começam e terminam num depósito comum.

As pausas podem ser modeladas com LocationType = Break. As cadeias de múltiplas recolhas e entregas suportam apenas uma janela temporal de entrega ao nível da entrega, e essa restrição temporal filha não pode ser mais apertada do que a restrição principal.

Múltiplas recolhas e entregas#

O Dispatch suporta encadeamento de recolhas e entregas. Isto é útil para operações de estafetas e fluxos de trabalho em que uma paragem tem de ser visitada antes de outra.

Utilize Midway para a primeira paragem numa cadeia e Delivery para especificar a localização relacionada seguinte. Utilize DeliveryNonStop para determinar se a próxima entrega associada tem de ocorrer imediatamente ou pode ocorrer mais tarde na mesma rota.

Por exemplo, se uma encomenda for recolhida na localização B e entregue na localização M, a TrackRoad preserva a relação obrigatória entre a recolha e a entrega enquanto continua a otimizar a rota em torno das restantes paragens.

DeliveryNonStop = true

Quando DeliveryNonStop é true, a paragem de entrega associada tem de ser visitada imediatamente após a paragem de recolha.

DeliveryNonStop = false

Quando DeliveryNonStop é false, a entrega associada tem de ocorrer depois da recolha, mas não precisa de acontecer imediatamente.

Pode encadear várias entregas, como B → M → N, definindo Delivery e KeepSameOrder em cada paragem associada.

Para trabalhos de ida e volta, defina localizações de recolha, entrega e regresso como uma cadeia. Uma recomendação comum é DeliveryNonStop = false e KeepSameOrder = true para uma otimização mais flexível, preservando a ordem do negócio.

Exemplo de paragens de ida e volta da API TrackRoad
Exemplo: Paragens de ida e volta.
Exemplo de rota de ida e volta da API TrackRoad
Exemplo: Rota de ida e volta.

Endpoints e URLs base#

REST

Item Valor
URL base https://trackservice.trackroad.com
Endpoint POST /rest/dispatch
URL completa https://trackservice.trackroad.com/rest/dispatch
Content-Type application/json

SOAP

Item Valor
Endpoint https://trackservice.trackroad.com/TrackService.asmx
WSDL https://trackservice.trackroad.com/TrackService.asmx?WSDL
Método Dispatch
SOAPAction http://trackservice.trackroad.com/Dispatch

O SOAP utiliza os mesmos modelos DispatchSpecification e DispatchResult. A principal diferença é o envelope SOAP e a autenticação baseada em cabeçalhos.

Autenticação#

Autenticação REST (X-API-Key)

Inclua a sua TrackServiceKey no cabeçalho X-API-Key em todos os pedidos. Gere a chave na sua conta TrackRoad em Autenticação da API .

curl -X POST "https://trackservice.trackroad.com/rest/dispatch" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_TRACKSERVICEKEY" \
  -d '{ "RoutingService": 0, "DistanceUnit": 0, "RouteOptimize": 0, "Vehicles": [], "Locations": [] }'

Mantenha as chaves API no servidor. Não incorpore chaves em código de browser ou clientes móveis.

Autenticação SOAP (SessionIDHeader)

Para pedidos SOAP, envie a sua TrackServiceKey em SessionIDHeader como SessionID. Os antigos Login e Logout não são necessários quando utiliza autenticação com TrackServiceKey.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <SessionIDHeader xmlns="http://trackservice.trackroad.com/">
      <SessionID>YOUR_TRACKSERVICEKEY</SessionID>
    </SessionIDHeader>
  </soap:Header>
  <soap:Body>
    <Dispatch xmlns="http://trackservice.trackroad.com/">
      <specification>
        <RoutingService>0</RoutingService>
        <DistanceUnit>0</DistanceUnit>
        <RouteOptimize>0</RouteOptimize>
        <Vehicles />
        <Locations />
      </specification>
    </Dispatch>
  </soap:Body>
</soap:Envelope>

Os namespaces e prefixos SOAP podem variar consoante a sua ferramenta. Um cliente gerado a partir do WSDL costuma ser a opção mais simples.

Esquema do pedido#

O corpo do pedido é um único objeto: DispatchSpecification. No mínimo, forneça veículos e localizações.

DispatchSpecification

Propriedade Tipo Obrigatório Descrição
RoutingServiceint (enum)NãoMotor de roteamento. 0 = NetRoad, 1 = TrackRoad, 2 = Bing. Recomendado: 0 = NetRoad.
IsNeedMatchCodeboolNãoSe true, inclui códigos de qualidade de correspondência de geocodificação quando aplicável.
CurrentTimestring (date-time)NãoReferência de hora atual utilizada para restrições temporais em formato ISO 8601.
DispatchModeint (enum)NãoEstratégia de otimização. Para recomendações de modo, consulte Modos de Dispatch.
MinimumOptimizationintNãoLimiar de intensidade da otimização. Intervalo típico: 1 a 10.
DistanceUnitint (enum)Não0 = Milha, 1 = Quilómetro.
RouteOptimizeint (enum)Não0 = MinimizeTime, 1 = MinimizeDistance. Recomendado: 0 = MinimizeTime.
VehiclesVehicle[]NãoVeículos disponíveis para dispatch.
LocationsLocation[]SimParagens a atribuir e ordenar.

DispatchMode

Propriedade Tipo Valor Descrição
Autoint0Seleciona automaticamente uma estratégia de dispatch adequada. Melhor ponto de partida por defeito.
EqualStopint1Tenta distribuir um número igual de paragens pelos veículos.
SingleRegionint2Útil quando os veículos estão geograficamente dispersos, mas servem paragens em áreas semelhantes.
MultipleRegionint3Útil para veículos a operar em cidades diferentes ou regiões distantes e para dispatch de assistência no terreno em tempo real.
EqualHourint4Tenta dividir o trabalho em rotas com duração total semelhante.
EqualDistanceint5Tenta dividir o trabalho em rotas com distância total semelhante.
TimeWindowint6Dá prioridade a janelas de agendamento e entrega. A otimização pode ser reduzida para cumprir restrições temporais.
TimeWindowDepotint7Modo de janela temporal que assume um depósito central partilhado pelos veículos.
Optimaint8Modo de elevada precisão para um único veículo, com ou sem janelas temporais.
BalanceLocationint9Equilibra o número de paragens atribuídas entre vários motoristas.
BalanceTimeint10Equilibra o tempo de rota entre vários motoristas.
MinimumVehiclesint11Seleciona o número mínimo de veículos necessário para servir todas as paragens, tendo em conta fatores de roteamento.

Vehicle

Propriedade Tipo Obrigatório Descrição
NamestringRecomendadoIdentificador do veículo apresentado nos resultados.
EmailstringNãoContacto opcional do motorista ou veículo.
GroupstringNãoCampo de agrupamento opcional, como equipa, depósito ou região.
SpeedintNãoSubstituição opcional da velocidade. Se definido como 0, é utilizada a velocidade rodoviária predefinida.
MaxStopsintNãoNúmero máximo de paragens por rota para o veículo.
MaxWeightdoubleNãoCapacidade máxima de peso do veículo.
MaxSkidsintNãoCapacidade máxima de pallets/skids do veículo.
MaxVolumedoubleNãoCapacidade máxima de volume do veículo.
MaxMinutesintNãoDuração máxima da rota para o veículo.
FuelCostdoubleNãoParâmetro de custo opcional utilizado por alguns modos de otimização.
OnTheRoadboolNãoSe true, uma rota de vários dias pode continuar a partir da localização de fim do dia anterior, em vez de regressar ao ponto de partida original.
Tinstring (date-time)NãoData/hora a partir da qual o veículo está disponível.
Toutstring (date-time)NãoData/hora até à qual o veículo está disponível.
StartLocationLocationNãoDepósito de início ou posição inicial opcional do veículo.
FinishLocationLocationNãoDepósito de fim ou posição final opcional do veículo.
RolesstringNãoCadeia opcional de perfis que pode ser correspondida com condições da paragem.
TransportTypeint (enum)NãoModo de transporte, como carro, camião, autocarro, motociclo, pedestre, trotinete ou bicicleta.
ExcludeTollsboolNãoEspecifica se as estradas com portagem devem ser evitadas.
ExcludeHighwaysboolNãoEspecifica se as autoestradas devem ser evitadas.
UseTruckRouteboolNãoEspecifica se as rotas para camiões devem ser preferidas ou permitidas.
WidthfloatNãoLargura do veículo em metros.
HeightfloatNãoAltura do veículo em metros.
LengthfloatNãoComprimento do veículo em metros.
AxleLoadfloatNãoCarga por eixo do veículo em toneladas métricas.
AxleCountintNãoNúmero de eixos.
Exemplo da funcionalidade OnTheRoad de veículo na API TrackRoad
Exemplo: Comportamento diário da rota com OnTheRoad ativado versus desativado.

Location

Cada localização deve incluir LatLong sempre que possível. Se faltarem coordenadas, Address é obrigatório para que a TrackRoad possa geocodificar a paragem.

Propriedade Tipo Obrigatório Descrição
MatchCodeint (enum)NãoCódigo de qualidade de correspondência da geocodificação.
NamestringNãoRótulo da paragem mostrado nos resultados.
DeliverystringNãoNome da localização de entrega associada ou rótulo do cliente.
DeliveryNonStopboolNãoDetermina se a entrega associada tem de ocorrer imediatamente após a paragem atual.
KeepSameOrderboolNãoSe true, preserva a ordem relativa definida no pedido.
VehiclestringNãoPré-atribuição opcional a um veículo específico pelo nome.
DescriptionstringNãoNotas ou descrição opcionais.
PhonestringNãoNúmero de telefone de contacto opcional.
LatLongLatLongCondicionalEntrada de coordenadas preferida. Obrigatória se Address não for fornecido.
AddressAddressCondicionalMorada utilizada para geocodificação quando LatLong não é fornecido.
PriorityintNãoIndicação de prioridade para a otimização.
WaitintNãoTempo de serviço ou de espera na paragem.
VolumedoubleNãoProcura de volume consumida da capacidade do veículo.
WeightdoubleNãoProcura de peso consumida da capacidade do veículo.
SkidsintNãoProcura de skids consumida da capacidade do veículo.
TimeConstraintArrivalstring (date-time)NãoValor principal de chegada da janela temporal.
TimeConstraintDeparturestring (date-time)NãoValor principal de partida da janela temporal.
TimeConstraintArrival2string (date-time)NãoValor opcional de chegada da segunda janela temporal.
TimeConstraintDeparture2string (date-time)NãoValor opcional de partida da segunda janela temporal.
LocationTypeint (enum)Não0 = Midway, 1 = Start, 2 = Finish, 3 = Delivery, 4 = MidwayDrop, 5 = Break.
CanArriveEarlyboolNãoSe false, não é permitida a chegada antes da janela temporal autorizada.
ConditionsstringNãoRegra de negócio ou condição de correspondência de perfil opcional.

LatLong

Propriedade Tipo Obrigatório Descrição
LatitudedoubleSimLatitude em graus (-90 a 90).
LongitudedoubleSimLongitude em graus (-180 a 180).

Address

Propriedade Tipo Obrigatório Descrição
StreetstringRecomendadoMorada.
CitystringRecomendadoCidade.
StatestringNãoEstado ou região.
PostalCodestringNãoCódigo postal.
CountrystringRecomendadoPaís.

Esquema da resposta#

Uma resposta com sucesso devolve DispatchResult contendo itens de rota por veículo e erros ou avisos opcionais.

DispatchResult

Propriedade Tipo Descrição
ItemsVehicleItem[]Itens de resultado por veículo contendo a rota atribuída.
ErrorsError[]Erros ou avisos opcionais.
Statusint (enum)Estado da operação: 0 = None, 1 = Success, 2 = Failed, 3 = SuccessWithErrors.

VehicleItem

Propriedade Tipo Descrição
VehicleVehicleO veículo associado a esta rota.
LocationsLocation[]Localizações ordenadas atribuídas a esse veículo.

Error

Propriedade Tipo Descrição
MessagestringMensagem de erro ou aviso legível por humanos.

Exemplos#

Os blocos de código de pedido e resposta de exemplo podem permanecer inalterados e não necessitam de localização.

{
  "RoutingService": 0,
  "DistanceUnit": 0,
  "RouteOptimize": 0,
  "DispatchMode": 0,
  "Vehicles": [
    {
      "Name": "Truck 1",
      "StartLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 1 },
      "FinishLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 2 }
    }
  ],
  "Locations": [
    { "Name": "Stop A", "LatLong": { "Latitude": 37.7897, "Longitude": -122.4011 }, "LocationType": 0 },
    { "Name": "Stop B", "LatLong": { "Latitude": 37.7810, "Longitude": -122.4110 }, "LocationType": 0 }
  ]
}

REST request examples (multiple languages)#

curl -X POST "https://trackservice.trackroad.com/rest/dispatch" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_TRACKSERVICEKEY" \
  -d '{
    "RoutingService": 0,
    "DistanceUnit": 0,
    "RouteOptimize": 0,
    "DispatchMode": 0,
    "Vehicles": [
      {
        "Name": "Truck 1",
        "StartLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 1 },
        "FinishLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 2 }
      }
    ],
    "Locations": [
      { "Name": "Stop A", "LatLong": { "Latitude": 37.7897, "Longitude": -122.4011 }, "LocationType": 0 },
      { "Name": "Stop B", "LatLong": { "Latitude": 37.7810, "Longitude": -122.4110 }, "LocationType": 0 }
    ]
  }'

SOAP request examples (multiple languages)#

SOAP uses the same DispatchSpecification model, but it’s wrapped in a SOAP envelope and authenticated via SessionIDHeader (SessionID = TrackServiceKey).

curl -X POST "https://trackservice.trackroad.com/TrackService.asmx" \
  -H "Content-Type: text/xml; charset=utf-8" \
  -H "SOAPAction: http://trackservice.trackroad.com/Dispatch" \
  -d @dispatch-soap.xml

SOAP: Raw request (Envelope + SessionIDHeader)#

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <SessionIDHeader xmlns="http://trackservice.trackroad.com/">
      <SessionID>YOUR_TRACKSERVICEKEY</SessionID>
    </SessionIDHeader>
  </soap:Header>
  <soap:Body>
    <Dispatch xmlns="http://trackservice.trackroad.com/">
      <specification>
        <RoutingService>0</RoutingService>
        <DistanceUnit>0</DistanceUnit>
        <RouteOptimize>0</RouteOptimize>
        <DispatchMode>0</DispatchMode>
        <Vehicles></Vehicles>
        <Locations></Locations>
      </specification>
    </Dispatch>
  </soap:Body>
</soap:Envelope>

JSON: Response example#

{
  "Items": [
    {
      "Vehicle": { "Name": "Truck 1" },
      "Locations": [
        { "Name": "Stop A", "LatLong": { "Latitude": 37.7897, "Longitude": -122.4011 } },
        { "Name": "Stop B", "LatLong": { "Latitude": 37.7810, "Longitude": -122.4110 } }
      ]
    }
  ],
  "Errors": [],
  "Status": 1
}

SOAP: Response example#

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <DispatchResponse xmlns="http://trackservice.trackroad.com/">
      <DispatchResult>
        <Status>1</Status>
        <Errors />

        <Items>
          <VehicleItem>
            <Vehicle>
              <Name>Truck 1</Name>
            </Vehicle>

            <Locations>
              <Location>
                <Name>Stop A</Name>
                <LocationType>0</LocationType>
                <LatLong>
                  <Latitude>37.7897</Latitude>
                  <Longitude>-122.4011</Longitude>
                </LatLong>
              </Location>

              <Location>
                <Name>Stop B</Name>
                <LocationType>0</LocationType>
                <LatLong>
                  <Latitude>37.7810</Latitude>
                  <Longitude>-122.4110</Longitude>
                </LatLong>
              </Location>
            </Locations>
          </VehicleItem>
        </Items>

      </DispatchResult>
    </DispatchResponse>
  </soap:Body>
</soap:Envelope>

Erros comuns#

  • REST 401 / Unauthorized: X-API-Key em falta ou inválido.
  • REST 403 / Forbidden: A chave é válida, mas está bloqueada, expirou ou não tem crédito.
  • Erros de validação: Uma paragem não tem LatLong nem Address, ou as coordenadas são inválidas.
  • Erros de autenticação SOAP: SessionIDHeader em falta ou inválido, ou SessionID vazio.

Boas práticas

  • Prefira LatLong para evitar ambiguidades de geocodificação e melhorar a consistência do roteamento.
  • Utilize StartLocation e FinishLocation para roteamento baseado em depósito e ETAs mais precisos.
  • Adicione restrições de capacidade, como peso, volume e skids, para uma atribuição de rotas mais realista.
  • Utilize janelas temporais quando as paragens tiverem de ser visitadas dentro de horários de clientes ou operacionais.
  • Para SOAP, utilize a TrackServiceKey em SessionIDHeader. O antigo fluxo de login não é necessário.

FAQ#

O que faz a API Dispatch?
O Dispatch otimiza paragens em vários veículos e devolve rotas ordenadas por veículo com saída de horários e distâncias.
Como faço a autenticação no Dispatch REST e SOAP?
O REST utiliza a sua TrackServiceKey no cabeçalho X-API-Key. O SOAP utiliza a mesma TrackServiceKey em SessionIDHeader como SessionID.
Preciso de LatLong ou Address para as paragens?
LatLong é preferível. Se LatLong não for fornecido, Address é obrigatório para que a TrackRoad possa geocodificar a paragem.

Pronto para otimizar rotas?

Gere a sua chave API e comece a integrar o Dispatch para otimização de rotas multi-veículo usando REST ou SOAP.

Obter chave API WSDL SOAP Swagger UI