Jest to najprostszy sposób, w jaki mogę to sprowadzić do:
<!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>
👨💻 Edytuj / rozwidlaj na Codepen →
ZRZUT EKRANU
Podczas przekazywania argumentu wywołania zwrotnego do addListener
metody zachodzi pewna magia zamknięcia . Może to być dość trudny temat, jeśli nie wiesz, jak działają zamknięcia. Jeśli tak jest, sugeruję przejrzenie następującego artykułu Mozilli, aby uzyskać krótkie wprowadzenie:
Dev Centrum deweloperów Mozilla: Praca z zamknięciami
InfoWindow
do właściwości Markera, a następnie wywołać.open()
sam InfoWindow. Chciałbym zamieścić tutaj zmiany, ale modyfikacje były na tyle duże, że opublikowałem własną odpowiedź .new MarkerClusterer()
do masowego spadku wydajności? Sprawdź odpowiedź ChirsSwires.Oto kolejny przykład ładowania wielu markerów unikatowym
title
iinfoWindow
tekstowym. Testowane z najnowszym API Google Maps V3.11.Zrzut ekranu z 250 markerów:
Automatycznie randomizuje Lat / Lng, aby był wyjątkowy. Ten przykład będzie bardzo pomocny, jeśli chcesz przetestować markery i wydajność 500, 1000, xxx.
źródło
infoWindow
dla każdego znacznika i nie ukryje drugiego,infoWindow
jeśli jest aktualnie wyświetlany. to naprawdę pomocne :)new MarkerClusterer()
do masowego popiersia wydajności? Sprawdź odpowiedź ChirsSwires.Pomyślałem, że umieszczę to tutaj, ponieważ wydaje się, że jest popularnym miejscem lądowania dla tych, którzy zaczynają korzystać z API Google Maps. Wiele znaczników renderowanych po stronie klienta jest prawdopodobnie wadą wielu aplikacji mapujących pod względem wydajności. Trudno jest przeprowadzić analizę porównawczą, naprawić, aw niektórych przypadkach nawet ustalić, że występuje problem (z powodu różnic w implementacji przeglądarki, sprzętu dostępnego dla klienta, urządzeń mobilnych, lista jest długa).
Najprostszym sposobem na rozwiązanie tego problemu jest użycie rozwiązania klastrowania markerów. Podstawową ideą jest grupowanie geograficznie podobnych lokalizacji w grupę z liczbą wyświetlanych punktów. Gdy użytkownik przybliża mapę, grupy te rozszerzają się, odsłaniając poszczególne markery poniżej.
Być może najłatwiejszym do zaimplementowania jest biblioteka markerclusterer . Podstawowa implementacja wyglądałaby następująco (po zaimportowaniu biblioteki):
Znaczniki zamiast dodawać bezpośrednio do mapy, są dodawane do tablicy. Ta tablica jest następnie przekazywana do biblioteki, która obsługuje skomplikowane obliczenia, i dołączana do mapy.
Wdrożenia te nie tylko znacznie zwiększają wydajność po stronie klienta, ale także w wielu przypadkach prowadzą do prostszego i mniej zaśmieconego interfejsu użytkownika oraz łatwiejszego trawienia danych na większą skalę.
Inne implementacje są dostępne od Google.
Mam nadzieję, że to pomoże niektórym z nich poznać niuanse mapowania.
źródło
Wersja asynchroniczna:
źródło
Pełny przykład roboczy. Możesz po prostu skopiować, wkleić i użyć.
źródło
Z próbek interfejsu API Google Map :
źródło
Oto kolejna wersja, którą napisałem, aby zapisać nieruchomość na mapie, która umieszcza wskaźnik okna informacyjnego na aktualnej długości i długości znacznika, jednocześnie tymczasowo ukrywając znacznik podczas wyświetlania okna informacyjnego.
Eliminuje to również standardowe przypisanie „znacznika” i przyspiesza przetwarzanie, bezpośrednio przypisując nowy znacznik do tablicy znaczników podczas tworzenia znaczników. Zauważ jednak, że dodatkowe właściwości zostały dodane zarówno do znacznika, jak i okna informacyjnego, więc to podejście jest trochę niekonwencjonalne ... ale to ja!
W tych pytaniach dotyczących okna informacyjnego nigdy nie jest wspomniane, że standardowe okno informacyjne NIE JEST umieszczane na szerokości i długości punktu znacznika, ale raczej na górze obrazu znacznika. Aby to działało, widoczność znacznika musi być ukryta, w przeciwnym razie interfejs API Map Google ponownie umieści kotwicę informacyjną z powrotem na górze obrazu znacznika.
Odniesienia do znaczników w tablicy „znaczników” są tworzone natychmiast po deklaracji znaczników dla wszelkich dodatkowych zadań przetwarzania, które mogą być później potrzebne (ukrywanie / pokazywanie, chwytanie współrzędnych itp.). To oszczędza dodatkowego kroku przypisywania obiektu znacznika do „znacznika”, a następnie popychania „znacznika” do tablicy znaczników ... dużo niepotrzebnego przetwarzania w mojej książce.
W każdym razie, inne spojrzenie na okna informacyjne, i mam nadzieję, że pomoże ci to informować i inspirować.
Oto działający JSFiddle
Uwaga dodatkowa
Zauważysz w podanych przykładowych danych Google czwarte miejsce w tablicy „lokalizacje” z numerem. Biorąc to pod uwagę w tym przykładzie, możesz również użyć tej wartości dla identyfikatora znacznika zamiast bieżącej wartości pętli, tak aby ...
źródło
Zaakceptowana odpowiedź, przepisana w ES6:
źródło
Link źródłowy
Link demonstracyjny
Uzupełnij kod HTML
źródło
closeOtherInfo
, że nie znalazłem przyzwoitego rozwiązania do pracy z Merkercluster, dopóki nie udzielisz odpowiedzi. :)Dodaj znacznik w swoim programie jest bardzo łatwe. Możesz po prostu dodać ten kod:
Następujące pola są szczególnie ważne i często ustawiane podczas konstruowania znacznika:
position
(wymagane) określa LatLng identyfikujący początkową lokalizację znacznika. Jednym ze sposobów wyszukiwania LatLng jest użycie usługi Geokodowania .map
(opcjonalnie) określa mapę, na której ma zostać umieszczony znacznik. Jeśli nie określisz mapy budowy znacznika, znacznik zostanie utworzony, ale nie zostanie dołączony (lub wyświetlony) na mapie. Możesz dodać znacznik później, wywołującsetMap()
metodę znacznika .Zauważ , że w przykładzie pole tytułu ustawia tytuł znacznika, który pojawi się jako podpowiedź.
Możesz zapoznać się z dokumentacją Google API tutaj .
To kompletny przykład ustawienia jednego znacznika na mapie. Bądź ostrożny, musisz zastąpić
YOUR_API_KEY
go kluczem API Google :Teraz, jeśli chcesz narysować znaczniki tablicy na mapie, powinieneś zrobić tak:
Ten przykład daje mi następujący wynik:
Możesz również dodać infoWindow do swojego kodu PIN. Potrzebujesz tylko tego kodu:
Możesz mieć dokumentację Google o infoWindows tutaj .
Teraz możemy otworzyć okno informacji, gdy znacznik ma postać „clik” w następujący sposób:
Pamiętaj , że możesz mieć trochę dokumentacji
Listener
tutaj w Google Developers.I wreszcie, możemy wykreślić infoWindow w markerze, jeśli użytkownik go kliknie. To jest mój pełny kod:
Zwykle powinieneś otrzymać ten wynik:
źródło
W odpowiedzi na odpowiedź Daniela Vassallo , oto wersja, która w prostszy sposób zajmuje się kwestią zamknięcia.
Ponieważ ponieważ wszystkie znaczniki będą miały indywidualne InfoWindow, a ponieważ JavaScript nie ma znaczenia, jeśli dodasz dodatkowe właściwości do obiektu, wszystko, co musisz zrobić, to dodać InfoWindow do właściwości Markera, a następnie wywołać sam
.open()
z niego InfoWindow !Edycja: Przy wystarczającej ilości danych ładowanie strony może zająć dużo czasu, więc zamiast budować InfoWindow ze znacznikiem, konstrukcja powinna się odbywać tylko w razie potrzeby. Zauważ, że wszelkie dane użyte do budowy InfoWindow muszą być dołączone do Markera jako właściwość (
data
). Pamiętaj również, że po pierwszym zdarzeniu kliknięciainfoWindow
pozostanie on jako właściwość jego znacznika, więc przeglądarka nie musi się stale odtwarzać.źródło
Oto prawie kompletna przykładowa funkcja javascript, która pozwoli na wiele markerów zdefiniowanych w JSONObject.
Wyświetla tylko znaczniki znajdujące się w granicach mapy.
Jest to ważne, abyś nie wykonywał dodatkowej pracy.
Możesz także ustawić limit znaczników, aby nie wyświetlać ekstremalnej ilości znaczników (jeśli istnieje możliwość użycia czegoś);
nie będzie również wyświetlać znaczników, jeśli środek mapy nie zmienił się więcej niż 500 metrów.
Jest to ważne, ponieważ jeśli użytkownik kliknie znacznik i przypadkowo przeciągnie mapę, robiąc to, nie chcesz, aby mapa ponownie załadowała znaczniki.
Podłączyłem tę funkcję do nasłuchiwania zdarzeń bezczynności mapy, aby znaczniki były wyświetlane tylko wtedy, gdy mapa jest bezczynna, i ponownie wyświetlają znaczniki po innym zdarzeniu.
W zrzucie ekranu akcji jest niewielka zmiana w zrzucie ekranu pokazującym więcej treści w oknie informacyjnym. wklejony z pastbin.com
źródło
Oto przykład wielu markerów w Reactjs .
Poniżej znajduje się element mapy
źródło