Narzędzie Google do grupowania znaczników w Mapach Google na Androida

Wybierz platformę: Android iOS JavaScript

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&#39 Dla jasności: dokument ten będzie się nazywał 'markers&#39.

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.

Mapa ze znacznikami klastrów
Klasterowe znaczniki

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:

Mapa z 10 klastrami
Dziesięcioklastrowe klastry

Oto podsumowanie wymaganych czynności:

  1. Zaimplementuj ClusterItem, aby zaznaczyć znaczniki na mapie. Element klastra zwraca pozycję znacznika jako obiekt LatLng oraz opcjonalny tytuł lub fragment.
  2. Dodaj nowy obiekt ClusterManager, aby pogrupować elementy klastra (znaczniki) na podstawie poziomu powiększenia.
  3. Ustaw mapę OnCameraIdleListener() na ClusterManager, ponieważ ClusterManager implementuje detektor.
  4. Jeśli chcesz dodać określone funkcje w odpowiedzi na zdarzenie kliknięcia znacznika, ustaw mapę OnMarkerClickListener() na ClusterManager, ponieważ ClusterManager implementuje detektor.
  5. 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.

Mapa z niestandardowymi znacznikami grupowymi
Niestandardowe znaczniki grupowane

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.