Desenvolva o seu próprio mapa (de viagens) com o Mapbox (Nível iniciante)

CartografiaBlogueDesenvolvimentoViagemMapbox
4 years ago
Imagem do site do Mapbox e do seu logótipo

Sobre o que é este artigo?

No meu artigo sobre os melhores ferramentas de integração de mapas, apresentei quatro soluções diferentes para adicionar um mapa a um site ou blog. Entre essas soluções, encontra-se Mapbox, uma tecnologia que permite exibir mapas num site web, exatamente como faz o serviço Google Maps.

Como veremos, fazer uma integração personalizada de mapa é ao mesmo tempo a mais complexa, mas também a menos dispendiosa se a fizer por conta própria. Além disso, é a solução que lhe permitirá alcançar o resultado mais sofisticado, adaptado ao seu estilo, se tiver tempo para se dedicar a isso.

Esta nota acima não é por acaso. Quando desenvolvi o TraveledMap, fiz isso com o objetivo desimplificar a utilização de tecnologias como Mapbox e Google Maps, para pessoas que não têm tempo ou conhecimentos técnicos para o fazer.
É importante notar que utilizei principalmente o Mapbox com React, um framework que acelera o desenvolvimento, tornando o site mais responsivo e, muitas vezes, mais fiável (com menos erros). No entanto, é muito provável que o seu caso de utilização esteja mais focado numa integração do Mapbox em Javascript puro e simples. Por isso, explicarei como integrar um mapa com o Mapboxsem framework  e com especial atenção aodesenvolvimento para um site WordPress.

Sumário



Criar o mapa

Para começar com o Mapbox, é necessário criar uma conta, caso contrário, não poderá exibir um mapa. Convido-o, portanto, a visitaro site deles  para criar uma conta. Assim que a conta for ativada, terá acesso ao seu dashboard, que contém uma informação particularmente importante:
O seu access token (que deve começar porpk.).

Este access token é uma chave necessária para identificá-lo quando quiser exibir um mapa. O objetivo é duplo:

  • Permite estabelecer a ligação entre o mapa e a sua conta, considerando assim as modificações que fez nos mapas da sua conta Mapbox. Pode, por exemplo, criar estilos personalizados através dostudio, que são privados por padrão e não poderiam ser encontrados se utilizasse a chave de outra pessoa.
  • Também permite contabilizar o número de mapas exibidos para fins estatísticos e de faturação.

Vamos a isso, vamos exibir o nosso primeiro mapa!
Vou explicar passo a passo como fazê-lo, mas não se preocupe, o código final está no final da página!


Abra o ficheiro que contém o código HTML da sua página ou, no WordPress, edite a página onde pretende adicionar o mapa, adicionando um bloco Custom HTML, e insira o seguinte conteúdo:

<script src="https://api.mapbox.com/mapbox-gl-js/v2.0.1/mapbox-gl.js"></script>
<link href="https://api.mapbox.com/mapbox-gl-js/v2.0.1/mapbox-gl.css" rel="stylesheet" />


<div id="map" style="height: 500px; width: 100%"></div>

<script>
    mapboxgl.accessToken = 'Não se esqueça de substituir isto pelo seu Access Token';
    var map = new mapboxgl.Map({
        container: 'map', // identificador do contêiner do mapa
        style: 'mapbox://styles/mapbox/light-v10', // URL do estilo a utilizar
        center: [2, 45], // posição padrão [lng, lat]
        zoom: 2 // zoom padrão
    });
</script>

Guarde, visualize e… tadaaaa 🎉 !
Deverá ver o mapa a aparecer na página.

O seu primeiro mapa no seu site com Mapbox

O seu primeiro mapa no seu site com Mapbox

