Bit coincé sur celui-ci. Je récupère une liste de coordonnées géographiques via JSON et je les affiche sur une carte Google. Tout fonctionne bien sauf dans le cas où j'ai deux marqueurs ou plus exactement au même endroit. L'API n'affiche qu'un seul marqueur - celui du haut. C'est assez juste, je suppose, mais j'aimerais trouver un moyen de les afficher tous d'une manière ou d'une autre.
J'ai cherché sur Google et trouvé quelques solutions, mais elles semblent principalement être pour la version V2 de l'API ou tout simplement pas très bonnes. Idéalement, j'aimerais une solution où vous cliquez sur une sorte de marqueur de groupe et qui montre ensuite les marqueurs regroupés autour de l'endroit où ils se trouvent tous.
Quelqu'un a eu ce problème ou similaire et voudrait partager une solution?
OverlappingMarkerSpiderfier
en combinaison avec MarkerClusterer, une bonne option consiste à définir l'maxZoom
option sur le constructeur de cluster. Ceci "décompose" les marqueurs après le niveau de zoom spécifié.Décaler les marqueurs n'est pas une vraie solution s'ils sont situés dans le même bâtiment. Ce que vous voudrez peut-être faire est de modifier le markerclusterer.js comme ceci:
Ajoutez une méthode de clic prototype dans la classe MarkerClusterer, comme ceci - nous remplacerons cela plus tard dans la fonction initialize () de la carte:
Dans la classe ClusterIcon, ajoutez le code suivant APRÈS le déclencheur clusterclick:
Ensuite, dans votre fonction initialize () où vous initialisez la carte et déclarez votre objet MarkerClusterer:
Où multiChoice () est VOTRE (encore à écrire) fonction pour faire apparaître une InfoWindow avec une liste d'options à sélectionner. Notez que l'objet markerClusterer est passé à votre fonction, car vous en aurez besoin pour déterminer le nombre de marqueurs dans ce cluster. Par exemple:
la source
J'ai utilisé ceci avec jQuery et cela fait le travail:
la source
En développant la réponse de Chaoley , j'ai implémenté une fonction qui, étant donné une liste d'emplacements (objets avec
lng
etlat
propriétés) dont les coordonnées sont exactement les mêmes, les éloigne un peu de leur emplacement d'origine (modification des objets en place). Ils forment alors un joli cercle autour du point central.J'ai trouvé que, pour ma latitude (52deg Nord), 0,0003 degrés de rayon de cercle fonctionnent le mieux, et que vous devez compenser la différence entre les degrés de latitude et de longitude lorsqu'ils sont convertis en kilomètres. Vous pouvez trouver des conversions approximatives pour votre latitude ici .
la source
37.68625400000000000,-75.71669800000000000
à37.686254,-75.716698
aussi ce qui est le même pour toutes les valeurs ... M m'attendant à quelque chose comme ...37.68625400000000000,-75.71669800000000000
à37.6862540000001234,-75.7166980000001234
37.6862540000005678,-75.7166980000005678
..etc .. J'ai aussi essayé de changer mon angle.@Ignatius la réponse la plus excellente, mise à jour pour fonctionner avec la v2.0.7 de MarkerClustererPlus.
Ajoutez une méthode de clic prototype dans la classe MarkerClusterer, comme ceci - nous remplacerons cela plus tard dans la fonction initialize () de la carte:
Dans la classe ClusterIcon, ajoutez le code suivant APRÈS le déclencheur click / clusterclick:
Ensuite, dans votre fonction initialize () où vous initialisez la carte et déclarez votre objet MarkerClusterer:
Où multiChoice () est VOTRE (encore à écrire) fonction pour faire apparaître une InfoWindow avec une liste d'options à sélectionner. Notez que l'objet markerClusterer est passé à votre fonction, car vous en aurez besoin pour déterminer le nombre de marqueurs dans ce cluster. Par exemple:
la source
maxZoom
problème, je pense que ce n'est un problème que s'il n'y a pas de jeu maxZoom ou si maxZoom pour le cluster est supérieur au zoom de la carte. J'ai remplacé votre codé en dur par cet extrait et il semble bien fonctionner: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()
Les réponses ci-dessus sont plus élégantes, mais j'ai trouvé un moyen rapide et sale qui fonctionne vraiment très bien. Vous pouvez le voir en action sur www.buildinglit.com
Tout ce que j'ai fait a été d'ajouter un décalage aléatoire à la latitude et à la longueur à ma page genxml.php afin qu'elle renvoie des résultats légèrement différents à chaque fois avec un décalage chaque fois que la carte est créée avec des marqueurs. Cela ressemble à un hack, mais en réalité, vous n'avez besoin que des marqueurs pour déplacer un léger coup de pouce dans une direction aléatoire pour qu'ils soient cliquables sur la carte s'ils se chevauchent. Cela fonctionne vraiment très bien, je dirais mieux que la méthode de l'araignée, car qui veut faire face à cette complexité et les faire jaillir partout. Vous voulez simplement pouvoir sélectionner le marqueur. Le pousser au hasard fonctionne parfaitement.
Voici un exemple de création de nœud d'itération d'instruction while dans mon php_genxml.php
Remarquez sous lat et long, il y a le + offset. à partir des 2 variables ci-dessus. J'ai dû diviser au hasard par 0,1000 par 10000000 afin d'obtenir une décimale suffisamment petite au hasard pour déplacer à peine les marqueurs. N'hésitez pas à bricoler cette variable pour en obtenir une plus précise pour vos besoins.
la source
Pour les situations où il y a plusieurs services dans le même bâtiment, vous pouvez décaler légèrement les marqueurs (par exemple de 0,001 degré) dans un rayon du point réel. Cela devrait également produire un bel effet visuel.
la source
Il s'agit plus d'une solution provisoire «rapide et sale» similaire à celle suggérée par Matthew Fox, cette fois en utilisant JavaScript.
En JavaScript, vous pouvez simplement compenser la lat et la longueur de tous vos emplacements en ajoutant un petit décalage aléatoire aux deux, par exemple
myLocation[i].Latitude+ = (Math.random() / 25000)
(J'ai trouvé que la division par 25000 donne une séparation suffisante mais ne déplace pas le marqueur de manière significative de l'emplacement exact, par exemple une adresse spécifique)
Cela fait un assez bon travail pour les compenser les uns des autres, mais seulement après avoir zoomé de près. Lors d'un zoom arrière, il ne sera toujours pas clair qu'il existe plusieurs options pour l'emplacement.
la source
Découvrez Marker Clusterer pour V3 - cette bibliothèque regroupe les points à proximité dans un marqueur de groupe. La carte effectue un zoom avant lorsque l'utilisateur clique sur les clusters. J'imagine que lorsque vous zoomez directement, vous aurez toujours le même problème avec les marqueurs au même endroit.
la source
Mis à jour pour fonctionner avec MarkerClustererPlus.
la source
J'aime les solutions simples alors voici la mienne. Au lieu de modifier la lib, ce qui la rendrait plus difficile à maintenir. vous pouvez simplement regarder l'événement comme ça
alors vous pouvez le gérer sur
i, c'est-à-dire, utilisé bootstrap pour afficher un panneau avec une liste. ce que je trouve beaucoup plus confortable et utilisable que spiderfying sur des endroits "bondés". (si vous utilisez un clusterer, vous risquez de vous retrouver avec des collisions une fois que vous avez spiderfy). vous pouvez également vérifier le zoom.
btw. Je viens de trouver un dépliant et il semble fonctionner beaucoup mieux, le cluster AND spiderfy fonctionne très facilement http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.10000.html et il est open-source.
la source
Vérifiez ceci: https://github.com/plank/MarkerClusterer
Il s'agit du MarkerCluster modifié pour avoir une infoWindow dans un marqueur de cluster, lorsque vous avez plusieurs marqueurs à la même position.
Vous pouvez voir comment cela fonctionne ici: http://culturedays.ca/fr/2013-activities
la source
En développant les réponses données ci-dessus, assurez-vous simplement de définir l'option maxZoom lors de l'initialisation de l'objet de la carte.
la source
Donner un décalage éloignera les marqueurs lorsque l'utilisateur zoomera au maximum. J'ai donc trouvé un moyen d'y parvenir. ce n'est peut-être pas une bonne méthode, mais cela a très bien fonctionné.
définissez le zIndex du marqueur afin que vous voyiez l'icône du marqueur que vous voulez voir en haut, sinon cela animera les marqueurs comme un échange automatique. lorsque l'utilisateur touche le marqueur, manipulez le zIndex pour amener le marqueur sur le dessus à l'aide de zIndex Swap.
la source
Comment s'en sortir… [Swift]
Un nouveau marqueur est sur le point d'être créé? vérifier
clusterArray
et manipuler son décalagerésultat
la source
En plus de la réponse géniale sournoise de Matthew Fox, j'ai ajouté un petit décalage aléatoire à chaque latitude et longitude lors de la définition de l'objet marqueur. Par exemple:
la source
En étendant les réponses ci-dessus, lorsque vous avez des chaînes jointes, pas de position ajoutée / soustraite (par exemple "37.12340-0.00069"), convertissez votre lat / longitude d'origine en flottants, par exemple en utilisant parseFloat (), puis ajoutez ou soustrayez des corrections.
la source