{"id":8236,"date":"2019-04-30T07:30:12","date_gmt":"2019-04-30T10:30:12","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=8236"},"modified":"2019-04-25T16:42:10","modified_gmt":"2019-04-25T19:42:10","slug":"criando-um-heatmap-com-o-leaflet","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2019\/04\/30\/criando-um-heatmap-com-o-leaflet\/","title":{"rendered":"Criando um heatmap com o Leaflet"},"content":{"rendered":"<p>Um Heatmap (ou mapa de calor) \u00e9 uma representa\u00e7\u00e3o gr\u00e1fica de dados em que os valores individuais contidos em uma matriz s\u00e3o representados como cores. &#8220;Mapa de calor&#8221; \u00e9 um termo mais recente, por\u00e9m as matrizes de sombreamento existem h\u00e1 mais de um s\u00e9culo.<\/p>\n<p>Voc\u00ea pode criar um heatmap para apresentar suas informa\u00e7\u00f5es na internet com o Leaflet. O plugin Leaflet.heat \u00e9 uma forma simples e r\u00e1pida de voc\u00ea agrupar pontos em uma grade.<\/p>\n<p><strong>1. Instala\u00e7\u00e3o<\/strong><\/p>\n<p>Para incluir o plugin, basta usar a <a href=\"https:\/\/github.com\/Leaflet\/Leaflet.heat\/blob\/gh-pages\/dist\/leaflet-heat.js\" rel=\"noopener\" target=\"_blank\">leaflet-heat.js<\/a> a partir da pasta dist:<\/p>\n<pre>\r\n&lt;script src=\"leaflet-heat.js\"&gt;&lt;\/script&gt;\r\n<\/pre>\n<p><strong>2. Uso do plugin<\/strong><\/p>\n<p>Para usar o plugin voc\u00ea precisa instanciar uma classe do tipo L.heatLayer:<\/p>\n<pre>\r\nvar heat = L.heatLayer([\r\n\t[50.5, 30.5, 0.2], \/\/ lat, lng, intensity\r\n\t[50.6, 30.4, 0.5],\r\n\t...\r\n], {radius: 25}).addTo(map);\r\n<\/pre>\n<p><strong>3. Par\u00e2metros<\/strong><\/p>\n<p>Quando voc\u00ea est\u00e1 criando seu heatmap, como demonstrado acima, voc\u00ea precisar utilizar a classe L.heatLayer, por\u00e9m ela possui algumas op\u00e7\u00f5es de configura\u00e7\u00f5es que voc\u00ea precisa ter conhecimento, e \u00e9 o que vamos mostrar agora.<\/p>\n<p><strong>minOpacity <\/strong>&#8211; Opacidade m\u00ednima de in\u00edcio do heatmap<br \/>\n<strong>maxZoom <\/strong>&#8211; N\u00edvel de zoom em que os pontos atingem a intensidade m\u00e1xima (conforme a intensidade \u00e9 dimensionada com zoom)<br \/>\n<strong>max <\/strong>&#8211; Intensidade m\u00e1xima do ponto (1.0 por padr\u00e3o)<br \/>\n<strong>radius <\/strong>&#8211; raio de cada &#8220;ponto&#8221; do mapa de calor (25 por padr\u00e3o)<br \/>\n<strong>blur <\/strong>&#8211; quantidade de desfoque (15 por padr\u00e3o)<br \/>\n<strong>gradiente <\/strong>&#8211; Configura\u00e7\u00e3o do gradiente, por exemplo {0.4: &#8216;blue&#8217;, 0.65: &#8216;lime&#8217;, 1: &#8216;red&#8217;}<\/p>\n<p>Cada ponto no array de entrada pode ser um array [50.5, 30.5, 0.5] ou um objeto Leaflet LatLng.<\/p>\n<p>O terceiro argumento opcional em cada ponto LatLng (altitude) representa a intensidade do ponto. A menos que a op\u00e7\u00e3o max seja especificada, a intensidade deve variar entre 0.0 e 1.0.<\/p>\n<p><strong>4. M\u00e9todos<\/strong><\/p>\n<p><strong>setOptions(op\u00e7\u00f5es)<\/strong> : Define novas op\u00e7\u00f5es do mapa de calor e redesenha-o.<br \/>\n<strong>addLatLng(latlng)<\/strong> : Adiciona um novo ponto ao mapa de calor e o redesenha.<br \/>\n<strong>setLatLngs(latlngs)<\/strong> : Redefine os dados do mapa de calor e os redesenha.<br \/>\n<strong>redraw()<\/strong> : Redesenha o mapa de calor.<\/p>\n<p><strong>5. O C\u00f3digo<\/strong><\/p>\n<pre>\r\n&lt;!DOCTYPE&nbsp;html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;Leaflet.heat&nbsp;demo&lt;\/title&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;link&nbsp;rel=\"stylesheet\"&nbsp;href=\"http:\/\/cdn.leafletjs.com\/leaflet\/v0.7.7\/leaflet.css\"&nbsp;\/&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type=\"text\/javascript\"&nbsp;src=\"http:\/\/gc.kis.v2.scr.kaspersky-labs.com\/11F4BF7B-5932-2746-A043-363BD8528A2C\/main.js\"&nbsp;charset=\"UTF-8\"&gt;&lt;\/script&gt;&lt;script&nbsp;src=\"http:\/\/cdn.leafletjs.com\/leaflet\/v0.7.7\/leaflet.js\"&gt;&lt;\/script&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;style&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#map&nbsp;{&nbsp;width:&nbsp;800px;&nbsp;height:&nbsp;600px;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body&nbsp;{&nbsp;font:&nbsp;16px\/1.4&nbsp;\"Helvetica&nbsp;Neue\",&nbsp;Arial,&nbsp;sans-serif;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ghbtns&nbsp;{&nbsp;position:&nbsp;relative;&nbsp;top:&nbsp;4px;&nbsp;margin-left:&nbsp;5px;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;{&nbsp;color:&nbsp;#0077ff;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/style&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;div&nbsp;id=\"map\"&gt;&lt;\/div&gt;\r\n\r\n&lt;script&nbsp;src=\"js\/leaflet-heat.js\"&gt;&lt;\/script&gt;\r\n&lt;script&nbsp;src=\"http:\/\/leaflet.github.io\/Leaflet.markercluster\/example\/realworld.10000.js\"&gt;&lt;\/script&gt;\r\n\r\n&lt;script&gt;\r\n\r\nvar&nbsp;map&nbsp;=&nbsp;L.map('map').setView([-37.87,&nbsp;175.475],&nbsp;12);\r\n\r\nvar&nbsp;tiles&nbsp;=&nbsp;L.tileLayer('http:\/\/{s}.tile.osm.org\/{z}\/{x}\/{y}.png',&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;attribution:&nbsp;'&copy;&nbsp;&lt;a&nbsp;href=\"http:\/\/osm.org\/copyright\"&gt;OpenStreetMap&lt;\/a&gt;&nbsp;contributors',\r\n}).addTo(map);\r\n\r\naddressPoints&nbsp;=&nbsp;addressPoints.map(function&nbsp;(p)&nbsp;{&nbsp;return&nbsp;[p[0],&nbsp;p[1]];&nbsp;});\r\n\r\nvar&nbsp;heat&nbsp;=&nbsp;L.heatLayer(addressPoints).addTo(map);\r\n\r\n&lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>Fonte: <a href=\"https:\/\/github.com\/Leaflet\/Leaflet.heat\" rel=\"noopener\" target=\"_blank\">GitHub<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um Heatmap (ou mapa de calor) \u00e9 uma representa\u00e7\u00e3o gr\u00e1fica de dados em que os valores individuais contidos em uma matriz s\u00e3o representados como cores. &#8220;Mapa de calor&#8221; \u00e9 um termo mais recente, por\u00e9m as matrizes de sombreamento existem h\u00e1&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2019\/04\/30\/criando-um-heatmap-com-o-leaflet\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":5268,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[339,140,293],"class_list":["post-8236","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-heatmap","tag-javascript","tag-leaflet"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8236","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=8236"}],"version-history":[{"count":5,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8236\/revisions"}],"predecessor-version":[{"id":8241,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8236\/revisions\/8241"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/5268"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=8236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=8236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=8236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}