Se analisarmos este código, temos:

  • Duas linhas para carregar os recursos necessários para o funcionamento do mapa:
    <script src="https://api.mapbox.com/mapbox-gl-js/v2.0.1/mapbox-gl.js"></script>
    <link href="https://api.mapbox.com/mapbox-gl-js/v2.0.1/mapbox-gl.css" rel="stylesheet" />
    
    Note que a posição dessas linhas influencia o tempo de carregamento da sua página. Elas devem idealmente ser colocadas no final do <body> do seu site.
  • Uma linha para inserir o mapa na página, contendo também o estilo do contêiner do mapa (500px de altura e 100% da largura):
    <div id="map" style="height: 500px; width: 100%"></div>
  • E por fim, um script no qual executamos o código que carrega o mapa:
    <script>
        mapboxgl.accessToken = 'Não se esqueça de substituir isto pelo seu Access Token';
        var map = new mapboxgl.Map({
            container: 'map', // identificador do contêiner do mapa
            style: 'mapbox://styles/mapbox/light-v10', // URL do estilo a utilizar
            center: [2, 45], // posição padrão [lng, lat]
            zoom: 2 // zoom padrão
        });
    </script>

Não se esqueça de substituir o texto pelo seu access token, caso contrário, o mapa não será carregado.
Os parâmetros passados para a funçãomapboxgl.Map podem ser alterados:

  • container: deve ser o mesmo que o ID do elemento onde o seu mapa será inserido (ver acima).
  • style: é o estilo do seu mapa. Pode personalizar os seus mapas criando novos no Mapbox Studio. Por padrão, há 4 ou 5 estilos disponíveis. Pré-visualize-os aqui.
  • center: é o centro padrão do mapa. O primeiro número (2) corresponde à longitude, e o segundo (45) corresponde à latitude.
  • zoom: é o nível de zoom padrão, que deve estar entre0, que é o nível de zoom mais afastado, e20, que é o mais próximo.
    No nível de zoom 20, você está ao nível de uma habitação, portanto, para visualizar viagens pelo mundo, o zoom ideal situa-se entre 1 e 3.


Adicionar Marcadores

Agora que tem o seu mapa, pode escolher o centro e o zoom padrão, mas também o estilo, vamos ver como adicionar informações nele (os seus viagens, por exemplo). Nesta etapa, vamos tentar definir uma lista de localizações e representá-las no mapa com marcadores.

A primeira etapa é adicionar um único marcador para entender como funciona. Adicionar um marcador ao mapa não é complicado, bastamanter o código para exibir o mapa e adicionar esta linha(logo antes do fechamento da tag<script />):

new mapboxgl.Marker()
    .setLngLat([2.35, 48.85])
    .addTo(map);

Esta linha vai adicionar um pino (um marcador) nas coordenadas 2.35, 48.85, ou seja, aproximadamente em Paris.

Exibição de um marcador em Paris

Exibição de um marcador em Paris


A segunda etapa será criar uma lista de viagens e exibir um marcador para cada uma delas.
Em JavaScript (a linguagem utilizada para escrever as linhas anteriores), podemos criar listas de objetos. Aqui, um objeto representará a nossa viagem e estará entre chaves{}, e a lista será representada por colchetes[]
Aqui está um exemplo com 3 viagens:

var trips = [{ 
    coordinates: [2.35, 48.85],
}, { 
    coordinates: [-74, 40.71],
}, { 
    coordinates: [-7.99, 31.62],
}]

Agora que temos uma lista, teremos que iterar (realizar uma operação para cada elemento da lista) sobre as viagens para exibi-las.
Pode então remover o exemplo anterior (new Mapboxgl.Marker) e adicionar este código no seu lugar:

trips.forEach(trip => {
    new mapboxgl.Marker()
       .setLngLat(trip.coordinates)
       .addTo(map);
});

Agora deve ver 3 marcadores no mapa!  Para adicionar os seus próprios viagens, basta substituir esses três objetos na lista pelos seus e pode adicionar quantos quiser.


Adicionar o nome das viagens

Uma evolução bastante óbvia dos nossos marcadores seria adicionar o nome da viagem. Vamos poder usar as popups do Mapbox para isso. As popups são bastante fáceis de usar, basta adicionar duas linhas ao código que exibe o marcador:

