Bu sayfada, iOS için Haritalar SDK'sının yardımcı program kitaplığında bulunan işaretçi kümeleme yardımcı programı açıklanmaktadır.
İşaretçilerinizi gruplandırarak, haritanın okunmasını zorlaştırmadan bir haritaya çok sayıda işaretçi yerleştirebilirsiniz. İşaretçi kümeleme yardımcı programı, farklı yakınlaştırma düzeylerinde birden çok işaretçiyi yönetmenize yardımcı olur.
Bir kullanıcı haritayı yüksek bir yakınlaştırma düzeyinde görüntülediğinde, harita üzerinde bağımsız işaretçiler gösterilir. Kullanıcı haritayı uzaklaştırdığında işaretçiler bir araya gelerek haritayı görüntülemeyi kolaylaştırır.
Aşağıdaki ekran görüntüsü, işaretçi kümelerinin varsayılan stilini gösterir:

Aşağıda özel işaretçi kümeleriyle ilgili bir örnek verilmiştir:

Ön koşullar ve notlar
iOS Yardımcı Program Kitaplığı için Haritalar SDK'sı
İşaretçi kümeleme yardımcı programı, iOS için Yardımcı Program Kitaplığı SDK'sının bir parçasıdır. Kitaplığı henüz kurmadıysanız bu sayfanın geri kalanını okumadan önce kurulum kılavuzunu uygulayın.
En iyi performans için önerilen maksimum işaretçi sayısı 10.000'dir.
Konum izni
Bu örnekte, kullanıcının koordinatlarını bulmak için cihazın GPS cihazı kullanılmaktadır. Bunu etkinleştirmek için projenin Info.plist
dosyasındaki NSLocationWhenInUseUsageDescription
iznine bir açıklama eklemeniz gerekir.
Bunu eklemek için aşağıdakileri yapın:
- Mülk Listesi Düzenleyici'yi açmak için Xcode'da Project Navigator'da
Info.plist
dosyasını tıklayın. - Yeni bir mülk eklemek için 'Bilgi Mülkü Listesi''nin yanındaki '+' simgesini tıklayın.
- 'key' alanına 'NSLocationwhenInUseUseDescription' yazın. Xcode bunu otomatik olarak 'Gizlilik - Kullanım Sırasında Konum Açıklaması' diline çevirir. Olası konum izni özelliklerinin tam listesi için Apple Developer belgelerindeki Konum Hizmetleri için Yetkilendirme İsteme bölümüne bakın.
- 'Type' alanını 'String' olarak bırakın.
- 'Value' alanına, uygulamanızın kullanıcı konumunu neden kullanmasının gerektiğiyle ilgili bir açıklama yazın. Örneğin, "Yakındaki işletme girişlerini sunmak için kullanıcıyı bulur".
İşaretçi kümelemesini uygulama
İşaretçi kümelemesini üç adımda uygular:
- Küme yöneticisi örneği oluşturun.
- Kümelemek istediğiniz işaretçileri küme yöneticisine iletin.
- Küme yöneticisini çağırın.
Küme yöneticisini oluşturma
Küme yöneticisini kullanmak için aşağıdakileri yapın:
- Haritanızın oluşturulacağı
ViewController
değeriniGMSMapViewDelegate
protokolüne uygun olacak şekilde ayarlayın. GMUClusterManager
örneği oluşturun.- İşaretçi kümelemeyi uygulamak istediğiniz
GMSMapView
örneğini ve aşağıdaki protokollerin uygulamalarınıGMUClusterManager
örneğine iletin:GMUClusterIconGenerator
: Farklı yakınlaştırma düzeylerinde kullanılacak küme simgelerini getiren uygulama mantığı sağlar.GMUClusterAlgorithm
: İşaretçilerin nasıl kümeleneceğine dair davranışı belirleyen bir algoritma belirtir. Örneğin, aynı kümeye dahil edilecek işaretçiler arasındaki mesafeyi belirtir.GMUClusterRenderer
: Haritadaki küme simgelerinin gerçek oluşturulmasını işleyen uygulama mantığı sağlar.
GMUClusterManager
örneğinde haritadaki yetki verilmiş kullanıcıyı ayarlayın.
Yardımcı program kitaplığı, simge oluşturucu (GMUDefaultClusterIconGenerator
), algoritma (GMUNonHierarchicalDistanceBasedAlgorithm
) ve oluşturucu (GMUDefaultClusterRenderer
) uygulamalarının varsayılan uygulamalarını içerir. İsteğe bağlı olarak, özel bir karma oluşturma simgesi oluşturma aracını, algoritmayı ve oluşturucuyu oluşturabilirsiniz.
Aşağıdaki kod, ViewController
cihazının viewDidLoad
geri çağırmasında bu varsayılan değerleri kullanarak bir küme yöneticisi oluşturur:
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
İşaretçi ekleme
İşaretçi kümeleyiciye iki şekilde işaretçi eklemenin iki yolu vardır: tek başına veya dizi olarak.
Bireysel işaretçi
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];
İşaret dizisi
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];
İşaretçi kümeleyiciyi çağırma
İşaretçi kümeleyicinizi oluşturup kümelemek istediğiniz işaretçileri ilettikten sonra tek yapmanız gereken, işaretçi kümeleyici örneğinizde cluster
yöntemini çağırmaktır.
Swift
clusterManager.cluster()
Objective-C
[_clusterManager cluster];
İşaretçiler ve kümeler üzerindeki etkinlikleri işleme
iOS için Haritalar SDK'sını kullanırken genellikle etkinlikleri haritada dinlemek için GMSMapViewDelegate
protokolünü uygulamanız gerekir. Harita etkinliklerini dinleyebilirsiniz ancak tür açısından güvenli küme yöneticisi etkinliklerini dinleyebilirsiniz. Kullanıcı bir işaretçiye, bağımsız bir küme öğesine veya kümeye dokunduğunda, API mapView:didTapMarker:
öğesini tetikler ve ekstra küme verilerini marker.userData
özelliğine ekler. Ardından, bir küme simgesinin veya işaretçinin tıklanıp dokunmadığını belirlemek için userData
öğesinin GMUCluster
protokolüne uygun olup olmadığını kontrol edebilirsiniz.
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; }
Küme yöneticisi artık clusterManager
üzerinde uyguladığınız tüm etkinliklere müdahale ediyor. Varsa, kalan etkinlikleri haritadaki yetki verilmiş kullanıcıya yönlendirir. Standart işaretçilerin etkinliklerinin (yani küme oluşturucu tarafından oluşturulmayan işaretçilerin) her zaman harita yetki verilmiş kullanıcıya yönlendirildiğini unutmayın.
İşaretçi kümelemesini özelleştirin
GMUClusterRenderer
, GMUClusterIconGenerator
veya GMUClusterAlgorithm
için özel uygulama sağlayabilirsiniz. Özel uygulamanızı, yardımcı program kitaplığında yer alan bu protokollerin örnek uygulamasına dayandırabilir veya protokolleri yerine getirerek tamamen özel bir uygulama kodlayabilirsiniz.