Halaman ini menjelaskan utilitas pengelompokan penanda yang tersedia di library utilitas untuk Maps SDK for iOS.
Dengan mengelompokkan penanda, Anda dapat menempatkan banyak penanda di peta tanpa menyulitkan pembacaan peta. Utilitas pengelompokan penanda ini membantu Anda mengelola banyak penanda di berbagai tingkat zoom.
Jika pengguna menampilkan peta pada tingkat zoom yang tinggi, setiap penanda akan ditampilkan di peta. Jika pengguna memperkecil tampilan, semua penanda akan menyatu menjadi cluster, agar peta lebih mudah ditampilkan.
Tangkapan layar berikut menampilkan gaya default cluster marker:

Berikut ini adalah contoh cluster marker khusus:

Prasyarat dan catatan
Library Utilitas Maps SDK for iOS
Utilitas pengelompokan penanda adalah bagian dari Library Utilitas Maps SDK for iOS. Jika Anda belum menyiapkan library, ikuti panduan penyiapan sebelum membaca bagian lainnya dari halaman ini.
Untuk kinerja terbaik, jumlah maksimum marker yang disarankan adalah 10.000.
Izin akses lokasi
Contoh ini menggunakan GPS perangkat untuk menemukan pengguna dan peta di koordinatnya. Untuk mengaktifkannya, Anda harus menambahkan deskripsi ke izin NSLocationWhenInUseUsageDescription
dalam file Info.plist
project.
Untuk menambahkannya, lakukan hal berikut:
- Klik file
Info.plist
di Project Navigator di Xcode untuk membuka Editor Daftar Properti. - Klik ikon '+' di samping 'Daftar Properti Informasi' untuk menambahkan properti baru.
- Di bidang 'key' ketik 'NSLocationWhenInUseUsageDescription'. Xcode akan otomatis menerjemahkannya ke nama panjang 'Privasi - Lokasi Saat Digunakan Penggunaan Deskripsi'. Untuk daftar lengkap properti izin lokasi yang memungkinkan, lihat Meminta Otorisasi untuk Layanan Lokasi dalam dokumentasi Apple Developer.
- Biarkan bidang 'Jenis' disetel ke 'String'.
- Di kolom 'Nilai' ketik deskripsi alasan aplikasi Anda mewajibkan penggunaan lokasi pengguna. Misalnya, "Menemukan pengguna untuk menyediakan listingan bisnis di sekitar."
Menerapkan pengelompokan penanda
Menerapkan pengelompokan penanda memerlukan tiga langkah:
- Buat instance pengelola cluster.
- Teruskan penanda yang ingin Anda kelompokkan ke pengelola cluster.
- Memanggil pengelola cluster.
Membuat pengelola cluster
Untuk menggunakan pengelola cluster, lakukan hal berikut:
- Tetapkan
ViewController
tempat peta dirender agar sesuai dengan protokolGMSMapViewDelegate
. - Buat instance
GMUClusterManager
. - Teruskan instance
GMSMapView
yang ingin Anda gunakan untuk menerapkan pengelompokan penanda, serta penerapan protokol berikut ke instanceGMUClusterManager
:GMUClusterIconGenerator
: Menyediakan logika aplikasi yang mengambil ikon cluster untuk digunakan pada tingkat zoom yang berbeda.GMUClusterAlgorithm
: Menentukan algoritme yang menentukan perilaku cara cluster dikelompokkan, seperti jarak antara penanda yang disertakan dalam cluster yang sama.GMUClusterRenderer
: Menyediakan logika aplikasi yang menangani rendering ikon cluster yang sebenarnya pada peta.
- Tetapkan delegasi peta pada instance
GMUClusterManager
.
Library utilitas menyertakan implementasi default generator ikon (GMUDefaultClusterIconGenerator
), algoritme (GMUNonHierarchicalDistanceBasedAlgorithm
), dan perender (GMUDefaultClusterRenderer
). Anda dapat membuat genertator, algoritme, dan perender ikon kustom kustom Anda sendiri.
Kode berikut membuat pengelola cluster menggunakan default berikut dalam callback viewDidLoad
dari 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
Menambahkan penanda
Ada dua cara untuk menambahkan penanda ke pengelompok penanda: satu per satu atau sebagai array.
Penanda individual
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 penanda
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];
Memanggil pengelompok penanda
Setelah membuat pengelompok penanda dan meneruskan penanda yang ingin dikelompokkan, Anda hanya perlu memanggil metode cluster
pada instance pengelompok penanda.
Swift
clusterManager.cluster()
Objective-C
[_clusterManager cluster];
Menangani kejadian pada marker dan cluster
Secara umum, saat menggunakan Maps SDK for iOS, untuk memproses peristiwa di peta, Anda harus mengimplementasikan protokol GMSMapViewDelegate
. Anda dapat memproses
peristiwa peta, tetapi tidak dapat
memproses peristiwa pengelola cluster yang aman jenisnya. Saat pengguna mengetuk penanda, item cluster individual, atau cluster, API akan memicu mapView:didTapMarker:
dan melampirkan data cluster tambahan ke properti marker.userData
. Anda kemudian dapat memeriksa apakah userData
sesuai dengan
protokol GMUCluster
untuk menentukan apakah ikon cluster atau penanda diketuk.
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; }
Pengelola cluster kini mencegat peristiwa apa pun yang telah Anda terapkan di
clusterManager
. Fitur ini meneruskan peristiwa apa pun yang tersisa ke delegasi peta, jika disediakan. Perhatikan bahwa peristiwa untuk penanda standar (yaitu, penanda yang tidak dibuat oleh perender cluster) selalu diteruskan ke delegasi peta.
Menyesuaikan pengelompokan penanda
Anda dapat menyediakan implementasi kustom untuk
GMUClusterRenderer
, GMUClusterIconGenerator
, atau
GMUClusterAlgorithm
. Anda dapat mendasarkan implementasi kustom Anda pada contoh implementasi protokol ini yang disertakan dalam library utilitas, atau Anda dapat mengkodekan implementasi kustom sepenuhnya dengan memenuhi protokol tersebut.