Grupowanie znaczników pozwala umieścić na mapie dużą liczbę znaczników, nie utrudniając jej odczytania.
Wstęp
W tym filmie omawiamy wykorzystanie grupowania znaczników w sytuacji, gdy dane wymagają dużej liczby punktów danych na mapie.
Narzędzie do grupowania znaczników ułatwia zarządzanie wieloma znacznikami na różnych poziomach powiększenia. Dokładniej rzecz ujmując, w tym momencie „znaczniki” są tak naprawdę „elementami” i zmieniają się na „Znaczniki” dopiero po ich wygenerowaniu. Dla jasności w tym dokumencie będą one zatytułowane „znaczniki”.
Gdy użytkownik wyświetla mapę w dużym powiększeniu, pojedyncze znaczniki są wyświetlane na mapie. Gdy użytkownik pomniejsza widok, znaczniki zbierają się w klastry, aby ułatwić przeglądanie mapy. Narzędzie do grupowania znaczników jest częścią biblioteki narzędziowej pakietu Maps SDK na Androida. Jeśli nie masz jeszcze skonfigurowanej biblioteki, postępuj zgodnie z przewodnikiem po konfiguracji, zanim przeczytasz dalszą część tej strony.

Aby skorzystać z narzędzia do grupowania znaczników, musisz dodać znaczniki jako obiekty ClusterItem
do ClusterManager
. ClusterManager
przekazuje znaczniki do klastra Algorithm
, który przekształca je w zbiór klastrów. ClusterRenderer
zajmuje się renderowaniem – dodaje i usuwa klastry oraz poszczególne znaczniki. Urządzenia ClusterRenderer
i Algorithm
można podłączyć i dostosować.
Biblioteka narzędziowa zawiera aplikację demonstracyjną z przykładowymi implementacjami narzędzia do grupowania znaczników. Pomoc dotyczącą uruchamiania aplikacji demonstracyjnej znajdziesz w przewodniku konfiguracji. Aplikacja demonstracyjna zawiera te przykłady grupowania znaczników:
ClusteringDemoActivity
: prosta aktywność przedstawiająca grupowanie znaczników.BigClusteringDemoActivity
: klaster zawierający 2000 znaczników.CustomMarkerClusteringDemoActivity
: tworzenie niestandardowego projektu znaczników klastrów.
Dodaj prosty klaster znaczników
Wykonaj poniższe czynności, aby utworzyć prosty klaster składający się z 10 znaczników. Wynik będzie wyglądać tak, ale liczba wyświetlanych/grupowanych znaczników będzie się zmieniać w zależności od poziomu powiększenia:

