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: