DEV Community

WoneyBranga
WoneyBranga

Posted on

API de roteamento com Valhalla

A algum tempo atras, precisei implementar uma ferramenta para gerar rotas rodoviárias entre 2 pontos de interesse.
Em um primeiro momento, pensei no Google Maps API, mas este é um serviço pago e então procurei alternativas OPEN SOURCE que atencessem a necessidade e foi aí que conheci o Valhalla.

O que é o Valhalla?

O Valhalla é um mecanismo de roteamento OPEN SOURCE.

O que ele nos permite:

  • Geração de rotas em varias modalidades:
    • Auto;
    • pedestrian;
    • truck;
    • etc;
  • Geração de rotas evitando determinados caminhos;
  • Utilização direta no QGIS com o uso de pluguin;
  • Utilização no LeafletJS para uma interface interativa em mapa.

Uma demo da API em funcionamento pode ser vista na pagina DEMO

a documentação completa da API pode ser vista em Documentação

Abaixo um exemplo de docker-compose para a implementação de um servidor de maneira rápida.
Lembrando que na primeira execução, o processo é bem demorado pois ele irá baixar o mapa de rodovias e preparar os dados para entao deixar a API funcional.

version: '3'
services:
 valhalla:
    image: ghcr.io/gis-ops/docker-valhalla/valhalla:3.4.0
    environment:
      - tile_urls=https://download.geofabrik.de/south-america/brazil-latest.osm.pbf
      - use_tiles_ignore_pbf=True
      - force_rebuild=False
      - force_rebuild_elevation=False
    ports:
      - 8002:8002
    volumes:
      - /opt/valhalla/custom_files/:/custom_files
    restart: always
Enter fullscreen mode Exit fullscreen mode

abaixo um exemplo de estruturação da chamada com os parametros que utilizo.

$queryParams = ['json' => json_encode([
        'locations' => [
            ['lat' => $lat_a, 'lon' => $long_a],
            ['lat' => $lat_b, 'lon' => $long_b]
        ],
        'costing' => 'pedestrian', 
        'narrative' => false,
        'id' => 'my_second_route',
        //'avoid_locations' => $shapeToIgnore,//para rotas alternativas
        'directions_options' => [
                    'units' => 'meters', 
                    'language' => 'pt-BR'
         ],
    ])];

    $response = Http::get('http://1.2.3.4:8002/route', $queryParams);
Enter fullscreen mode Exit fullscreen mode

Top comments (0)