Hoje vamos adicionar alguns pontos na rota que criamos nos últimos posts. O método para adicionar esses pontos será adicionar uma camada GeoJSON, adicionando um marcador e pop-up com algumas informações.
1. Os marcadores
Para os locais, usaremos marcadores de círculo. Para criar um único marcador, use:
var circle = L.circleMarker([-20.1438, -44.1301], { radius: 15 });
Um marcador de círculo é adicionado ao mapa como de costume:
circle.addTo(map);
Para adicioná-los aos nossos recursos GeoJSON, a sintaxe será um pouco diferente, já que estamos processando-os em um loop.
2. Adicionando a camada com marcadores de círculo e pop-up
Para adicionar os marcadores, percorremos o conjunto de dados usando a opção onEachFeature e também adicionamos um pop-up para exibir elevação, latitude e longitude:
var towns = L.geoJSON(trail_stops, {pointToLayer: function(feature, latlng){ return L.circleMarker(latlng, {radius: 5, color: '#00008b', fillOpacity: 0.5, }); }, onEachFeature: function( feature, layer){ var townName = feature.properties.feature_na; var elevation = feature.properties.elev_in_m; var lat = feature.properties.prim_lat_d; var lon = feature.properties.prim_lon_1; layer.bindPopup('Name: ' + townName + '
Elevation: ' + elevation + '
Lat/Lon: ' + lat + ' , ' + lon); layer.on('mouseover', function() {layer.openPopup();}); layer.on('mouseout', function() {layer.closePopup();}); } }); towns.addTo(map);
A camada GeoJSON é criada e, usamos a opção pointToLayer para criar um circleMarker para cada recurso.
Na sequencia, criamos variáveis para conter os atributos do pop-up e, em seguida, vinculamos o pop-up ao recurso. Poderíamos ter usado as propriedades do recurso diretamente na instrução bindPopup, mas atribuí-las aos variables facilita um pouco a leitura do código.
Por fim, adicionamos os eventos do mouse para exibir e remover o pop-up no mouse e, em seguida, adicionamos a camada ao mapa.
O resultado é assim:
3. O Código
Veja o código JavaScript completo:
var map = L.map(document.getElementById('mapDIV'), { center: [-20.1438, -44.1301], zoom: 11 }); // Base maps var basetopo = L.tileLayer('https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/WMTS/tile/1.0.0/USGSTopo/default/default028mm/{z}/{y}/{x}.png', {}); var baserelief = L.tileLayer('https://tile.opentopomap.org/{z}/{x}/{y}.png', {}); basetopo.addTo(map); baserelief.addTo(map); var thetrail = L.geoJSON(trail, { color: '#800000', weight: 3, dashArray: '12 8 12', }); thetrail.bindTooltip('Trilha Brumadinho') thetrail.addTo(map); var towns = L.geoJSON(trail_stops, {pointToLayer: function(feature, latlng){ return L.circleMarker(latlng, {radius: 5, color: '#00008b', fillOpacity: 0.5}); }, onEachFeature: function( feature, layer){ var elevation = feature.properties.elev_in_m; var lat = feature.properties.prim_lat_d; var lon = feature.properties.prim_lon_1; layer.bindPopup('
Elevation: ' + elevation + '
Lat/Lon: ' + lat + ' , ' + lon); layer.on('mouseover', function() {layer.openPopup();}); layer.on('mouseout', function() {layer.closePopup();}); } }); towns.addTo(map); var baselayers = { 'Shaded Relief': baserelief, 'National Map': basetopo }; var overlays = { 'The Trail': thetrail, 'Towns': towns }; L.control.layers(baselayers, overlays).addTo(map); // Add scalebar var scale = L.control.scale() scale.addTo(map) // Add attribution map.attributionControl.addAttribution('National Map Topo'); map.attributionControl.addAttribution('OpenTopoMap');
Abaixo está o HTML que configura o mapa e inclui o arquivo JavaScript (leaflet_day5.js), que contém o código descrito acima, criado para deixar o código mais legível.
<!DOCTYPE html> <head> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.4.0/dist/leaflet.css" integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" crossorigin=""/> <script src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js" integrity="sha512-QVftwZFqvtRNi0ZyCtsznlKSWOStnDORoefr1enyq5mVL4tmKB3S/EnC3rRJcxCPavG10IcrVGSmPh6Qw5lwrg==" crossorigin=""></script> <script src="rails.geojson"></script> <script src="trail_stops.geojson"></script> <style> #mapDIV{ height: 700px; width: 700px; border: solid 1px black; } </style> </head> <body> <div id='mapDIV'></div> <script src="leaflet_day5.js"></script> </body> </html>
Se você quiser baixar o código completo (HTML, JS, JSON) basta clicar aqui!
4. YouTube
Se você quiser, pode ver o processo detalhado acima no YouTube: