{"id":8111,"date":"2019-04-08T07:30:50","date_gmt":"2019-04-08T10:30:50","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=8111"},"modified":"2020-09-04T17:00:19","modified_gmt":"2020-09-04T20:00:19","slug":"introducao-ao-leaflet-calculando-distancia-parte-9","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2019\/04\/08\/introducao-ao-leaflet-calculando-distancia-parte-9\/","title":{"rendered":"Introdu\u00e7\u00e3o ao Leaflet \u2013 Calculando dist\u00e2ncia"},"content":{"rendered":"<p>Hoje vamos usar o Turf.js para calcular a dist\u00e2ncia entre dois pontos ao longo da trilha. O Turf.js \u00e9 classificado como &#8220;An\u00e1lise geoespacial avan\u00e7ada para navegadores e Node.js.&#8221; A dist\u00e2ncia calculada \u00e9 uma dist\u00e2ncia em linha reta em vez de quil\u00f4metros de trilha reais.<\/p>\n<p><strong>1. Incluindo o Turf.js<\/strong><\/p>\n<p>Para calcular a dist\u00e2ncia, precisamos incluir o Turf.js em nosso projeto. Em vez de instal\u00e1-lo localmente, basta adicionar essa linha ao cabe\u00e7alho do seu HTML:<\/p>\n<pre>\r\n&nbsp;&nbsp;&lt;script&nbsp;src='https:\/\/npmcdn.com\/@turf\/turf\/turf.min.js'&gt;&lt;\/script&gt;\r\n<\/pre>\n<p>O Turf.js vem como um \u00fanico arquivo JavaScript e \u00e9 bem grande. Se voc\u00ea planeja us\u00e1-lo regularmente, considere fazer uma compila\u00e7\u00e3o personalizada que contenha apenas os recursos necess\u00e1rios. Voc\u00ea pode encontrar informa\u00e7\u00f5es sobre como fazer isso no site do Turf.js.<\/p>\n<p><strong>2. Configurando o HTML<\/strong><\/p>\n<p>Precisamos adicionar dois dropdowns (selecionados): uma para o local \u201cde\u201d e outra para o local \u201cpara\u201d. Tamb\u00e9m criamos um bot\u00e3o &#8220;calcular&#8221; e um div para conter o resultado:<\/p>\n<pre>\r\nCalculate&nbsp;distance&nbsp;from:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;select&nbsp;id='fromBox'&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/select&gt;\r\nto:&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;select&nbsp;id='toBox'&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/select&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type=\"button\"&nbsp;id=\"calculate\"&nbsp;value=\"Calculate\"&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;id=\"distanceResult\"&gt;&lt;\/div&gt;\r\n<\/pre>\n<p><strong>3. Calculando e exibindo a dist\u00e2ncia<\/strong><\/p>\n<p>Primeiro, configuramos os dois campos dropdown com a lista de marcos (markers). Para calcular a dist\u00e2ncia, obtemos as informa\u00e7\u00f5e &#8220;De&#8221; e &#8220;Para&#8221; e passamos as coordenadas como objetos <em>turf.point<\/em> para a fun\u00e7\u00e3o de dist\u00e2ncia do Turf.js.<\/p>\n<pre>\r\n&nbsp;&nbsp;fromBox&nbsp;=&nbsp;document.getElementById('fromBox');\r\n&nbsp;&nbsp;toBox&nbsp;=&nbsp;document.getElementById('toBox');\r\n&nbsp;&nbsp;var&nbsp;featuremap&nbsp;=&nbsp;{};\r\n&nbsp;&nbsp;for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;trail_stops['features'].length&nbsp;;&nbsp;i++){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feature&nbsp;=&nbsp;trail_stops['features'][i];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/console.log(feature['properties']['name']);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;featuremap[feature['properties']['name']]&nbsp;=&nbsp;feature['properties'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;fromopt&nbsp;=&nbsp;document.createElement('option');\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fromopt.value&nbsp;=&nbsp;feature['properties']['name'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fromopt.innerHTML&nbsp;=&nbsp;feature['properties']['name'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fromBox.appendChild(fromopt);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;toopt&nbsp;=&nbsp;document.createElement('option');\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toopt.value&nbsp;=&nbsp;feature['properties']['name'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toopt.innerHTML&nbsp;=&nbsp;feature['properties']['name'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toBox.appendChild(toopt);\r\n&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;document.getElementById('calculate').onclick&nbsp;=&nbsp;calculateDistance;\r\n\r\n&nbsp;&nbsp;function&nbsp;calculateDistance(){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;=&nbsp;fromBox.value;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;=&nbsp;toBox.value;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fromobj&nbsp;=&nbsp;featuremap[from];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toobj&nbsp;=&nbsp;featuremap[to];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;fromPt&nbsp;=&nbsp;turf.point([fromobj['prim_lon_1'],&nbsp;fromobj['prim_lat_d']]);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;toPt&nbsp;=&nbsp;turf.point([toobj['prim_lon_1'],&nbsp;toobj['prim_lat_d']]);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;distance&nbsp;=&nbsp;turf.distance(fromPt,&nbsp;toPt,&nbsp;{units:&nbsp;'kilometers'});\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(distance)\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;distanceMiles&nbsp;=&nbsp;distance&nbsp;*&nbsp;0.6214&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('distanceResult').innerHTML&nbsp;=&nbsp;'Distance&nbsp;is:&nbsp;'&nbsp;+&nbsp;distance.toFixed(2)&nbsp;+\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&nbsp;kilometers&nbsp;('&nbsp;+&nbsp;distanceMiles.toFixed(2)&nbsp;+&nbsp;'&nbsp;miles)';\r\n&nbsp;&nbsp;}\r\n<\/pre>\n<p>Agora vou explicar o passo a passo do c\u00f3digo acima:<\/p>\n<ul>\n<li>As linhas 1 a 16 preenchem os campos dropdown usando os dados do arquivo GeoJSON <em>trail_stops<\/em>.<\/li>\n<li>A linha 18 configura o bot\u00e3o calcular para chamar a fun\u00e7\u00e3o calculateDistance (linhas 20 a 33).<\/li>\n<li>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 \u00e9 criado especificando a longtiude (valor x) primeiro.<\/li>\n<li>A linha 27 calcula a dist\u00e2ncia e a linha 28 registra-a no console.<\/li>\n<li>A linha 29 converte de quil\u00f4metros em milhas.<\/li>\n<li>As linhas 31 a 32 definem o texto para a div <em>distanceResult<\/em>.<\/li>\n<li>Por \u00faltimo calcula a dist\u00e2ncia e nos retorna o resultado em quil\u00f4metros e milhas, conforme a imagem abaixo:<\/li>\n<\/ul>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/04\/leaflet_map9.png\" alt=\"\" width=\"709\" height=\"747\" class=\"aligncenter size-full wp-image-8115\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/04\/leaflet_map9.png 709w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/04\/leaflet_map9-285x300.png 285w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/04\/leaflet_map9-600x632.png 600w\" sizes=\"auto, (max-width: 709px) 100vw, 709px\" \/><br \/>\n<\/center><\/p>\n<p><strong>4. O C\u00f3digo<\/strong><\/p>\n<p>Para obter o c\u00f3digo completo, <a href=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2019\/04\/leaflet_day9.zip\" rel=\"noopener noreferrer\" target=\"_blank\">clique aqui<\/a>.<\/p>\n<p><strong>5. YouTube<\/strong><\/p>\n<p>Se voc\u00ea quiser, pode ver esse conte\u00fado no YouTube:<\/p>\n<p><center><br \/>\n<iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/ua5XGMlUKiU\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoje vamos usar o Turf.js para calcular a dist\u00e2ncia entre dois pontos ao longo da trilha. O Turf.js \u00e9 classificado como &#8220;An\u00e1lise geoespacial avan\u00e7ada para navegadores e Node.js.&#8221; A dist\u00e2ncia calculada \u00e9 uma dist\u00e2ncia em linha reta em vez de&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2019\/04\/08\/introducao-ao-leaflet-calculando-distancia-parte-9\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":5069,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[140,293],"class_list":["post-8111","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-javascript","tag-leaflet"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=8111"}],"version-history":[{"count":5,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8111\/revisions"}],"predecessor-version":[{"id":8944,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8111\/revisions\/8944"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/5069"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=8111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=8111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=8111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}