Dies ist das einfachste, auf das ich es reduzieren könnte:
<!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>
👨💻 Bearbeiten / Verzweigen eines Codepens →
BILDSCHIRMFOTO
Beim Übergeben des Rückrufarguments an die addListener
Methode tritt eine gewisse Schließmagie auf . Dies kann ein ziemlich kniffliges Thema sein, wenn Sie nicht mit der Funktionsweise von Verschlüssen vertraut sind. Ich würde empfehlen, den folgenden Mozilla-Artikel für eine kurze Einführung zu lesen, wenn dies der Fall ist:
❯ Mozilla Dev Center: Arbeiten mit Verschlüssen
InfoWindow
zu den Eigenschaften des Markers hinzufügen und dann.open()
das InfoWindow von sich aus aufrufen. Ich hätte die Änderung hier gepostet, aber die Änderungen waren groß genug, dass ich meine eigene Antwort gepostet habe .new MarkerClusterer()
für massive Performance-Büste verwenden? Schauen Sie sich die Antwort von ChirsSwires an.Hier ist ein weiteres Beispiel für mehr Marker mit einem einzigartigen Laden
title
undinfoWindow
Text. Getestet mit der neuesten Google Maps API V3.11.Screenshot von 250 Markern:
Das Lat / Lng wird automatisch randomisiert, um es eindeutig zu machen. Dieses Beispiel ist sehr hilfreich, wenn Sie 500, 1000, xxx Marker und die Leistung testen möchten.
quelle
infoWindow
für jeden Marker viele PopupsinfoWindow
angezeigt und der andere wird nicht ausgeblendet, wenn er gerade angezeigt wird. es ist wirklich hilfreich :)new MarkerClusterer()
für massive Performance-Büste verwenden? Schauen Sie sich die Antwort von ChirsSwires an.Ich dachte, ich würde dies hier einfügen, da es ein beliebter Landepunkt für diejenigen zu sein scheint, die anfangen, Google Maps-APIs zu verwenden. Mehrere auf der Clientseite gerenderte Markierungen sind wahrscheinlich der Nachteil vieler Mapping-Anwendungen in Bezug auf die Leistung. Es ist schwierig, ein Benchmarking durchzuführen, das Problem zu beheben und in einigen Fällen sogar festzustellen, ob ein Problem vorliegt (aufgrund von Unterschieden bei der Browserimplementierung, der dem Client zur Verfügung stehenden Hardware und mobilen Geräten wird die Liste fortgesetzt).
Der einfachste Weg, um dieses Problem zu beheben, ist die Verwendung einer Marker-Clustering-Lösung. Die Grundidee besteht darin, geografisch ähnliche Standorte mit der Anzahl der angezeigten Punkte in einer Gruppe zu gruppieren. Wenn der Benutzer in die Karte zoomt, werden diese Gruppen erweitert, um einzelne Markierungen darunter anzuzeigen.
Am einfachsten zu implementieren ist möglicherweise die Markerclusterer- Bibliothek. Eine grundlegende Implementierung wäre wie folgt (nach Bibliotheksimporten):
Die Markierungen werden einem Array hinzugefügt, anstatt direkt zur Karte hinzugefügt zu werden. Dieses Array wird dann an die Bibliothek übergeben, die komplexe Berechnungen für Sie übernimmt, und an die Karte angehängt.
Diese Implementierungen steigern nicht nur die Leistung auf der Clientseite massiv, sondern führen in vielen Fällen auch zu einer einfacheren und übersichtlicheren Benutzeroberfläche und einer einfacheren Datenverarbeitung in größeren Maßstäben.
Andere Implementierungen sind bei Google erhältlich.
Hoffe, dies hilft einigen von denen, die neu in den Nuancen des Mappings sind.
quelle
Asynchrone Version:
quelle
Vollständiges Arbeitsbeispiel. Sie können einfach kopieren, einfügen und verwenden.
quelle
Aus Google Map API-Beispielen :
quelle
Hier ist eine andere Version, die ich geschrieben habe, um Kartenimmobilien zu speichern, bei der der Infowindow-Zeiger auf das tatsächliche Lat und Long des Markers gesetzt wird, während der Marker vorübergehend ausgeblendet wird, während das Infowindow angezeigt wird.
Außerdem entfällt die Standardzuweisung für "Marker" und die Verarbeitung wird beschleunigt, indem der neue Marker direkt dem Marker-Array bei der Marker-Erstellung zugewiesen wird. Beachten Sie jedoch, dass sowohl dem Marker als auch dem Infofenster zusätzliche Eigenschaften hinzugefügt wurden, sodass dieser Ansatz etwas unkonventionell ist ... aber das bin ich!
In diesen Infowindow-Fragen wird nie erwähnt, dass das Standard-Infowindow NICHT am oberen und unteren Rand des Markierungspunkts platziert wird, sondern am oberen Rand des Markierungsbilds. Die Markierungssichtbarkeit muss ausgeblendet sein, damit dies funktioniert. Andernfalls schiebt die Karten-API den Infowindow-Anker wieder an den oberen Rand des Markierungsbilds.
Verweise auf die Markierungen im Array "Markierungen" werden sofort nach der Deklaration der Markierungen für zusätzliche Verarbeitungsaufgaben erstellt, die später gewünscht werden (Ausblenden / Anzeigen, Ergreifen der Koordinaten usw.). Dies erspart den zusätzlichen Schritt, das Markerobjekt 'marker' zuzuweisen und dann den 'marker' in das marker-Array zu verschieben ... eine Menge unnötiger Verarbeitung in meinem Buch.
Wie auch immer, eine andere Sicht auf Infofenster, und ich hoffe, es hilft, Sie zu informieren und zu inspirieren.
Hier ist eine funktionierende JSFiddle
Zusätzlicher Hinweis
Sie werden in diesen angegebenen Google-Beispieldaten einen vierten Platz im Array "Standorte" mit einer Nummer feststellen. In diesem Beispiel können Sie diesen Wert auch für die Markierungs-ID anstelle des aktuellen Schleifenwerts verwenden, sodass ...
quelle
Akzeptierte Antwort, umgeschrieben in ES6:
quelle
Quelle Link -
Demo Link
Vollständiger HTML-Code
quelle
closeOtherInfo
, ich konnte bis zu Ihrer Antwort keine anständige Lösung finden, um mit merkercluster zu arbeiten. :)Das Hinzufügen eines Markers in Ihrem Programm ist sehr einfach. Sie können diesen Code einfach hinzufügen:
Die folgenden Felder sind besonders wichtig und werden häufig beim Erstellen eines Markers festgelegt:
position
(erforderlich) gibt ein LatLng an, das die anfängliche Position des Markers identifiziert. Eine Möglichkeit zum Abrufen eines LatLng ist die Verwendung des Geokodierungsdienstes .map
(optional) gibt die Karte an, auf der die Markierung platziert werden soll. Wenn Sie beim Aufbau der Markierung keine Karte angeben, wird die Markierung erstellt, aber nicht an die Karte angehängt (oder auf dieser angezeigt). Sie können den Marker später hinzufügen, indem Sie diesetMap()
Methode des Markers aufrufen .Beachten Sie , dass im Beispielfeld im Titelfeld der Titel des Markers festgelegt wird, der als QuickInfo angezeigt wird.
Sie können die Google API-Dokumentation hier einsehen .
Dies ist ein vollständiges Beispiel zum Setzen einer Markierung in einer Karte. Seien Sie vorsichtig, Sie müssen
YOUR_API_KEY
durch Ihren Google API-Schlüssel ersetzen :Wenn Sie nun Markierungen eines Arrays in einer Karte zeichnen möchten, gehen Sie folgendermaßen vor:
Dieses Beispiel gibt mir folgendes Ergebnis:
Sie können Ihrer PIN auch ein infoWindow hinzufügen. Sie brauchen nur diesen Code:
Die Dokumentation von Google zu infoWindows finden Sie hier .
Jetzt können wir das infoWindow öffnen, wenn der Marker wie folgt "clik" ist:
Beachten Sie, dass Sie
Listener
hier in Google Developer eine Dokumentation dazu haben können .Und schließlich können wir ein infoWindow in eine Markierung zeichnen, wenn der Benutzer darauf klickt. Dies ist mein vollständiger Code:
Normalerweise sollten Sie dieses Ergebnis haben:
quelle
Nach der Antwort von Daniel Vassallo ist hier eine Version, die sich einfacher mit dem Abschlussproblem befasst.
Da alle Marker ein individuelles InfoWindow haben und es JavaScript egal ist, ob Sie einem Objekt zusätzliche Eigenschaften hinzufügen, müssen Sie lediglich ein InfoWindow zu den Eigenschaften des Markers hinzufügen und dann
.open()
das InfoWindow von sich aus aufrufen !Bearbeiten: Bei genügend Daten kann das Laden der Seite viel Zeit in Anspruch nehmen. Anstatt das InfoWindow mit dem Marker zu erstellen , sollte die Erstellung nur bei Bedarf erfolgen. Beachten Sie, dass alle Daten, die zum Erstellen des InfoWindow verwendet werden, als Eigenschaft ( ) an den Marker angehängt werden müssen
data
. Beachten Sie auch, dass das Ereignis nach dem ersten KlickinfoWindow
als Eigenschaft seiner Markierung bestehen bleibt, sodass der Browser nicht ständig rekonstruieren muss.quelle
Hier ist ein nahezu vollständiges Beispiel für eine Javascript-Funktion, mit der mehrere in einem JSONObject definierte Marker zugelassen werden.
Es werden nur die Markierungen angezeigt, die sich in den Grenzen der Karte befinden.
Dies ist wichtig, damit Sie keine zusätzliche Arbeit leisten.
Sie können auch eine Begrenzung für die Markierungen festlegen, damit keine extreme Anzahl von Markierungen angezeigt wird (wenn die Möglichkeit besteht, dass etwas in Ihrer Verwendung enthalten ist).
Es werden auch keine Markierungen angezeigt, wenn sich die Mitte der Karte nicht mehr als 500 Meter geändert hat.
Dies ist wichtig, da Sie nicht möchten, dass die Karte die Markierungen neu lädt, wenn ein Benutzer auf die Markierung klickt und dabei versehentlich die Karte zieht.
Ich habe diese Funktion an den Listener für inaktive Ereignisse für die Karte angehängt, sodass Markierungen nur angezeigt werden, wenn die Karte inaktiv ist, und die Markierungen nach einem anderen Ereignis erneut angezeigt werden.
Im Action-Screenshot gibt es eine kleine Änderung im Screenshot, die mehr Inhalt im Infofenster zeigt. von pastbin.com eingefügt
quelle
Hier ist ein Beispiel für mehrere Marker in Reactjs .
Unten ist die Kartenkomponente
quelle