Um pouco preso neste. Estou recuperando uma lista de geo coords via JSON e colocando-os em um mapa do Google. Tudo está funcionando bem, exceto no caso em que tenho dois ou mais marcadores exatamente no mesmo local. A API exibe apenas 1 marcador - o primeiro. Suponho que seja justo, mas gostaria de encontrar uma maneira de exibi-los todos de alguma forma.
Eu pesquisei no google e encontrei algumas soluções, mas a maioria delas parece ser para a V2 da API ou simplesmente não tão boa. Idealmente, eu gostaria de uma solução em que você clica em algum tipo de marcador de grupo e mostra os marcadores agrupados ao redor do local em que estão todos.
Alguém teve esse problema ou algo semelhante e gostaria de compartilhar uma solução?
fonte
OverlappingMarkerSpiderfier
em combinação com MarkerClusterer, uma boa opção é definir amaxZoom
opção no construtor de cluster. Isso "unclusters" os marcadores após o nível de zoom especificado.Compensar os marcadores não é uma solução real se eles estiverem localizados no mesmo prédio. O que você pode querer fazer é modificar o markerclusterer.js assim:
Adicione um método de clique de protótipo na classe MarkerClusterer, assim - vamos substituir isso mais tarde na função initialize () do mapa:
Na classe ClusterIcon, adicione o seguinte código APÓS o gatilho clusterclick:
Então, em sua função initialize () onde você inicializa o mapa e declara seu objeto MarkerClusterer:
Onde multiChoice () é SUA função (ainda a ser escrita) para abrir uma InfoWindow com uma lista de opções para selecionar. Observe que o objeto markerClusterer é passado para sua função, porque você precisará disso para determinar quantos marcadores existem naquele cluster. Por exemplo:
fonte
Eu usei isso junto com o jQuery e ele faz o trabalho:
fonte
Expandindo a resposta de Chaoley , implementei uma função que, dada uma lista de locais (objetos com
lng
elat
propriedades) cujas coordenadas são exatamente as mesmas, os afasta um pouco de sua localização original (modificando os objetos no local). Em seguida, eles formam um belo círculo em torno do ponto central.Descobri que, para minha latitude (52deg Norte), 0,0003 graus de raio de círculo funcionam melhor e que você deve compensar a diferença entre graus de latitude e longitude quando convertidos em quilômetros. Você pode encontrar conversões aproximadas para sua latitude aqui .
fonte
37.68625400000000000,-75.71669800000000000
para37.686254,-75.716698
também, que é o mesmo para todos os valores ... M esperando algo como ...37.68625400000000000,-75.71669800000000000
para37.6862540000001234,-75.7166980000001234
37.6862540000005678,-75.7166980000005678
..etc .. Eu também tentei mudar meu ângulo.A resposta mais excelente do @Ignatius, atualizada para funcionar com a v2.0.7 do MarkerClustererPlus.
Adicione um método de clique de protótipo na classe MarkerClusterer, assim - vamos substituir isso mais tarde na função initialize () do mapa:
Na classe ClusterIcon, adicione o seguinte código APÓS o acionador click / clusterclick:
Então, em sua função initialize () onde você inicializa o mapa e declara seu objeto MarkerClusterer:
Onde multiChoice () é SUA função (ainda a ser escrita) para abrir uma InfoWindow com uma lista de opções para selecionar. Observe que o objeto markerClusterer é passado para sua função, porque você precisará disso para determinar quantos marcadores existem naquele cluster. Por exemplo:
fonte
maxZoom
problema, acho que é apenas um problema se não houver maxZoom definido ou o maxZoom para o cluster for maior que o zoom para o mapa. Substituí seu código por este snippet e parece funcionar muito bem:var maxZoom = mc.getMaxZoom(); if (null === maxZoom || maxZoom > mc.getMap().maxZoom) { maxZoom = mc.getMap().maxZoom; if (null === maxZoom) { maxZoom = 15; } }
clickedCluster.center_.lat()
/clickedCluster.center_.lng()
As respostas acima são mais elegantes, mas descobri uma maneira rápida e suja que realmente funciona incrivelmente bem. Você pode vê-lo em ação em www.buildinglit.com
Tudo o que fiz foi adicionar um deslocamento aleatório à latitude e longditude à minha página genxml.php para que retornasse resultados ligeiramente diferentes a cada vez com deslocamento cada vez que o mapa fosse criado com marcadores. Isso soa como um hack, mas na realidade você só precisa que os marcadores se movam um leve empurrão em uma direção aleatória para serem clicáveis no mapa se estiverem sobrepostos. Na verdade funciona muito bem, eu diria melhor do que o método da aranha, porque quem quer lidar com essa complexidade e tê-los surgindo em todos os lugares. Você só deseja poder selecionar o marcador. Empurrar aleatoriamente funciona perfeitamente.
Aqui está um exemplo da criação do nó de iteração da instrução while em meu php_genxml.php
Observe que em latitude e longitude existe o deslocamento +. das 2 variáveis acima. Tive que dividir aleatoriamente por 0,1000 por 10000000 para obter um decimal que fosse aleatoriamente pequeno o suficiente para apenas mover os marcadores. Sinta-se à vontade para mexer nessa variável para obter uma que seja mais precisa para as suas necessidades.
fonte
Para situações em que há vários serviços no mesmo prédio, você pode deslocar os marcadores um pouco, (digamos em 0,001 grau), em um raio do ponto real. Isso também deve produzir um bom efeito visual.
fonte
Esta é mais uma solução provisória 'rápida e suja' semelhante à sugerida por Matthew Fox, desta vez usando JavaScript.
Em JavaScript, você pode apenas compensar a latitude e a longitude de todos os seus locais adicionando um pequeno deslocamento aleatório a ambos, por exemplo
myLocation[i].Latitude+ = (Math.random() / 25000)
(Descobri que dividir por 25000 dá separação suficiente, mas não move o marcador significativamente do local exato, por exemplo, um endereço específico)
Isso faz um trabalho razoavelmente bom em compensá-los um do outro, mas somente depois de você ter ampliado de perto. Quando diminuído o zoom, ainda não ficará claro se existem várias opções para o local.
fonte
Confira Marker Clusterer para V3 - esta biblioteca agrupa pontos próximos em um marcador de grupo. O mapa aumenta o zoom quando os clusters são clicados. Eu imagino que quando ampliado você ainda terá o mesmo problema com marcadores no mesmo local.
fonte
Atualizado para funcionar com MarkerClustererPlus.
fonte
Eu gosto de soluções simples, então aqui está a minha. Em vez de modificar o lib, o que tornaria mais difícil mantê-lo. você pode simplesmente assistir ao evento assim
então você pode gerenciar isso em
i, ou seja, usei o bootstrap para mostrar um painel com uma lista. que considero muito mais confortável e útil do que caça-aranha em lugares "lotados". (se você estiver usando um clusterer, as chances são de que você acabará com colisões depois de fazer spiderfy). você pode verificar o zoom lá também.
btw. Acabei de encontrar o folheto e parece funcionar muito melhor, o cluster AND spiderfy funciona de forma muito fluida http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.10000.html e é de código aberto.
fonte
Verifique isto: https://github.com/plank/MarkerClusterer
Este é o MarkerCluster modificado para ter uma infoWindow em um marcador de cluster, quando você tem vários marcadores na mesma posição.
Você pode ver como funciona aqui: http://culturedays.ca/en/2013-activities
fonte
Expandindo as respostas fornecidas acima, apenas certifique-se de definir a opção maxZoom ao inicializar o objeto de mapa.
fonte
Dar deslocamento fará com que os marcadores fiquem distantes quando o usuário aumentar o zoom no máximo Então eu encontrei uma maneira de conseguir isso. esta pode não ser a maneira correta, mas funcionou muito bem.
defina o zIndex do marcador de forma que você veja o ícone do marcador que deseja ver no topo, caso contrário, os marcadores serão animados como troca automática. quando o usuário toca no marcador, segure o zIndex para trazer o marcador para cima usando zIndex Swap.
fonte
Como escapar impune .. [Swift]
Um novo marcador está para ser criado? verificar
clusterArray
e manipular o deslocamentoresultado
fonte
Somando-se à resposta genial de Matthew Fox, adicionei um pequeno deslocamento aleatório para cada lat e lng ao definir o objeto marcador. Por exemplo:
fonte
Estendendo as respostas acima, quando você juntou strings, não adicionou / subtraiu a posição (por exemplo, "37.12340-0.00069"), converta sua latitude / longitude original em flutuantes, por exemplo, usando parseFloat (), então adicione ou subtraia correções.
fonte