Hoje vamos usar o Turf.js para calcular a distância entre dois pontos ao longo da trilha. O Turf.js é classificado como “Análise geoespacial avançada para navegadores e Node.js.” A distância calculada é uma distância em linha reta em vez de quilômetros de trilha reais.

1. Incluindo o Turf.js

Para calcular a distância, precisamos incluir o Turf.js em nosso projeto. Em vez de instalá-lo localmente, basta adicionar essa linha ao cabeçalho do seu HTML:

  <script src='https://npmcdn.com/@turf/turf/turf.min.js'></script>

O Turf.js vem como um único arquivo JavaScript e é bem grande. Se você planeja usá-lo regularmente, considere fazer uma compilação personalizada que contenha apenas os recursos necessários. Você pode encontrar informações sobre como fazer isso no site do Turf.js.

2. Configurando o HTML

Precisamos adicionar dois dropdowns (selecionados): uma para o local “de” e outra para o local “para”. Também criamos um botão “calcular” e um div para conter o resultado:

Calculate distance from: 
    <select id='fromBox'>
    </select>
to: 
    <select id='toBox'>
    </select>
    <input type="button" id="calculate" value="Calculate">
    <div id="distanceResult"></div>

3. Calculando e exibindo a distância

Primeiro, configuramos os dois campos dropdown com a lista de marcos (markers). Para calcular a distância, obtemos as informaçõe “De” e “Para” e passamos as coordenadas como objetos turf.point para a função de distância do Turf.js.

  fromBox = document.getElementById('fromBox');
  toBox = document.getElementById('toBox');
  var featuremap = {};
  for (var i = 0; i < trail_stops['features'].length ; i++){
      feature = trail_stops['features'][i];
      //console.log(feature['properties']['name']);
      featuremap[feature['properties']['name']] = feature['properties'];
      var fromopt = document.createElement('option');
      fromopt.value = feature['properties']['name'];
      fromopt.innerHTML = feature['properties']['name'];
      fromBox.appendChild(fromopt);
      var toopt = document.createElement('option');
      toopt.value = feature['properties']['name'];
      toopt.innerHTML = feature['properties']['name'];
      toBox.appendChild(toopt);
  }

  document.getElementById('calculate').onclick = calculateDistance;

  function calculateDistance(){
      from = fromBox.value;
      to = toBox.value;
      fromobj = featuremap[from];
      toobj = featuremap[to];
      var fromPt = turf.point([fromobj['prim_lon_1'], fromobj['prim_lat_d']]);
      var toPt = turf.point([toobj['prim_lon_1'], toobj['prim_lat_d']]);
      var distance = turf.distance(fromPt, toPt, {units: 'kilometers'});
      console.log(distance)
      var distanceMiles = distance * 0.6214 
      
      document.getElementById('distanceResult').innerHTML = 'Distance is: ' + distance.toFixed(2) +
          ' kilometers (' + distanceMiles.toFixed(2) + ' miles)';
  }

Agora vou explicar o passo a passo do código acima:

  • As linhas 1 a 16 preenchem os campos dropdown usando os dados do arquivo GeoJSON trail_stops.
  • A linha 18 configura o botão calcular para chamar a função calculateDistance (linhas 20 a 33).
  • Nas linhas 21-26, obtemos os marcadores "de"/"para" e usando o featuremap, obtemos a latitude e a longitude para criar dois objetos turf.point. O aviso turf.point é criado especificando a longtiude (valor x) primeiro.
  • A linha 27 calcula a distância e a linha 28 registra-a no console.
  • A linha 29 converte de quilômetros em milhas.
  • As linhas 31 a 32 definem o texto para a div distanceResult.
  • Por último calcula a distância e nos retorna o resultado em quilômetros e milhas, conforme a imagem abaixo:



4. O Código

Para obter o código completo, clique aqui.