In questa pagina viene descritta l'utilità di raggruppamento degli indicatori disponibile nella libreria di utilità per Maps SDK for iOS.
Raggruppando gli indicatori, puoi inserirne numerosi sulla mappa senza rendere la mappa difficile da leggere. L'utilità di raggruppamento degli indicatori gestire più indicatori a diversi livelli di zoom.
Quando un utente visualizza la mappa con un livello di zoom elevato, la singola gli indicatori vengono visualizzati sulla mappa. Quando l'utente diminuisce lo zoom, gli indicatori si radunano in cluster, per semplificare la visualizzazione della mappa.
Il seguente screenshot mostra lo stile predefinito dei gruppi 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 raggruppamento degli indicatori fa parte SDK Maps per iOS Libreria di utilità. Se non hai ancora configurato la libreria, segui la guida alla configurazione prima di leggere il resto di questa pagina.
Per prestazioni ottimali, il numero massimo consigliato di indicatori è 10.000.
Autorizzazione di accesso alla posizione
Questo esempio utilizza il GPS del dispositivo per individuare l'utente e la mappa sulle sue coordinate. Per attivare
devi aggiungere una descrizione all'autorizzazione NSLocationWhenInUseUsageDescription
nel file Info.plist
del progetto.
Per aggiungerlo, segui questi passaggi:
- Fai clic sul file
Info.plist
nel navigatore dei progetti in Xcode per aprire lo Editor elenco proprietà. - Fai clic sul segno "+" icona accanto a "Elenco proprietà delle informazioni" per aggiungere una nuova proprietà.
- Nella chiave digita "NSLocationWhenInUseUsageDescription". Xcode esegue automaticamente traduci questo nel nome lungo "Privacy - Location When in Use Use Description". Per un l'elenco completo delle possibili proprietà delle autorizzazioni di accesso alla posizione; consulta Richiedere l'autorizzazione per i servizi di geolocalizzazione nella documentazione per gli sviluppatori Apple.
- Lascia il campo "Type". impostato su "Stringa".
- Nella sezione "Valore" scrivi una descrizione del motivo per cui la tua app richiede l'utilizzo del la località dell'utente. Ad esempio, "Individua l'utente di fornire schede di attività commerciali nelle vicinanze".
Implementazione del clustering degli indicatori
L'implementazione del raggruppamento degli indicatori richiede tre passaggi:
- Crea un'istanza di gestore del cluster.
- Passa gli indicatori che vuoi raggruppare al gestore degli ammassi.
- Richiama il gestore del cluster.
Creazione del gestore del cluster
Per utilizzare il gestore di cluster, segui questi passaggi:
- Imposta
ViewController
in cui la mappa viene visualizzata in modo che sia conforme alleGMSMapViewDelegate
. - Crea un'istanza di
GMUClusterManager
. - Supera l'istanza di
GMSMapView
per cui vuoi implementare il clustering di indicatori in e le implementazioni dei seguenti protocolli all'istanzaGMUClusterManager
:- .
GMUClusterIconGenerator
: fornisce la logica dell'applicazione che recupera i cluster da utilizzare a diversi livelli di zoom.GMUClusterAlgorithm
: specifica un algoritmo che determina il comportamento di come sono raggruppati gli indicatori, ad esempio la distanza tra gli indicatori da includere nello stesso cluster.GMUClusterRenderer
: fornisce la logica dell'applicazione che gestisce gli effettivi delle icone dei cluster sulla mappa.
- Imposta il delegato della mappa sull'istanza
GMUClusterManager
.
La libreria di utilità include implementazioni predefinite del generatore di icone (GMUDefaultClusterIconGenerator
),
algoritmo (GMUNonHierarchicalDistanceBasedAlgorithm
) e renderer (GMUDefaultClusterRenderer
).
Facoltativamente, puoi creare un generatore di icone di clustrering, un algoritmo e un renderer personalizzati.
Il codice seguente crea un gestore di cluster utilizzando queste impostazioni predefinite in viewDidLoad
callback 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
Aggiungere indicatori
Esistono due modi per aggiungere gli indicatori al 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];
Serie 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 dell'ammasso di indicatori
Una volta creato l'ammasso di indicatori e passati gli indicatori che desideri raggruppare,
devi chiamare il metodo cluster
sull'istanza del clusterer di indicatori.
Swift
clusterManager.cluster()
Objective-C
[_clusterManager cluster];
Gestire gli eventi su indicatori e cluster
In generale, quando utilizzi Maps SDK for iOS, per ascoltare gli eventi sulla mappa devi implementare
GMSMapViewDelegate
protocollo. Puoi ascoltare
mappare gli eventi, ma non puoi
di rimanere in ascolto degli eventi di gestione
del cluster con sicurezza per tipo. Quando l'utente tocca un indicatore,
un singolo elemento, o un cluster, l'API attiva
mapView:didTapMarker:
e collega i dati aggiuntivi del cluster al
proprietà marker.userData
. Dopodiché puoi verificare se userData
è conforme alle
Il protocollo GMUCluster
per determinare se è stato toccato un'icona di un 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; }
Ora il gestore del cluster intercetta tutti gli eventi che hai implementato
clusterManager
. Inoltra eventuali eventi rimanenti alla mappa.
delegato, se disponibile. 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 clustering 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 nell'utilità
oppure puoi programmare un'implementazione completamente personalizzata completando la
protocolli.