Este é o mais simples que eu poderia reduzir para:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Google Maps Multiple Markers</title>
<script src="http://maps.google.com/maps/api/js?sensor=false"
type="text/javascript"></script>
</head>
<body>
<div id="map" style="width: 500px; height: 400px;"></div>
<script type="text/javascript">
var locations = [
['Bondi Beach', -33.890542, 151.274856, 4],
['Coogee Beach', -33.923036, 151.259052, 5],
['Cronulla Beach', -34.028249, 151.157507, 3],
['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
['Maroubra Beach', -33.950198, 151.259302, 1]
];
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 10,
center: new google.maps.LatLng(-33.92, 151.25),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var infowindow = new google.maps.InfoWindow();
var marker, i;
for (i = 0; i < locations.length; i++) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(locations[i][1], locations[i][2]),
map: map
});
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infowindow.setContent(locations[i][0]);
infowindow.open(map, marker);
}
})(marker, i));
}
</script>
</body>
</html>
👨💻 Editar / bifurcar em um Codepen →
SCREENSHOT
Há alguma mágica de fechamento acontecendo ao passar o argumento de retorno de chamada para o addListener
método Esse pode ser um tópico bastante complicado, se você não estiver familiarizado com o funcionamento dos fechamentos. Sugiro verificar o seguinte artigo da Mozilla para uma breve introdução, se for o caso:
❯ Mozilla Dev Center: Trabalhando com fechamentos
InfoWindow
às propriedades do Marcador e, em seguida, chamar.open()
o InfoWindow. Eu teria postado a alteração aqui, mas as modificações foram grandes o suficiente para eu postar minha própria resposta .new MarkerClusterer()
em buscas massivas de desempenho? Confira a resposta da ChirsSwires.Aqui está outro exemplo de vários marcadores carregando com um único
title
einfoWindow
texto. Testado com a mais recente API do Google Maps V3.11.Screenshot de 250 marcadores:
Ele aleatoriamente automaticamente o Lat / Lng para torná-lo único. Este exemplo será muito útil se você quiser testar os marcadores 500, 1000, xxx e desempenho.
fonte
infoWindow
para cada marcador e não oculte o outroinfoWindow
se ele estiver sendo exibido no momento. é realmente útil :)new MarkerClusterer()
em buscas maciças por desempenho? Confira a resposta da ChirsSwires.Eu pensei em colocar isso aqui, pois parece ser um ponto de aterrissagem popular para quem está começando a usar as APIs do Google Maps. Vários marcadores renderizados no lado do cliente provavelmente são a queda de muitos aplicativos de mapeamento em termos de desempenho. É difícil avaliar, corrigir e, em alguns casos, até estabelecer um problema (devido a diferenças na implementação do navegador, hardware disponível para o cliente, dispositivos móveis, a lista continua).
A maneira mais simples de começar a resolver esse problema é usar uma solução de agrupamento de marcadores. A idéia básica é agrupar locais geograficamente semelhantes em um grupo com o número de pontos exibidos. À medida que o usuário aproxima o zoom do mapa, esses grupos se expandem para revelar os marcadores individuais abaixo.
Talvez o mais simples de implementar seja a biblioteca markerclusterer . Uma implementação básica seria a seguinte (após a importação da biblioteca):
Os marcadores, em vez de serem adicionados diretamente ao mapa, são adicionados a uma matriz. Essa matriz é passada para a biblioteca que lida com cálculos complexos para você e anexada ao mapa.
Essas implementações não apenas aumentam enormemente o desempenho do lado do cliente, mas também em muitos casos levam a uma interface do usuário mais simples e menos confusa e à digestão mais fácil dos dados em escalas maiores.
Outras implementações estão disponíveis no Google.
Espero que isso ajude alguns dos mais novos às nuances do mapeamento.
fonte
Versão assíncrona:
fonte
Exemplo de trabalho completo. Você pode apenas copiar, colar e usar.
fonte
De exemplos da API do Google Map :
fonte
Aqui está outra versão que escrevi para salvar as propriedades do mapa, que coloca o ponteiro da janela de informações no lat e no comprimento reais do marcador, enquanto oculta temporariamente o marcador enquanto a janela de informações está sendo exibida.
Ele também elimina a atribuição padrão de 'marcador' e acelera o processamento atribuindo diretamente o novo marcador à matriz de marcadores na criação dos marcadores. Observe, no entanto, que propriedades adicionais foram adicionadas ao marcador e à janela de entrada, portanto essa abordagem é um pouco pouco convencional ... mas sou eu!
Nunca é mencionado nessas perguntas da janela de informações que a janela de informações padrão NÃO é colocada no intervalo e no ângulo do ponto do marcador, mas na parte superior da imagem do marcador. A visibilidade do marcador deve estar oculta para que isso funcione; caso contrário, a API do Google Maps empurrará a âncora da janela de retorno de volta para o topo da imagem do marcador.
A referência aos marcadores na matriz 'markers' é criada imediatamente após a declaração do marcador para quaisquer tarefas de processamento adicionais que possam ser desejadas posteriormente (ocultar / mostrar, agarrar as cordas, etc ...). Isso economiza a etapa adicional de atribuir o objeto marcador a 'marcador' e, em seguida, empurrar o 'marcador' para a matriz de marcadores ... muito processamento desnecessário no meu livro.
Enfim, uma visão diferente das janelas de entrada e espero que ajude a informar e inspirar você.
Aqui está um JSFiddle em funcionamento
Nota adicional
Você notará neste exemplo de dados do Google um quarto lugar na matriz 'locais' com um número. Dado isso no exemplo, você também pode usar esse valor para o ID do marcador no lugar do valor atual do loop, de modo que ...
fonte
Resposta aceita, reescrita no ES6:
fonte
Link de origem
Link de demonstração
Código HTML completo
fonte
closeOtherInfo
, não consegui encontrar uma solução decente para trabalhar com o merkercluster até sua resposta. :)Adicionar um marcador no seu programa é muito fácil. Você pode adicionar este código:
Os seguintes campos são particularmente importantes e geralmente definidos quando você constrói um marcador:
position
(obrigatório) especifica um LatLng que identifica o local inicial do marcador. Uma maneira de recuperar um LatLng é usando o serviço de geocodificação .map
(opcional) especifica o mapa no qual colocar o marcador. Se você não especificar um mapa na construção do marcador, o marcador será criado, mas não será anexado ao (ou exibido no) mapa. Você pode adicionar o marcador posteriormente chamando osetMap()
método do marcador .Observe que , no exemplo, o campo de título define o título do marcador que aparecerá como uma dica de ferramenta.
Você pode consultar a documentação da API do Google aqui .
Este é um exemplo completo para definir um marcador em um mapa. Tenha cuidado, você deve substituir
YOUR_API_KEY
pela chave da API do Google :Agora, se você deseja plotar marcadores de uma matriz em um mapa, faça o seguinte:
Este exemplo me fornece o seguinte resultado:
Você também pode adicionar uma infoWindow no seu alfinete. Você só precisa deste código:
Você pode ter a documentação do Google sobre o infoWindows aqui .
Agora, podemos abrir o infoWindow quando o marcador for "clik" assim:
Observe que você pode ter alguma documentação
Listener
aqui no google developer.E, finalmente, podemos plotar uma infoWindow em um marcador se o usuário clicar nele. Este é o meu código completo:
Normalmente, você deve ter este resultado:
fonte
Seguindo a resposta de Daniel Vassallo , aqui está uma versão que trata da questão do fechamento de uma maneira mais simples.
Como todos os marcadores terão um InfoWindow individual e o JavaScript não se importa se você adicionar propriedades extras a um objeto, tudo o que você precisa fazer é adicionar um InfoWindow às propriedades do Marcador e, em seguida, chamar
.open()
o InfoWindow por si mesmo!Editar: com dados suficientes, o carregamento da página pode levar muito tempo; portanto, em vez de construir o InfoWindow com o marcador, a construção deve acontecer apenas quando necessário. Observe que todos os dados usados para construir o InfoWindow devem ser anexados ao Marcador como uma propriedade (
data
). Observe também que, após o primeiro evento de clique,infoWindow
persistirá como uma propriedade do marcador, para que o navegador não precise ser reconstruído constantemente.fonte
Aqui está um exemplo quase completo da função javascript que permitirá vários marcadores definidos em um JSONObject.
Ele exibirá apenas os marcadores que estão nos limites do mapa.
Isso é importante para que você não esteja fazendo um trabalho extra.
Você também pode definir um limite para os marcadores para não mostrar uma quantidade extrema de marcadores (se houver a possibilidade de algo em seu uso);
também não exibirá marcadores se o centro do mapa não tiver mudado mais de 500 metros.
Isso é importante porque se um usuário clicar no marcador e arrastar o mapa acidentalmente enquanto faz isso, você não deseja que o mapa recarregue os marcadores.
Anexei essa função ao ouvinte de evento ocioso do mapa, para que os marcadores sejam exibidos apenas quando o mapa estiver ocioso e exibam os marcadores novamente após um evento diferente.
Na captura de tela de ação, há uma pequena alteração na captura de tela, mostrando mais conteúdo na janela de entrada. colado de pastbin.com
fonte
Aqui está um exemplo de vários marcadores no Reactjs .
Abaixo está o componente do mapa
fonte