Marker-Clustering-Hilfsprogramm in Google Maps Android

Plattform auswählen: Android iOS JavaScript

Mithilfe von Markierungs-Clustering können Sie eine große Anzahl Markierungen auf einer Karte einfügen, ohne die Lesbarkeit der Karte zu beeinträchtigen.

Einführung

In diesem Video wird gezeigt, wie Sie Markierungs-Clustering einsetzen können, wenn für Ihre Daten eine große Anzahl Datenpunkte auf der Karte erforderlich ist.

Zum Verwalten mehrerer Markierungen auf verschiedenen Zoomstufen können Sie das Markierungs-Clustering-Dienstprogramm verwenden. Um genau zu sein, sind „Markierungen“ zu diesem Zeitpunkt eigentlich „Elemente“. Zu Markierungen werden sie erst, wenn sie gerendert werden. In diesem Dokument wird einfachheitshalber aber durchgängig von Markierungen gesprochen.

Wenn ein Nutzer die Karte mit einer hohen Zoomstufe ansieht, werden die einzelnen Markierungen auf der Karte angezeigt. Beim Herauszoomen werden die Markierungen zu Clustern zusammengefügt, um die Lesbarkeit der Karte zu verbessern. Das Markierungs-Clustering-Dienstprogramm ist Teil der Maps SDK for Android-Dienstprogrammbibliothek. Wenn Sie die Bibliothek noch nicht eingerichtet haben, folgen Sie der Anleitung im Leitfaden „Maps SDK for Android-Dienstprogramm einrichten“, bevor Sie den Rest dieser Seite lesen.

Markierungs-Cluster auf einer Karte
Markierungs-Cluster

Um das Markierungs-Clustering-Dienstprogramm zu verwenden, müssen Sie Markierungen als ClusterItem-Objekte zum ClusterManager hinzufügen. Der ClusterManager übergibt die Markierungen an den Algorithm, der sie in verschiedene Cluster umwandelt. Das Rendern erfolgt durch den ClusterRenderer, indem er Cluster und einzelne Markierungen hinzufügt und entfernt. Der ClusterRenderer und der Algorithm sind austauschbar und können angepasst werden.

Die Dienstprogrammbibliothek wird mit einer Demo-App ausgeliefert, die Beispielimplementierungen für das Markierungs-Clustering-Dienstprogramm enthält. Informationen zum Ausführen der Demo-App finden Sie im Leitfaden „Maps SDK for Android-Dienstprogramm einrichten“. Die Demo-App enthält folgende Beispiele für das Markierungs-Clustering:

  • ClusteringDemoActivity: Eine einfache Aktivität zum Veranschaulichen des Markierungs-Clusterings
  • BigClusteringDemoActivity: Clustering mit 2.000 Markierungen
  • CustomMarkerClusteringDemoActivity: Erstellen eines benutzerdefinierten Designs für Cluster-Markierungen

Einfache Markierungs-Cluster hinzufügen

Anhand der Anleitung unten können Sie einen einfachen Cluster mit zehn Markierungen erstellen. Das Ergebnis sieht so aus, wobei sich die Anzahl der dargestellten/geclusterten Markierungen abhängig von der Zoomstufe verändert:

Eine Karte mit zehn Markierungs-Clustern
Zehn Markierungs-Cluster

Hier sind die erforderlichen Schritte zusammengefasst:

  1. Implementieren Sie ClusterItem, um eine Markierung auf der Karte darzustellen. Das Clusterelement gibt die Position der Markierung als LatLng-Objekt und einen optionalen Titel oder ein optionales Snippet zurück.
  2. Fügen Sie einen neuen ClusterManager hinzu, um die Clusterelemente (Markierungen) basierend auf der Zoomstufe zu gruppieren.
  3. Sie müssen für den OnCameraIdleListener() der Karte den ClusterManager festlegen, weil der ClusterManager den Listener implementiert.
  4. Falls Sie bestimmte Funktionen angeben möchten, die ausgeführt werden sollen, wenn eine Markierung angeklickt wird, müssen Sie für den OnMarkerClickListener() der Karte den ClusterManager festlegen, weil der ClusterManager den Listener implementiert.
  5. Fügen Sie die Markierungen in den ClusterManager ein.

Hier die einzelnen Schritte im Detail: Um einen einfachen Cluster aus zehn Markierungen zu erstellen, erstellen Sie zuerst eine MyItem-Klasse, mit der ClusterItem implementiert wird.

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;
    }
}

      

Fügen Sie den ClusterManager in Ihre Kartenaktivität ein und übergeben Sie die Clusterelemente. Das Typargument <MyItem>, das den ClusterManager deklariert, muss vom Typ MyItem sein.

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);
    }
}

      

Sie können das Animieren zu Clustern beim Heran- und Herauszoomen auch deaktivieren. Die Markierungen rasten dann einfach an ihrer Position ein, anstatt sich in die Cluster hinein- und aus ihnen herauszubewegen. Zum Deaktivieren von Animationen können Sie setAnimation() im ClusterManager verwenden, wie hier gezeigt:

Kotlin



clusterManager.setAnimation(false)

      

Java


clusterManager.setAnimation(false);

      

Infofenster für einen einzelnen Markierungscluster hinzufügen

Wenn Sie ein Infofenster für bestimmte Markierungs-Cluster hinzufügen möchten, geben Sie im Konstruktor Ihrer ClusterItem-Implementierung Titel- und Snippet-Strings an.

Im folgenden Beispiel wird eine Markierung mit einem Infofenster in die Methode addItems() eingefügt, indem ein Titel und Snippet festgelegt werden:

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);

      

Markierungscluster anpassen

Der ClusterManager-Konstruktor erstellt einen DefaultClusterRenderer und einen NonHierarchicalDistanceBasedAlgorithm. Sie können den ClusterRenderer und den Algorithm mit den Methoden setAlgorithm(Algorithm<T> algorithm) und setRenderer(ClusterRenderer<T> view) vom ClusterManager ändern.

Um das Rendern der Cluster anzupassen, können Sie den ClusterRenderer implementieren. Der DefaultClusterRenderer bietet eine gute Basis für den Start. Wenn Sie den DefaultClusterRenderer abgeleitet haben, können Sie die Standardwerte überschreiben.

Ein detailliertes Beispiel für eine Anpassung finden Sie in der Demo-App, die mit der Dienstprogrammbibliothek ausgeliefert wird, unter der CustomMarkerClusteringDemoActivity.

Benutzerdefinierte Markierungs-Cluster auf einer Karte
Benutzerdefinierte Markierungscluster

Die CustomMarkerClusteringDemoActivity definiert ein eigenes Clusterelement (eine Person) und rendert es, indem der DefaultClusterRenderer als PersonRenderer erweitert wird.

Die Demo zeigt auch, wie die ClusterManager.OnClusterClickListener<Person>-Schnittstelle implementiert wird, um mehr Informationen zu der Person anzuzeigen, wenn auf den Cluster geklickt wird. Auf ähnliche Weise lässt sich auch der ClusterManager.OnClusterItemClickListener<Person> implementieren.

Informationen zum Ausführen der Demo-App finden Sie im Leitfaden „Maps SDK for Android-Dienstprogramm einrichten“.