In questa pagina viene descritta l'utilità di clustering degli indicatori disponibile nella libreria di utilità per Maps SDK for iOS.
Il raggruppamento degli indicatori consente di inserire un numero elevato di indicatori su una mappa senza renderla difficile da leggere. L'utilità di raggruppamento degli indicatori consente di gestire più indicatori a diversi livelli di zoom.
Quando un utente visualizza la mappa a un livello di zoom elevato, i singoli indicatori vengono visualizzati sulla mappa. Quando l'utente diminuisce lo zoom, gli indicatori vengono riuniti in cluster per facilitare la visualizzazione della mappa.
Il seguente screenshot mostra lo stile predefinito dei cluster di indicatori:
Di seguito è riportato un esempio di cluster di indicatori personalizzati:
Prerequisiti e note
Libreria di utilità di Maps SDK for iOS
L'utilità di clustering degli indicatori fa parte della libreria di utilità di Maps SDK for iOS. Se non hai ancora configurato la libreria, segui la guida alla configurazione prima di leggere il resto di questa pagina.
Per un rendimento ottimale, il numero massimo consigliato di indicatori è 10.000.
Autorizzazione di accesso alla posizione
In questo esempio viene utilizzato il GPS del dispositivo per individuare l'utente e la mappa in base alle sue coordinate. Per abilitare
questa operazione, devi aggiungere una descrizione all'autorizzazione NSLocationWhenInUseUsageDescription
nel file Info.plist
del progetto.
Per aggiungerlo:
- Fai clic sul file
Info.plist
nel navigatore dei progetti in Xcode per aprire l'editor dell'elenco delle proprietà. - Fai clic sull'icona "+" accanto a "Elenco proprietà informazioni" per aggiungere una nuova proprietà.
- Nel campo "chiave", digita "NSLocationWhenInUseUsageDescription". Xcode lo tradurrà automaticamente nel nome lungo "Privacy - Location When In Use Usage Description". Per un elenco completo delle possibili proprietà di autorizzazione di accesso alla posizione, consulta la sezione Richiedere l'autorizzazione per i servizi di geolocalizzazione nella documentazione per gli sviluppatori Apple.
- Lascia il campo "Type" impostato su "String".
- Nel campo "Valore", digita una descrizione del motivo per cui l'app richiede l'utilizzo della posizione dell'utente. Ad esempio, "Individua l'utente per fornire schede di attività commerciali nelle vicinanze".
Implementazione del clustering di indicatori
L'implementazione del clustering di indicatori richiede tre passaggi:
- Crea un'istanza del gestore di cluster.
- Passa gli indicatori che vuoi raggruppare alla gestione del cluster.
- Richiama il gestore dei cluster.
Creazione del gestore di cluster
Per utilizzare il gestore del cluster, segui questi passaggi:
- Imposta
ViewController
in cui viene visualizzata la mappa in modo che sia conforme al protocolloGMSMapViewDelegate
. - Crea un'istanza di
GMUClusterManager
. - Passa l'istanza di
GMSMapView
in cui vuoi implementare il clustering degli indicatori e le implementazioni dei seguenti protocolli all'istanzaGMUClusterManager
:GMUClusterIconGenerator
: fornisce la logica dell'applicazione che recupera le icone del cluster da utilizzare a diversi livelli di zoom.GMUClusterAlgorithm
: specifica un algoritmo che determina il comportamento del raggruppamento degli indicatori, ad esempio la distanza tra gli indicatori da includere nello stesso cluster.GMUClusterRenderer
: fornisce la logica dell'applicazione che gestisce il rendering effettivo delle icone dei cluster sulla mappa.
- Imposta il delegato della mappa sull'istanza
GMUClusterManager
.
La libreria di utilità include le implementazioni predefinite del generatore di icone (GMUDefaultClusterIconGenerator
), dell'algoritmo (GMUNonHierarchicalDistanceBasedAlgorithm
) e del renderer (GMUDefaultClusterRenderer
). Se vuoi, puoi creare il generatore di icone, l'algoritmo e il renderer personalizzati.
Il codice seguente crea un gestore di cluster utilizzando queste impostazioni predefinite nel callback viewDidLoad
di ViewController
:
Swift
import GoogleMaps import GoogleMapsUtils class MarkerClustering: UIViewController, GMSMapViewDelegate { private var mapView: GMSMapView! private var clusterManager: GMUClusterManager! override func viewDidLoad() { super.viewDidLoad() // Set up the cluster manager with the supplied icon generator and // renderer. let iconGenerator = GMUDefaultClusterIconGenerator() let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm() let renderer = GMUDefaultClusterRenderer(mapView: mapView, clusterIconGenerator: iconGenerator) clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, renderer: renderer) // Register self to listen to GMSMapViewDelegate events. clusterManager.setMapDelegate(self) // ... } // ... }
Objective-C
@import GoogleMaps; @import GoogleMapsUtils; @interface MarkerClustering () <GMSMapViewDelegate> @end @implementation MarkerClustering { GMSMapView *_mapView; GMUClusterManager *_clusterManager; } - (void)viewDidLoad { [super viewDidLoad]; // Set up the cluster manager with a supplied icon generator and renderer. id<GMUClusterAlgorithm> algorithm = [[GMUNonHierarchicalDistanceBasedAlgorithm alloc] init]; id<GMUClusterIconGenerator> iconGenerator = [[GMUDefaultClusterIconGenerator alloc] init]; id<GMUClusterRenderer> renderer = [[GMUDefaultClusterRenderer alloc] initWithMapView:_mapView clusterIconGenerator:iconGenerator]; _clusterManager = [[GMUClusterManager alloc] initWithMap:_mapView algorithm:algorithm renderer:renderer]; // Register self to listen to GMSMapViewDelegate events. [_clusterManager setMapDelegate:self]; // ... } // ... @end
Aggiunta di indicatori
Esistono due modi per aggiungere gli indicatori allo strumento per il raggruppamento di indicatori: singolarmente o in un array.
Indicatore singolo
Swift
let position = CLLocationCoordinate2D(latitude: 47.60, longitude: -122.33) let marker = GMSMarker(position: position) clusterManager.add(marker)
Objective-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(47.60, -122.33); GMSMarker *marker = [GMSMarker markerWithPosition:position]; [_clusterManager addItem:marker];
Array di indicatori
Swift
let position1 = CLLocationCoordinate2D(latitude: 47.60, longitude: -122.33) let marker1 = GMSMarker(position: position1) let position2 = CLLocationCoordinate2D(latitude: 47.60, longitude: -122.46) let marker2 = GMSMarker(position: position2) let position3 = CLLocationCoordinate2D(latitude: 47.30, longitude: -122.46) let marker3 = GMSMarker(position: position3) let position4 = CLLocationCoordinate2D(latitude: 47.20, longitude: -122.23) let marker4 = GMSMarker(position: position4) let markerArray = [marker1, marker2, marker3, marker4] clusterManager.add(markerArray)
Objective-C
CLLocationCoordinate2D position1 = CLLocationCoordinate2DMake(47.60, -122.33); GMSMarker *marker1 = [GMSMarker markerWithPosition:position1]; CLLocationCoordinate2D position2 = CLLocationCoordinate2DMake(47.60, -122.46); GMSMarker *marker2 = [GMSMarker markerWithPosition:position2]; CLLocationCoordinate2D position3 = CLLocationCoordinate2DMake(47.30, -122.46); GMSMarker *marker3 = [GMSMarker markerWithPosition:position3]; CLLocationCoordinate2D position4 = CLLocationCoordinate2DMake(47.20, -122.23); GMSMarker *marker4 = [GMSMarker markerWithPosition:position4]; NSArray<GMSMarker *> *markerArray = @[marker1, marker2, marker3, marker4]; [_clusterManager addItems:markerArray];
Richiamo del clusterer di indicatori
Dopo aver creato il clusterer di indicatori e passato gli indicatori che vuoi raggruppare, tutto ciò che devi fare è chiamare il metodo cluster
sulla tua istanza di clusterer di indicatori.
Swift
clusterManager.cluster()
Objective-C
[_clusterManager cluster];
Gestire gli eventi su indicatori e cluster
In generale, quando utilizzi l'SDK Maps per iOS, per ascoltare gli eventi sulla mappa devi implementare il protocollo GMSMapViewDelegate
. Puoi rimanere in ascolto degli eventi mappa, ma non rimanere in ascolto degli eventi di gestione dei cluster a prova di tipo. Quando l'utente tocca un indicatore, un singolo elemento del cluster o un cluster, l'API attiva mapView:didTapMarker:
e collega i dati del cluster aggiuntivi alla proprietà marker.userData
. Puoi quindi verificare se userData
è conforme al protocollo GMUCluster
per determinare se è stato toccato un'icona di cluster o un indicatore.
Swift
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool { // center the map on tapped marker mapView.animate(toLocation: marker.position) // check if a cluster icon was tapped if marker.userData is GMUCluster { // zoom in on tapped cluster mapView.animate(toZoom: mapView.camera.zoom + 1) NSLog("Did tap cluster") return true } NSLog("Did tap a normal marker") return false }
Objective-C
- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker { // center the map on tapped marker [_mapView animateToLocation:marker.position]; // check if a cluster icon was tapped if ([marker.userData conformsToProtocol:@protocol(GMUCluster)]) { // zoom in on tapped cluster [_mapView animateToZoom:_mapView.camera.zoom + 1]; NSLog(@"Did tap cluster"); return YES; } NSLog(@"Did tap marker in cluster"); return NO; }
Il gestore di cluster ora intercetta tutti gli eventi che hai implementato su
clusterManager
. Inoltra tutti gli eventi rimanenti al delegato della mappa, se fornito. Tieni presente che gli eventi per gli indicatori standard (ovvero gli indicatori non generati dal renderer del cluster) vengono sempre inoltrati al delegato della mappa.
Personalizza il raggruppamento degli indicatori
Puoi fornire un'implementazione personalizzata per
GMUClusterRenderer
, GMUClusterIconGenerator
o
GMUClusterAlgorithm
. Puoi basare la tua implementazione personalizzata sull'implementazione di esempio di questi protocolli inclusi nella libreria di utilità oppure programmare un'implementazione completamente personalizzata soddisfacendo i protocolli.