Trochę utknęło na tym. Pobieram listę współrzędnych geograficznych przez JSON i umieszczam je na mapie google. Wszystko działa dobrze, z wyjątkiem przypadku, gdy mam dwa lub więcej znaczników dokładnie w tym samym miejscu. API wyświetla tylko 1 znacznik - górny. Przypuszczam, że jest to w porządku, ale chciałbym znaleźć sposób, aby jakoś je wszystkie wyświetlić.
Przeszukałem google i znalazłem kilka rozwiązań, ale w większości wydają się one być przeznaczone dla wersji 2 interfejsu API lub po prostu nie są tak świetne. Idealnie byłoby, gdybyś kliknął jakiś znacznik grupy, a następnie pokazał znaczniki zgrupowane wokół miejsca, w którym się wszyscy znajdują.
Czy ktoś miał ten lub podobny problem i chciałby podzielić się rozwiązaniem?
źródło
OverlappingMarkerSpiderfier
w połączeniu z MarkerClusterer, dobrą opcją jest ustawieniemaxZoom
opcji w konstruktorze klastra. Spowoduje to usunięcie klastrów ze znaczników po określonym poziomie powiększenia.Przesuwanie znaczników nie jest prawdziwym rozwiązaniem, jeśli znajdują się w tym samym budynku. To, co możesz chcieć zrobić, to zmodyfikować markerclusterer.js w następujący sposób:
Dodaj prototypową metodę click w klasie MarkerClusterer, tak jak to pokazano - zastąpimy to później w funkcji inicjalizacji mapy ():
W klasie ClusterIcon dodaj następujący kod PO wyzwalaczu clusterclick:
Następnie w funkcji initialize (), w której inicjalizujesz mapę i deklarujesz obiekt MarkerClusterer:
Gdzie multiChoice () to TWOJA (jeszcze nie napisana) funkcja wyskakująca okno InfoWindow z listą opcji do wyboru. Zauważ, że obiekt markerClusterer jest przekazywany do twojej funkcji, ponieważ będziesz potrzebować tego do określenia, ile znaczników znajduje się w tym klastrze. Na przykład:
źródło
Użyłem tego razem z jQuery i spełnia swoje zadanie:
źródło
Rozwijając odpowiedź Chaoleya , zaimplementowałem funkcję, która mając listę lokalizacji (obiektów z
lng
ilat
właściwości), których współrzędne są dokładnie takie same, nieco odsuwa je od ich pierwotnego położenia (modyfikując obiekty w miejscu). Następnie tworzą ładny okrąg wokół punktu środkowego.Zauważyłem, że dla mojej szerokości geograficznej (52 stopnie północy) promień okręgu 0,0003 działa najlepiej i że po przeliczeniu na kilometry należy nadrobić różnicę między stopniami szerokości i długości geograficznej. Można znaleźć przybliżone konwersji dla szerokości geograficznej tutaj .
źródło
37.68625400000000000,-75.71669800000000000
na37.686254,-75.716698
również, co jest takie samo dla wszystkich wartości ... Spodziewałem się czegoś takiego ...37.68625400000000000,-75.71669800000000000
na ...37.6862540000001234,-75.7166980000001234
37.6862540000005678,-75.7166980000005678
itd. Próbowałem też zmienić kąt.Najdoskonalsza odpowiedź @Ignatius, zaktualizowana do pracy z wersją 2.0.7 MarkerClustererPlus.
Dodaj prototypową metodę click w klasie MarkerClusterer, tak jak to pokazano - zastąpimy to później w funkcji inicjalizacji mapy ():
W klasie ClusterIcon dodaj następujący kod PO wyzwalaczu kliknięcia / kliknięcia klastra:
Następnie w funkcji initialize (), w której inicjalizujesz mapę i deklarujesz obiekt MarkerClusterer:
Gdzie multiChoice () to TWOJA (jeszcze nie napisana) funkcja wyskakująca okno InfoWindow z listą opcji do wyboru. Zauważ, że obiekt markerClusterer jest przekazywany do twojej funkcji, ponieważ będziesz potrzebować tego do określenia, ile znaczników znajduje się w tym klastrze. Na przykład:
źródło
maxZoom
problem, myślę, że jest to problem tylko wtedy, gdy nie ma ustawionego maxZoom lub maxZoom dla klastra jest większy niż powiększenie mapy. Zastąpiłem twój zakodowany na stałe ten fragment i wygląda na to, że działa ładnie: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()
Powyższe odpowiedzi są bardziej eleganckie, ale znalazłem szybki i brudny sposób, który działa naprawdę niesamowicie dobrze. Możesz to zobaczyć w akcji na www.buildinglit.com
Wszystko, co zrobiłem, to dodanie losowego przesunięcia do szerokości i długości geograficznej na mojej stronie genxml.php, więc za każdym razem zwraca nieco inne wyniki z przesunięciem za każdym razem, gdy mapa jest tworzona ze znacznikami. Brzmi to jak włamanie, ale w rzeczywistości wystarczy, że znaczniki przesuną się nieznacznie w losowym kierunku, aby można je było kliknąć na mapie, jeśli nachodzą na siebie. Właściwie działa naprawdę dobrze, powiedziałbym, że lepiej niż metoda pająka, ponieważ kto chce poradzić sobie z tą złożonością i mieć je wszędzie. Chcesz tylko móc wybrać znacznik. Podsuwanie jej losowo działa idealnie.
Oto przykład tworzenia węzła iteracji instrukcji while w moim php_genxml.php
Zauważ, że pod szerokością i długością znajduje się przesunięcie +. z 2 zmiennych powyżej. Musiałem podzielić losowo przez 0,1000 na 10000000, aby uzyskać liczbę dziesiętną, która była losowo wystarczająco mała, aby ledwo przesuwać znaczniki. Możesz majstrować przy tej zmiennej, aby uzyskać taką, która jest bardziej precyzyjna dla Twoich potrzeb.
źródło
W sytuacjach, gdy w tym samym budynku znajduje się wiele usług, można nieznacznie przesunąć znaczniki (powiedzmy o 0,001 stopnia) w promieniu od rzeczywistego punktu. Powinno to również dać ładny efekt wizualny.
źródło
Jest to raczej „szybkie i brudne” rozwiązanie, podobne do tego, które sugeruje Matthew Fox, tym razem przy użyciu JavaScript.
W JavaScript możesz po prostu przesunąć szerokość i długość wszystkich swoich lokalizacji, dodając małe losowe przesunięcie do obu np
myLocation[i].Latitude+ = (Math.random() / 25000)
(Odkryłem, że dzieląc przez 25000 zapewnia wystarczającą separację, ale nie przesuwa znacznika znacząco z dokładnej lokalizacji, np. Konkretnego adresu)
Daje to całkiem niezłą robotę polegającą na równoważeniu ich od siebie, ale dopiero po dokładnym powiększeniu. Po pomniejszeniu nadal nie będzie jasne, że istnieje wiele opcji lokalizacji.
źródło
Sprawdź Marker Clusterer for V3 - ta biblioteka skupia pobliskie punkty w znaczniku grupy. Mapa powiększa się po kliknięciu klastrów. Wyobrażam sobie, że po bezpośrednim powiększeniu nadal miałbyś ten sam problem ze znacznikami w tym samym miejscu.
źródło
Zaktualizowano do pracy z MarkerClustererPlus.
źródło
Lubię proste rozwiązania, więc oto moje. Zamiast modyfikować bibliotekę, co utrudniłoby jej utrzymanie. możesz po prostu obejrzeć to wydarzenie
wtedy możesz nim zarządzać
i, tj. użyłem bootstrap, aby wyświetlić panel z listą. co uważam za znacznie wygodniejsze i bardziej użyteczne niż spiderfing w „zatłoczonych” miejscach. (jeśli używasz klastra, są szanse, że skończysz z kolizjami po spiderfy). tam też możesz sprawdzić powiększenie.
przy okazji. Właśnie znalazłem ulotkę i wydaje się, że działa znacznie lepiej, klaster ORAZ spiderfy działa bardzo płynnie http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.10000.html i jest open-source.
źródło
Sprawdź to: https://github.com/plank/MarkerClusterer
To jest MarkerCluster zmodyfikowany tak, aby miał infoWindow w znaczniku klastra, gdy masz kilka znaczników w tej samej pozycji.
Możesz zobaczyć, jak to działa, tutaj: http://culturedays.ca/en/2013-activities
źródło
Rozwijając odpowiedzi podane powyżej, po prostu upewnij się, że ustawiłeś opcję maxZoom podczas inicjalizacji obiektu mapy.
źródło
Podanie przesunięcia sprawi, że znaczniki będą daleko, gdy użytkownik powiększy do maks. Więc znalazłem sposób, aby to osiągnąć. może to nie jest właściwy sposób, ale działał bardzo dobrze.
ustaw zIndex znacznika tak, aby na górze była widoczna ikona markera, którą chcesz zobaczyć, w przeciwnym razie będzie animować znaczniki, jak automatyczna zamiana. gdy użytkownik dotknie markera, uchwyć zIndex, aby przenieść marker na górę za pomocą zIndex Swap.
źródło
Jak sobie z tym poradzić ... [Swift]
Czy ma powstać nowy znacznik? sprawdź
clusterArray
i manipuluj jego przesunięciemwynik
źródło
Dodając do podstępnej, genialnej odpowiedzi Matthew Foxa, dodałem małe losowe przesunięcie do każdej szerokości i lng podczas ustawiania obiektu znacznika. Na przykład:
źródło
Rozszerzając powyższe odpowiedzi, gdy otrzymałeś połączone łańcuchy, nie dodaną / odjętą pozycję (np. "37.12340-0.00069"), przekonwertuj oryginalną szerokość / długość geograficzną na zmiennoprzecinkowe, np. Za pomocą parseFloat (), a następnie dodaj lub odejmij poprawki.
źródło