trips.forEach(trip => {
    new mapboxgl.Marker()
        .setLngLat(trip.coordinates)
        .setPopup(new mapboxgl.Popup({ anchor: 'top' }) // adiciona um popup
            .setHTML('<p>Viagem para Marrakech</p>'))
        .addTo(map);
});

Agora deve ver o nome de Marrakech a ser exibido numa pequena janela sob o marcador quando clicar nele.
Naturalmente, queremos que o nome correto seja exibido sob cada marcador, então vamos adicionar uma propriedade aos nossos objetos viagem:

var trips = [{ 
    coordinates: [2.35, 48.85],
    name: 'Paris'
}, { 
    coordinates: [-74, 40.71],
    name: 'Nova Iorque'
}, { 
    coordinates: [-7.99, 31.62],
    name: 'Marrakech'
}]

E vamos usá-la dinamicamente quando iterarmos, para isso, basta substituir.setHTML('<p>Voyage à Marrakech</p>'))por.setHTML('<p>' + trip.name + '</p>'))

Popup exibindo o nome de Paris

Popup exibindo o nome de Paris


Personalizar os marcadores

Por fim, vamos tentar usar uma imagem que corresponda ao seu site. Para isso, nada muito complicado, basta adicionar um pouco de estilo ao nosso mapa, usando a tag style, antes da<div id="map">:

<style>
  .marker {
    background-image: url('https://www.traveledmap.com/images/home/marker-traveled.png');
    background-size: cover;
    width: 30px;
    height: 30px;
    border-radius: 50%;
    cursor: pointer;
  }
</style>

Também é necessário criar o marcador num elemento que você adiciona, substituindo as linhas de criação do marcador pelas seguintes linhas (note que um offset de 15px é adicionado, sendo 15 a metade da altura do marcador, definida no estilo acima):

trips.forEach(trip => {
  var el = document.createElement('div');
  el.className = 'marker';

  new mapboxgl.Marker(el)
    .setLngLat(trip.coordinates)
    .setPopup(new mapboxgl.Popup({ anchor: 'top', offset: 15 })
      .setHTML('<span>' + trip.name + '</span>'))
    .addTo(map);
});

TL;DR

E aqui está o resultado final, obtido com o código que segue.
Se tiver algum problema, comentário ou precisar de um desenvolvedor para integrar o seu mapa, não hesite em me contactar através de contact@traveledmap.com

Resultado final

Resultado final

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>O meu primeiro mapa com Mapbox</title>
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />

<script src="https://api.mapbox.com/mapbox-gl-js/v2.0.1/mapbox-gl.js"></script>
<link href="https://api.mapbox.com/mapbox-gl-js/v2.0.1/mapbox-gl.css" rel="stylesheet" />

<style>
  .marker {
    background-image: url('https://www.traveledmap.com/images/home/marker-traveled.png');
    background-size: cover;
    width: 30px;
    height: 30px;
    border-radius: 50%;
    cursor: pointer;
  }
</style>

<div id="map" style="height: 500px; width: 100%"></div>

<script>
  mapboxgl.accessToken = 'Access token a substituir pelo seu';

  var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/light-v10',
    center: [2, 45],
    zoom: 2
  });

  var trips = [{
      coordinates: [2.35, 48.85],
      name: 'Paris'
  }, {
      coordinates: [-74, 40.71],
      name: 'New York'
  }, {
      coordinates: [-7.99, 31.62],
      name: 'Marrakech'
  }];

  trips.forEach(trip => {
    var el = document.createElement('div');
    el.className = 'marker';

    new mapboxgl.Marker(el)
      .setLngLat(trip.coordinates)
      .setPopup(new mapboxgl.Popup({ anchor: 'top', offset: 15 })
        .setHTML('<span>' + trip.name + '</span>'))
      .addTo(map);
  });

</script>

</body>
</html>