C'est le plus simple que j'ai pu le réduire à:
<!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>
👨💻 Éditer / bifurquer sur un Codepen →
CAPTURE D'ÉCRAN
Une magie de fermeture se produit lors du passage de l'argument de rappel à la addListener
méthode. Cela peut être un sujet assez délicat si vous ne savez pas comment fonctionnent les fermetures. Je suggère de consulter l'article Mozilla suivant pour une brève introduction si c'est le cas:
❯ Mozilla Dev Center: Utilisation des fermetures
Daniel Vassallo
la source
InfoWindow
aux propriétés du marqueur, puis d'appeler le.open()
sur l'InfoWindow depuis lui-même. J'aurais posté le changement ici, mais les modifications étaient suffisamment importantes pour que j'envoie ma propre réponse .new MarkerClusterer()
pour un buste de performance massif? Consultez la réponse de ChirsSwires.Voici un autre exemple de plusieurs marqueurs de chargement avec un cadre unique
title
etinfoWindow
texte. Testé avec la dernière API google maps V3.11.Capture d'écran de 250 marqueurs:
Il randomisera automatiquement le Lat / Lng pour le rendre unique. Cet exemple sera très utile si vous souhaitez tester 500, 1000, xxx marqueurs et performances.
la source
infoWindow
pour chaque marqueur et ne masquera pas l'autreinfoWindow
s'il est actuellement affiché. c'est vraiment utile :)new MarkerClusterer()
pour une baisse massive des performances? Consultez la réponse de ChirsSwires.Je pensais que je mettrais cela ici car il semble être un point d'atterrissage populaire pour ceux qui commencent à utiliser les API Google Maps. Plusieurs marqueurs rendus du côté client sont probablement la chute de nombreuses applications de cartographie en termes de performances. Il est difficile de comparer, de corriger et, dans certains cas, même d'établir qu'il y a un problème (en raison des différences d'implémentation du navigateur, du matériel disponible pour le client, des appareils mobiles, la liste est longue).
La façon la plus simple de commencer à résoudre ce problème consiste à utiliser une solution de regroupement de marqueurs. L'idée de base est de regrouper des emplacements géographiquement similaires dans un groupe avec le nombre de points affichés. Lorsque l'utilisateur fait un zoom sur la carte, ces groupes s'agrandissent pour révéler des marqueurs individuels en dessous.
Le plus simple à implémenter est peut- être la bibliothèque markerclusterer . Une implémentation de base serait la suivante (après les importations de bibliothèque):
Les marqueurs au lieu d'être ajoutés directement à la carte sont ajoutés à un tableau. Ce tableau est ensuite transmis à la bibliothèque qui gère les calculs complexes pour vous et attaché à la carte.
Non seulement ces implémentations augmentent considérablement les performances côté client, mais elles conduisent également dans de nombreux cas à une interface utilisateur plus simple et moins encombrée et à une digestion plus facile des données à plus grande échelle.
Autres implémentations sont disponibles auprès de Google.
J'espère que cela aide certains de ceux qui sont plus récents aux nuances de la cartographie.
la source
Version asynchrone:
la source
Exemple de travail complet. Vous pouvez simplement copier, coller et utiliser.
la source
À partir d' exemples d'API Google Map :
la source
Voici une autre version que j'ai écrite pour enregistrer les biens immobiliers de la carte, qui place le pointeur de la sous-fenêtre sur le lat et le long réels du marqueur, tout en masquant temporairement le marqueur pendant l'affichage de la sous-fenêtre.
Il supprime également l'affectation standard des «marqueurs» et accélère le traitement en affectant directement le nouveau marqueur au tableau des marqueurs lors de la création des marqueurs. Notez cependant que des propriétés supplémentaires ont été ajoutées à la fois au marqueur et à la sous-fenêtre, donc cette approche est un peu non conventionnelle ... mais c'est moi!
Il n'est jamais mentionné dans ces questions de la sous-fenêtre que la sous-fenêtre standard N'EST PAS placée aux lat et lng du point marqueur, mais plutôt en haut de l'image du marqueur. La visibilité du marqueur doit être masquée pour que cela fonctionne, sinon l'API Maps repoussera l'ancre de la sous-fenêtre vers le haut de l'image du marqueur.
Les références aux marqueurs dans le tableau des `` marqueurs '' sont créées immédiatement lors de la déclaration des marqueurs pour toutes les tâches de traitement supplémentaires qui peuvent être souhaitées ultérieurement (masquage / affichage, saisie des cordons, etc.). Cela évite l'étape supplémentaire d'assigner l'objet marqueur à «marqueur», puis de pousser le «marqueur» dans le tableau des marqueurs ... beaucoup de traitement inutile dans mon livre.
Quoi qu'il en soit, une vision différente des sous-fenêtres, et j'espère que cela vous aidera à vous informer et à vous inspirer.
Voici un JSFiddle fonctionnel
Remarque supplémentaire
Vous remarquerez dans cet exemple de données Google donné une quatrième place dans le tableau des «emplacements» avec un numéro. Compte tenu de cela dans l'exemple, vous pouvez également utiliser cette valeur pour l'ID de marqueur à la place de la valeur de boucle actuelle, de sorte que ...
la source
Réponse acceptée, réécrite dans ES6:
la source
Lien source
Lien de démonstration
Code HTML complet
la source
closeOtherInfo
, je n'ai pas trouvé de solution décente pour travailler avec merkercluster jusqu'à votre réponse. :)Ajouter un marqueur dans votre programme est très simple. Vous pouvez juste ajouter ce code:
Les champs suivants sont particulièrement importants et généralement définis lorsque vous créez un marqueur:
position
(obligatoire) spécifie un LatLng identifiant l'emplacement initial du marqueur. Une façon de récupérer un LatLng est d'utiliser le service de géocodage .map
(facultatif) spécifie la carte sur laquelle placer le marqueur. Si vous ne spécifiez pas de carte lors de la construction du marqueur, le marqueur est créé mais n'est pas attaché (ou affiché) à la carte. Vous pouvez ajouter le marqueur plus tard en appelant lasetMap()
méthode du marqueur .Notez , dans l'exemple, que le champ titre définit le titre du marqueur qui apparaîtra sous forme d'infobulle.
Vous pouvez consulter la documentation de l'API Google ici .
Ceci est un exemple complet pour placer un marqueur dans une carte. Attention, vous devez remplacer
YOUR_API_KEY
par votre clé API Google :Maintenant, si vous voulez tracer des marqueurs d'un tableau dans une carte, vous devriez faire comme ceci:
Cet exemple me donne le résultat suivant:
Vous pouvez également ajouter une fenêtre d'informations dans votre épingle. Vous avez juste besoin de ce code:
Vous pouvez avoir la documentation de Google sur infoWindows ici .
Maintenant, nous pouvons ouvrir l'infoWindow lorsque le marqueur est "clik" comme ceci:
Remarque , vous pouvez avoir une documentation à
Listener
ce sujet dans le développeur Google.Et, enfin, nous pouvons tracer une infoWindow dans un marqueur si l'utilisateur clique dessus. Voici mon code complet:
Normalement, vous devriez avoir ce résultat:
la source
À la suite de la réponse de Daniel Vassallo , voici une version qui traite de la question de la fermeture de manière plus simple.
Étant donné que tous les marqueurs auront une InfoWindow individuelle et que JavaScript ne se soucie pas si vous ajoutez des propriétés supplémentaires à un objet, tout ce que vous devez faire est d'ajouter une InfoWindow aux propriétés du marqueur et d'appeler ensuite
.open()
sur l' InfoWindow depuis lui-même!Modifier: avec suffisamment de données, la charge de page pourrait prendre beaucoup de temps, donc plutôt que de construire l' InfoWindow avec le marqueur, la construction ne devrait se produire qu'en cas de besoin. Notez que toutes les données utilisées pour construire l' InfoWindow doivent être ajoutées au marqueur en tant que propriété (
data
). Notez également qu'après le premier événement de clic,infoWindow
persistera en tant que propriété de son marqueur, de sorte que le navigateur n'a pas besoin de se reconstruire constamment.la source
Voici un exemple de fonction javascript presque complet qui permettra plusieurs marqueurs définis dans un JSONObject.
Il n'affichera que les marqueurs qui se trouvent dans les limites de la carte.
Ceci est important pour que vous ne fassiez pas de travail supplémentaire.
Vous pouvez également définir une limite pour les marqueurs afin de ne pas afficher une quantité extrême de marqueurs (s'il y a une possibilité d'une chose dans votre utilisation);
il n'affichera pas non plus de marqueurs si le centre de la carte n'a pas changé de plus de 500 mètres.
Ceci est important car si un utilisateur clique sur le marqueur et fait glisser accidentellement la carte en le faisant, vous ne voulez pas que la carte recharge les marqueurs.
J'ai attaché cette fonction à l'écouteur d'événements inactifs pour la carte afin que les marqueurs s'affichent uniquement lorsque la carte est inactive et réafficheront les marqueurs après un événement différent.
Dans la capture d'écran d'action, il y a un petit changement dans la capture d'écran montrant plus de contenu dans la sous-fenêtre. collé sur pastbin.com
la source
Voici un exemple de plusieurs marqueurs dans Reactjs .
Ci-dessous le composant de carte
la source