Dzięki grupowaniu znaczników możesz umieścić na mapie dużą liczbę znaczników, co utrudnia ich czytanie.
Wstęp
Ten film omawia stosowanie grupowań znaczników, gdy dane wymagają dużej liczby punktów danych na mapie.
Narzędzie do grupowania znaczników pomaga zarządzać wieloma znacznikami na różnych poziomach powiększenia. W szczególności znacznik &&39;items' Dla jasności: dokument ten będzie się nazywał 'markers'.
Gdy użytkownik wyświetli mapę przy wysokim powiększeniu, pojawią się na niej pojedyncze znaczniki. Gdy użytkownik pomniejszy obszar, znaczniki zostaną połączone w klastry, aby ułatwić przeglądanie mapy. Narzędzie do grupowania znaczników jest częścią biblioteki SDK pakietu Android Maps. Jeśli nie masz jeszcze skonfigurowanej biblioteki, zapoznaj się z przewodnikiem po konfiguracji, zanim przeczytasz pozostałą część tej strony.

Aby użyć narzędzia do grupowania znaczników, musisz dodać znaczniki jako obiekty ClusterItem
do ClusterManager
. ClusterManager
przekazuje znaczniki do Algorithm
, co powoduje przekształcenie ich w zestaw klastrów. ClusterRenderer
dba o renderowanie, dodając i usuwając klastry oraz poszczególne znaczniki. Urządzenia ClusterRenderer
i Algorithm
można połączyć i można je dostosować.
Biblioteka narzędzi zawiera aplikację demonstracyjną, która zawiera przykładowe implementacje narzędzia do grupowania znaczników. Informacje o tym, jak uruchomić aplikację w wersji demonstracyjnej, znajdziesz w przewodniku po konfiguracji. Aplikacja demonstracyjna zawiera te przykładowe klastry znaczników:
ClusteringDemoActivity
: prosta aktywność pokazująca grupowanie znaczników.BigClusteringDemoActivity
: grupowanie z 2000 znaczników.CustomMarkerClusteringDemoActivity
: tworzenie niestandardowego projektu na potrzeby klastrów klastrów.
Dodaj prosty klaster znacznika
Aby utworzyć prosty klaster zawierający 10 znaczników, wykonaj poniższe czynności. Wynik będzie wyglądał tak: liczba wyświetlanych lub sklasyfikowanych znaczników zależy od poziomu powiększenia:

Oto podsumowanie wymaganych czynności:
- Zaimplementuj
ClusterItem
, aby zaznaczyć znaczniki na mapie. Element klastra zwraca pozycję znacznika jako obiekt LatLng oraz opcjonalny tytuł lub fragment. - Dodaj nowy obiekt
ClusterManager
, aby pogrupować elementy klastra (znaczniki) na podstawie poziomu powiększenia. - Ustaw mapę
OnCameraIdleListener()
naClusterManager
, ponieważClusterManager
implementuje detektor. - Jeśli chcesz dodać określone funkcje w odpowiedzi na zdarzenie kliknięcia znacznika, ustaw mapę
OnMarkerClickListener()
naClusterManager
, ponieważClusterManager
implementuje detektor. - Umieść znaczniki w polu
ClusterManager
.
Zapoznaj się dokładnie z krokami: aby utworzyć prosty klaster składający się z 10 znaczników, najpierw utwórz klasę MyItem
z implementacją ClusterItem
.
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; } }
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 } }
W aktywności na mapie dodaj ClusterManager
i prześlij plik danych do klastrów. Zapisz argument typu <MyItem>
, który deklaruje ClusterManager
jako typ MyItem
.
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); } }
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) } }
Możesz też wyłączyć animacje grupowania podczas powiększania i pomniejszania.
Jeśli animacja jest wyłączona, znaczniki przylegają do pozycji, a nie do wewnątrz i na zewnątrz klastrów.
Aby wyłączyć animacje, użyj właściwości setAnimation()
w ClusterManager
, jak pokazano poniżej:
Java
clusterManager.setAnimation(false);
Kotlin
clusterManager.setAnimation(false)
Dodawanie okna informacyjnego dla pojedynczego znacznika klastra
Aby dodać okno informacyjne do konkretnych klastrów, dodaj ciągi tytułu i fragmentu do konstruktora implementacji ClusterItem
.
Poniższy przykład dodaje znacznik z oknem informacyjnym w metodzie addItems()
, ustawiając tytuł i fragment:
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);
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)
Dostosuj klastry znaczników
Konstruktor ClusterManager
tworzy DefaultClusterRenderer
i NonHierarchicalDistanceBasedAlgorithm
. Możesz zmienić ClusterRenderer
i Algorithm
za pomocą setAlgorithm(Algorithm<T> algorithm)
i setRenderer(ClusterRenderer<T> view)
metod ClusterManager
.
Aby dostosować renderowanie klastrów, możesz zaimplementować ClusterRenderer
. DefaultClusterRenderer
to dobry punkt wyjścia. Możesz zastąpić wartości domyślne za pomocą DefaultClusterRenderer
.
Szczegółowy przykład dostosowania znajdziesz w narzędziu demonstracyjnym, który jest wysyłany do biblioteki narzędzi za pomocą narzędzia CustomMarkerClusteringDemoActivity
.

CustomMarkerClusteringDemoActivity
określa własny element klastra, Person
, i renderuje go, rozszerzając DefaultClusterRenderer
jako PersonRenderer
.
Wersja demonstracyjna pokazuje również, jak wdrożyć interfejs ClusterManager.OnClusterClickListener<Person>
, aby wyświetlać więcej informacji o osobie po kliknięciu. W podobny sposób możesz też zaimplementować właściwość ClusterManager.OnClusterItemClickListener<Person>
.
Informacje o tym, jak uruchomić aplikację w wersji demonstracyjnej, znajdziesz w przewodniku po konfiguracji.