Pogrupując znaczniki, możesz umieścić na mapie dużą ich liczbę dzięki czemu mapa jest nieczytelna.
Wprowadzenie
W tym filmie omówiono zastosowanie grupowania znaczników, gdy wymaga dużej liczby punktów danych na mapie.
Narzędzie do grupowania znaczników pomaga zarządzać wieloma znacznikami w różnych poziomów powiększenia. Jeśli chodzi o precyzję, „znaczniki” są w rzeczywistości elementami w tym momencie, i zostają tylko znacznikami podczas renderowania. Dla jasności: ten dokument nada im nazwę „znaczniki” przez cały czas.
Gdy użytkownik wyświetla mapę w dużym powiększeniu, wskazują na mapie. Gdy użytkownik oddala mapę, znaczniki zbierają się połączone w klastry, aby ułatwić przeglądanie mapy. Grupowanie znaczników jest częścią biblioteki narzędziowej pakietu Maps SDK. Jeśli nie masz jeszcze skonfigurowanej biblioteki, postępuj zgodnie z przewodnikiem konfiguracji przed przeczytaniem reszty tej strony.
![Mapa ze znacznikami pogrupowanymi](https://developers-dot-devsite-v2-prod.appspot.com/static/maps/documentation/android-sdk/images/utility-markercluster.png?authuser=4&hl=pl)
Aby skorzystać z narzędzia do grupowania znaczników, musisz dodać znaczniki jako
ClusterItem
obiektów do ClusterManager
.
ClusterManager
przekazuje znaczniki do: Algorithm
,
który przekształca je w zbiór klastrów. ClusterRenderer
zarządza renderowaniem, dodając i usuwając klastry
za pomocą znaczników. ClusterRenderer
i Algorithm
są
jest łatwy w użyciu i można go dostosować.
Biblioteka narzędziowa zawiera aplikację w wersji demonstracyjnej z przykładowymi implementacjami narzędzia do grupowania znaczników. Aby uzyskać pomoc dotyczącą uruchamiania aplikacji w wersji demonstracyjnej, zobacz przewodnika konfiguracji. Wersja demonstracyjna aplikacja zawiera te przykłady grupowania znaczników:
ClusteringDemoActivity
: prosta aktywność pokazująca, na grupowanie znaczników.BigClusteringDemoActivity
: grupuję z 2 000 za pomocą znaczników.CustomMarkerClusteringDemoActivity
: tworzenie projektu niestandardowego dla znaczników zbiorczych.
Dodaj prosty klaster znaczników
Wykonaj poniższe czynności, aby utworzyć prosty zbiór dziesięciu znaczników. Wynik wygląda tak, chociaż liczba wyświetlanych/grupowanych znaczników będzie zmienia się w zależności od poziomu powiększenia:
![Mapa z dziesięcioma pogrupowanymi znacznikami](https://developers-dot-devsite-v2-prod.appspot.com/static/maps/documentation/android-sdk/images/utility-markercluster-simple.png?authuser=4&hl=pl)
Oto podsumowanie wymaganych czynności:
- Wdrażaj
ClusterItem
aby reprezentować znacznik na mapie. Element klastra zwraca pozycję znacznika. jako obiekt położenia geograficznego oraz opcjonalny tytuł lub fragment. - Dodaj nowy element
ClusterManager
pogrupuj elementy klastra (znaczniki) na podstawie poziomu powiększenia. - Ustaw
OnCameraIdleListener()
mapy naClusterManager
, ponieważClusterManager
stosuje słuchacz. - Jeśli chcesz dodać określoną funkcję w odpowiedzi na kliknięcie znacznika
, ustaw
OnMarkerClickListener()
mapy naClusterManager
, ponieważClusterManager
stosuje słuchacz. - Umieść znaczniki w:
ClusterManager
.
Szczegółowa analiza: aby utworzyć prosty klaster składający się z 10 elementów:
, najpierw utwórz klasę MyItem
, która implementuje funkcję
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 ClusterManager
i nakarm go
elementów klastra. Zwróć uwagę na
typ
<MyItem>
, który deklaruje
ClusterManager
jako 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 podczas powiększania i pomniejszania.
Jeśli animacja jest wyłączona, znaczniki są przyciągane do wybranego miejsca zamiast
i migrację do klastrów.
Aby wyłączyć animacje, użyj opcji setAnimation()
w narzędziu ClusterManager
.
jak poniżej:
Kotlin
clusterManager.setAnimation(false)
Java
clusterManager.setAnimation(false);
Dodaj okno informacyjne dla pojedynczego znacznika klastra
Aby dodać okno informacyjne dla określonych znaczników, dodaj tytuł i fragment kodu do
konstruktora implementacji obiektu ClusterItem
.
Poniższy przykład dodaje znacznik z oknem informacyjnym
w metodzie addItems()
, ustawiając tytuł i fragment:
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);
Dostosuj klastry znaczników
Konstruktor ClusterManager
tworzy
DefaultClusterRenderer
i
NonHierarchicalDistanceBasedAlgorithm
Możesz zmienić
ClusterRenderer
oraz Algorithm
za pomocą funkcji setAlgorithm(Algorithm<T> algorithm)
i
setRenderer(ClusterRenderer<T> view)
metod
ClusterManager
.
Możesz zaimplementować ClusterRenderer
, aby dostosować renderowanie
i skupiać się na klastrach. DefaultClusterRenderer
to dobra baza do:
na początku. Dzięki podklasyfikacji DefaultClusterRenderer
można:
zastąpią ustawienia domyślne.
Szczegółowy przykład dostosowania znajdziesz tutaj:
CustomMarkerClusteringDemoActivity
w aplikacji w wersji demonstracyjnej, która jest wysyłana
za pomocą biblioteki narzędzi.
![Mapa z niestandardowymi znacznikami klastrowymi](https://developers-dot-devsite-v2-prod.appspot.com/static/maps/documentation/android-sdk/images/utility-markercluster-custom.png?authuser=4&hl=pl)
CustomMarkerClusteringDemoActivity
definiuje własny klaster
Person
, i renderuje go przez rozszerzenie
DefaultClusterRenderer
jako PersonRenderer
.
Pokazuje ono również, jak wdrożyć
Interfejs ClusterManager.OnClusterClickListener<Person>
do
po kliknięciu klastra wyświetli się więcej informacji o tej osobie. Dostępne opcje
również zaimplementować
ClusterManager.OnClusterItemClickListener<Person>
w:
w podobny sposób.
Aby uzyskać pomoc dotyczącą uruchamiania aplikacji w wersji demonstracyjnej, zobacz przewodnika konfiguracji.