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 haritaya çok sayıda işaretçi yerleştirebilirsiniz. İşaretçi kümeleme yardımcı programı, farklı yakınlaştırma düzeylerinde birden fazla işaretçiyi yönetmenize yardımcı olur.
Kullanıcı haritayı yüksek yakınlaştırma seviyesinde görüntülediğinde, tek tek işaretçiler haritada gösterilir. Kullanıcı uzaklaştırdığında işaretçiler, haritanın daha kolay görüntülenmesi için kümeler halinde toplanır.
Aşağıdaki ekran görüntüsünde işaretçi kümelerinin varsayılan stili gösterilmektedir:
Aşağıda özel işaretçi kümelerine ilişkin bir örnek verilmiştir:
Ön koşullar ve notlar
iOS için Haritalar SDK'sı Yardımcı Program Kitaplığı
İşaretçi kümeleme yardımcı programı, iOS için Haritalar SDK'sı Yardımcı Program Kitaplığı'nın bir parçasıdır. Kitaplığı henüz ayarlamadıysanız bu sayfanın geri kalanını okumadan önce kurulum kılavuzunu inceleyin.
En iyi performans için önerilen maksimum işaretçi sayısı 10.000'dir.
Konum izni
Bu örnekte, kullanıcının yerini belirlemek ve koordinatlarına göre harita oluşturmak için cihazın GPS'i kullanılır. Bunu etkinleştirmek için projenin Info.plist dosyasındaki NSLocationWhenInUseUsageDescription iznine açıklama eklemeniz gerekir.
Bunu eklemek için aşağıdakileri yapın:
- Özellik listesi düzenleyiciyi açmak için Xcode'daki Proje Gezgini'nde
Info.plistdosyasını tıklayın. - Yeni bir özellik eklemek için "Information Property List"in yanındaki "+" simgesini tıklayın.
- "Anahtar" alanına "NSLocationWhenInUseUsageDescription" yazın. Xcode, bunu otomatik olarak "Privacy - Location When In Use Usage Description" (Gizlilik - Kullanım Sırasında Konum Kullanımı Açıklaması) uzun adına çevirir. Olası konum izni özelliklerinin tam listesi için Apple Developer belgelerindeki Requesting Authorization for Location Services (Konum Hizmetleri İçin Yetkilendirme İsteğinde Bulunma) başlıklı makaleyi inceleyin.
- "Type" (Tür) alanını "String" (Dize) olarak bırakın.
- "Değer" alanına, uygulamanızın kullanıcının konumunu kullanmasının nedenini açıklayan bir metin yazın. Örneğin, "Yakındaki işletme listelerini sağlamak için kullanıcının konumunu belirler."
İşaretçi gruplamayı uygulama
İşaretçi kümelemeyi uygulamak için üç adım gerekir:
- Küme yöneticisi örneği oluşturun.
- Kümelendirmek istediğiniz işaretçileri küme yöneticisine iletin.
- Küme yöneticisini çağırın.
Küme yöneticisi oluşturma
Küme yöneticisini kullanmak için aşağıdakileri yapın:
- Haritanızın oluşturulduğu
ViewController,GMSMapViewDelegateprotokolü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ığını sağlar.GMUClusterAlgorithm: İşaretlerin nasıl kümeleneceğini belirleyen bir algoritmayı belirtir. Örneğin, aynı kümeye dahil edilecek işaretler arasındaki mesafe.GMUClusterRenderer: Küme simgelerinin haritada gerçek şekilde oluşturulmasını sağlayan uygulama mantığını sunar.
GMUClusterManagerörneğinde harita temsilcisini ayarlayın.
Yardımcı program kitaplığı, simge oluşturucunun (GMUDefaultClusterIconGenerator), algoritmanın (GMUNonHierarchicalDistanceBasedAlgorithm) ve oluşturucunun (GMUDefaultClusterRenderer) varsayılan uygulamalarını içerir.
İsteğe bağlı olarak kendi özel kümeleme simge oluşturucunuzu, algoritmanızı ve oluşturucunuzu oluşturabilirsiniz.
Aşağıdaki kod, viewDidLoad
geri çağırma işlevinde bu varsayılanları kullanarak bir küme yöneticisi oluşturur: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
İşaretleyici ekleme
İşaretçi kümeleyiciye işaretçi eklemenin iki yolu vardır: tek tek veya dizi olarak.
Tek 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çi 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 gruplarını çağırma
İşaretçi gruplarınızı oluşturup kümelemek istediğiniz işaretçileri ilettikten sonra tek yapmanız gereken, işaretçi grupları örneğinizde cluster yöntemini çağırmaktır.
Swift
clusterManager.cluster()
Objective-C
[_clusterManager cluster];
İşaretçiler ve kümelerdeki etkinlikleri işleme
Genel olarak, iOS için Haritalar SDK'sını kullanırken haritadaki etkinlikleri dinlemek için GMSMapViewDelegate protokolünü uygulamanız gerekir. Harita etkinliklerini dinleyebilirsiniz ancak tür güvenli küme yöneticisi etkinliklerini dinleyemezsiniz. Kullanıcı bir işaretçiye, bağımsız bir küme öğesine veya kümeye dokunduğunda API, mapView:didTapMarker: tetiklenir ve ek küme verilerini marker.userData özelliğine ekler. Ardından, bir küme simgesine mi yoksa işaretçiye mi dokunulduğunu 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 etkinlikleri yakalar. Kalan etkinlikler, varsa harita temsilcisine yönlendirilir. Standart işaretçiler için etkinliklerin (yani küme oluşturucu tarafından oluşturulmayan işaretçiler) her zaman harita temsilcisine yönlendirildiğini unutmayın.
İşaretçi kümelemeyi özelleştirme
GMUClusterRenderer, GMUClusterIconGenerator veya GMUClusterAlgorithm için özel bir 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.