Tableless

Busca Menu

Utilizando o MarkerClusterer no Google Maps

Seja o primeiro a comentar por

Seja você desenvolvedor ou não, temos que admitir o poder do Google Maps. É bem difícil encontrar alguém hoje em dia que não tenha acessado pelo menos uma vez o famoso Maps para ver onde ficava um determinado lugar.

Esses dias me deparei novamente com o excelente artigo do Thulio Philipe sobre a API do Google Maps V3 e resolvi escrever um pouco sobre um recurso chamado MarkerClusterer.

O que é o MarkerClusterer?

Segundo o Google, trata-se de uma solução para o problema de muitos pontos em um mapa. Indo direto ao ponto, ele agrupa pontos (markers) que são muito próximos uns dos outros no mapa e renderiza um ponto diferente com o número de ícones agrupados.

Confuso? Visualmente fica mais fácil para explicar. Imagine que tivéssemos um mapa assim:

Exemplo de mapa simples sem a utilização do MarkerClusterer

Temos alguns pontos que são bem próximos uns dos outros enquanto outros são mais distantes. Aplicando o MarkerClusterer ficaria assim:

Exemplo de mapa simples com a utilização do MarkerClusterer

Você pode estar pensando a mesma coisa que pensei a primeira vez que vi o exemplo: “Ah, nem precisava agrupar os itens! Tem poucos no mapa!” Pode ser. Agora imagine que tivéssemos um mapa assim:

Exemplo de mapa mais complexo com a utilização do MarkerClusterer

Pois é! De acordo com o próprio Google, um mapa assim acaba por se tornar lento pelo fato de um ponto no mapa ser uma combinação de vários elementos no DOM. Logo, quanto mais pontos no mapa, maior o trabalho no navegador para renderização. O legal é que existe até um teste de velocidade comparando um mapa com e sem o uso do MarkerClusterer.

Como ficaria com a utilização do MarkerClusterer:

Exemplo de mapa mais complexo sem a utilização do MarkerClusterer

Pode ser até que a questão da perfomance não influencie tanto no seu projeto, mas um ponto que deve ser considerado é a usabilidade e experiência do usuário ao interagir com o mapa. Se colocar no lugar do usuário nessa hora é fundamental. Pra localizar determinado ponto no mapa: fica mais fácil com todos visíveis próximos uns dos outros ou agrupados em grupos maiores? Logicamente não existe um certo ou errado pois isso vai variar de projeto para projeto, mas vale a discussão com os membros do time.

As imagens acima foram tiradas daqui onde também é possível ler mais a respeito desse recurso.

Peguei um exemplo do próprio Google pra podermos visualizar a diferença entre um mapa sem a utilização do MarkerClusterer e com a utilização do recurso.

Dando uma olhada no código do exemplo com a utilização do recurso temos o seguinte:

HTML

<div id="map-container"><div id="map"></div></div>

<!-- Scripts -->
<script src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/src/data.json"></script>
<script src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/src/markerclusterer.js">

CSS

body { margin: 0; }

#map-container {
  -webkit-box-shadow: rgba(64, 64, 64, 0.5) 0 2px 5px;
     -moz-box-shadow: rgba(64, 64, 64, 0.5) 0 2px 5px;
          box-shadow: rgba(64, 64, 64, 0.1) 0 2px 5px;
  width: 600px;
}

#map {
  width: 600px;
  height: 400px;
}

JS

function initialize() {
  var center = new google.maps.LatLng(48.091534, 15.5116439);
  
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 3,
    center: center,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });

  var markers = [];
  for (var i = 0; i < 100; i++) {
    var dataPhoto = data.photos[i];
    var latLng = new google.maps.LatLng(dataPhoto.latitude,
              dataPhoto.longitude);
    var marker = new google.maps.Marker({
      position: latLng
    });
    markers.push(marker);
  }
  var markerCluster = new MarkerClusterer(map, markers);
}

google.maps.event.addDomListener(window, 'load', initialize);

A parte de HTML e CSS é bem tranquila e, se pararmos pra olhar, até a parte do JS é de fácil entendimento.

  • Primeiro é criado o objeto do mapa com seus parâmetros e ele é passado à variável map.
  • Depois é criado um array vazio que vai armazenar todos os markers.
  • Logo após é executado um for que vai iterar pelo JSON que contém as informações dos pontos e, adicionar cada ponto no array que criamos acima.
  • Nesse momento é criado o objeto MarkerClusterer passando como parâmetros o array contendo todos os pontos do JSON e o mapa.
  • Por fim, o mapa é iniciado no load da página.

É isso pessoal, a idéia era dar uma passada geral sobre o recurso que pode ser útil para alguém que for mexer com mapas que possuem muitos pontos!

Publicado no dia