Oto podsumowanie wymaganych kroków:
- Wdróż
ClusterItem
, aby reprezentować znacznik na mapie. Element klastra zwraca pozycję znacznika jako obiektu położenia geograficznego oraz opcjonalnego tytułu lub fragmentu kodu. - Dodaj nowy obiekt
ClusterManager
, aby pogrupować elementy klastra (znaczniki) według poziomu powiększenia. - Ustaw
OnCameraIdleListener()
mapy naClusterManager
, ponieważClusterManager
implementuje detektor. - Jeśli chcesz dodać określoną funkcję w odpowiedzi na zdarzenie kliknięcia znacznika, ustaw
OnMarkerClickListener()
mapy naClusterManager
, ponieważClusterManager
implementuje detektor. - Umieść znaczniki w:
ClusterManager
.
Zapoznaj się z krokami: aby utworzyć nasz prosty klaster 10 znaczników, najpierw utwórz klasę MyItem
implementującą ClusterItem
.
Kotlin
inner class MyItem( lat: Double, lng: Double, title: String, snippet: String ) : ClusterItem { private val position: LatLng private val title: String private val snippet: String override fun getPosition(): LatLng { return position } override fun getTitle(): String { return title } override fun getSnippet(): String { return snippet } override fun getZIndex(): Float { return 0f } init { position = LatLng(lat, lng) this.title = title this.snippet = snippet } }
Java
public class MyItem implements ClusterItem { private final LatLng position; private final String title; private final String snippet; public MyItem(double lat, double lng, String title, String snippet) { position = new LatLng(lat, lng); this.title = title; this.snippet = snippet; } @Override public LatLng getPosition() { return position; } @Override public String getTitle() { return title; } @Override public String getSnippet() { return snippet; } @Nullable @Override public Float getZIndex() { return 0f; } }
W aktywności na mapie dodaj obiekt ClusterManager
i przekaż go do elementów klastra. Zwróć uwagę na argument typu <MyItem>
, który deklaruje, że ClusterManager
jest typu MyItem
.
Kotlin
// Declare a variable for the cluster manager. private lateinit var clusterManager: ClusterManager<MyItem> private fun setUpClusterer() { // Position the map. map.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(51.503186, -0.126446), 10f)) // Initialize the manager with the context and the map. // (Activity extends context, so we can pass 'this' in the constructor.) clusterManager = ClusterManager(context, map) // Point the map's listeners at the listeners implemented by the cluster // manager. map.setOnCameraIdleListener(clusterManager) map.setOnMarkerClickListener(clusterManager) // Add cluster items (markers) to the cluster manager. addItems() } private fun addItems() { // Set some lat/lng coordinates to start with. var lat = 51.5145160 var lng = -0.1270060 // Add ten cluster items in close proximity, for purposes of this example. for (i in 0..9) { val offset = i / 60.0 lat += offset lng += offset val offsetItem = MyItem(lat, lng, "Title $i", "Snippet $i") clusterManager.addItem(offsetItem) } }
Java
// Declare a variable for the cluster manager. private ClusterManager<MyItem> clusterManager; private void setUpClusterer() { // Position the map. map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10)); // Initialize the manager with the context and the map. // (Activity extends context, so we can pass 'this' in the constructor.) clusterManager = new ClusterManager<MyItem>(context, map); // Point the map's listeners at the listeners implemented by the cluster // manager. map.setOnCameraIdleListener(clusterManager); map.setOnMarkerClickListener(clusterManager); // Add cluster items (markers) to the cluster manager. addItems(); } private void addItems() { // Set some lat/lng coordinates to start with. double lat = 51.5145160; double lng = -0.1270060; // Add ten cluster items in close proximity, for purposes of this example. for (int i = 0; i < 10; i++) { double offset = i / 60d; lat = lat + offset; lng = lng + offset; MyItem offsetItem = new MyItem(lat, lng, "Title " + i, "Snippet " + i); clusterManager.addItem(offsetItem); } }
Możesz też wyłączyć grupowanie animacji przy powiększaniu i pomniejszaniu.
Jeśli animacja jest wyłączona, znaczniki są przyciągane do określonych miejsc, a nie przenoszone do klastrów i poza nie.
Aby wyłączyć animacje, użyj setAnimation()
w interfejsie ClusterManager
, jak pokazano poniżej:
Kotlin
clusterManager.setAnimation(false)
Java
clusterManager.setAnimation(false);
Dodawanie okna informacyjnego dla pojedynczego znacznika w postaci klastra
Aby dodać okno informacyjne dla konkretnych klastrów znaczników, dodaj ciągi tytułu i fragmentu kodu do konstruktora implementacji ClusterItem
.
Ten przykład dodaje znacznik z oknem informacyjnym w metodzie addItems()
przez ustawienie tytułu i fragmentu kodu:
Kotlin
// Set the lat/long coordinates for the marker. val lat = 51.5009 val lng = -0.122 // Set the title and snippet strings. val title = "This is the title" val snippet = "and this is the snippet." // Create a cluster item for the marker and set the title and snippet using the constructor. val infoWindowItem = MyItem(lat, lng, title, snippet) // Add the cluster item (marker) to the cluster manager. clusterManager.addItem(infoWindowItem)
Java
// Set the lat/long coordinates for the marker. double lat = 51.5009; double lng = -0.122; // Set the title and snippet strings. String title = "This is the title"; String snippet = "and this is the snippet."; // Create a cluster item for the marker and set the title and snippet using the constructor. MyItem infoWindowItem = new MyItem(lat, lng, title, snippet); // Add the cluster item (marker) to the cluster manager. clusterManager.addItem(infoWindowItem);
Dostosowywanie klastrów znaczników
Konstruktor ClusterManager
tworzy DefaultClusterRenderer
i NonHierarchicalDistanceBasedAlgorithm
. Możesz zmienić ClusterRenderer
i Algorithm
za pomocą metod setAlgorithm(Algorithm<T> algorithm)
i setRenderer(ClusterRenderer<T> view)
obiektu ClusterManager
.
Aby dostosować renderowanie klastrów, możesz wdrożyć ClusterRenderer
. DefaultClusterRenderer
to dobry wybór na początek. Dzięki podklasyfikacji DefaultClusterRenderer
możesz zastąpić wartości domyślne.
Szczegółowy przykład dostosowania znajdziesz w CustomMarkerClusteringDemoActivity
w aplikacji demonstracyjnej wraz z biblioteką narzędzi.

CustomMarkerClusteringDemoActivity
definiuje własny element klastra (Person
) i renderuje go, rozszerzając DefaultClusterRenderer
jako PersonRenderer
.
Demonstracja pokazuje również, jak wdrożyć interfejs ClusterManager.OnClusterClickListener<Person>
, aby wyświetlać więcej informacji o osobie po kliknięciu klastra. Możesz też wdrożyć ClusterManager.OnClusterItemClickListener<Person>
w podobny sposób.
Pomoc dotyczącą uruchamiania aplikacji demonstracyjnej znajdziesz w przewodniku konfiguracji.