این صفحه ابزار خوشهبندی نشانگر را توصیف میکند که در کتابخانه ابزار برای Maps SDK برای iOS موجود است.
با خوشه بندی نشانگرهای خود، می توانید تعداد زیادی نشانگر را روی نقشه قرار دهید بدون اینکه خوانش نقشه دشوار شود. ابزار خوشه بندی نشانگر به شما کمک می کند چندین نشانگر را در سطوح بزرگنمایی مختلف مدیریت کنید.
وقتی کاربر نقشه را در سطح زوم بالا مشاهده می کند، نشانگرهای جداگانه روی نقشه نشان داده می شوند. هنگامی که کاربر بزرگنمایی می کند، نشانگرها به صورت خوشه جمع می شوند تا مشاهده نقشه را آسان تر کنند.
تصویر زیر سبک پیشفرض خوشههای نشانگر را نشان میدهد:
در زیر نمونه ای از خوشه های نشانگر سفارشی آورده شده است:
پیش نیازها و نکات
Maps SDK برای کتابخانه ابزار iOS
ابزار خوشهبندی نشانگر بخشی از Maps SDK برای کتابخانه ابزار iOS است. اگر هنوز کتابخانه را راهاندازی نکردهاید، قبل از خواندن بقیه این صفحه ، راهنمای راهاندازی را دنبال کنید.
برای بهترین عملکرد، حداکثر تعداد نشانگرهای توصیه شده 10000 است.
مجوز مکان
این مثال از GPS دستگاه برای تعیین مکان کاربر و نقشه روی مختصات آنها استفاده می کند. برای فعال کردن این، باید یک توضیح به مجوز NSLocationWhenInUseUsageDescription
در فایل Info.plist
پروژه اضافه کنید.
برای اضافه کردن این موارد، موارد زیر را انجام دهید:
- روی فایل
Info.plist
در Project Navigator در Xcode کلیک کنید تا Property List Editor باز شود. - برای افزودن یک ویژگی جدید، روی نماد '+' در کنار 'فهرست مشخصات اطلاعات' کلیک کنید.
- در فیلد «کلید»، «NSLocationWhenInUseUsageDescription» را تایپ کنید. Xcode به طور خودکار این را به نام طولانی "Privacy - Location When In Use Usage Description" ترجمه می کند. برای فهرست کامل ویژگیهای مجوز مکان ممکن، به درخواست مجوز برای سرویسهای مکان در اسناد برنامهنویس اپل مراجعه کنید.
- قسمت "Type" را روی "String" بگذارید.
- در فیلد «مقدار»، توضیحی در مورد دلیلی که برنامه شما به استفاده از موقعیت مکانی کاربر نیاز دارد تایپ کنید. به عنوان مثال، «کاربر را برای ارائه فهرستهای کسبوکار نزدیک تعیین میکند».
اجرای خوشه بندی نشانگر
پیاده سازی خوشه بندی نشانگر سه مرحله دارد:
- یک نمونه مدیر خوشه ایجاد کنید.
- نشانگرهایی را که می خواهید دسته بندی کنید به آخور خوشه منتقل کنید.
- مدیر خوشه را فراخوانی کنید.
ایجاد مدیر خوشه
برای استفاده از Cluster Manager موارد زیر را انجام دهید:
-
ViewController
در جایی که نقشه شما رندر می شود تنظیم کنید تا با پروتکلGMSMapViewDelegate
مطابقت داشته باشد. - یک نمونه از
GMUClusterManager
ایجاد کنید. - نمونه ای از
GMSMapView
را که می خواهید خوشه بندی نشانگر و پیاده سازی پروتکل های زیر را در آن پیاده سازی کنید به نمونهGMUClusterManager
ارسال کنید:-
GMUClusterIconGenerator
: منطق برنامه را ارائه می دهد که نمادهای خوشه را برای استفاده در سطوح مختلف بزرگنمایی واکشی می کند. -
GMUClusterAlgorithm
: الگوریتمی را مشخص می کند که رفتار نحوه خوشه بندی نشانگرها را تعیین می کند، مانند فاصله بین نشانگرها برای گنجاندن در همان خوشه. -
GMUClusterRenderer
: منطق برنامه ای را ارائه می دهد که رندر واقعی نمادهای خوشه روی نقشه را انجام می دهد.
-
- نماینده نقشه را روی نمونه
GMUClusterManager
تنظیم کنید.
کتابخانه ابزار شامل اجرای پیشفرض مولد نماد ( GMUDefaultClusterIconGenerator
)، الگوریتم ( GMUNonHierarchicalDistanceBasedAlgorithm
) و رندر ( GMUDefaultClusterRenderer
) است. میتوانید بهصورت اختیاری، مولد، الگوریتم و ارائهدهنده نمادهای خوشهبندی سفارشی خود را ایجاد کنید.
کد زیر با استفاده از این پیشفرضها در viewDidLoad
callback ViewController
، یک Cluster Manager ایجاد میکند:
سویفت
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) // ... } // ... }
هدف-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
اضافه کردن نشانگرها
دو راه برای افزودن نشانگرها به خوشه نشانگر وجود دارد: به صورت جداگانه یا به صورت آرایه.
نشانگر فردی
سویفت
let position = CLLocationCoordinate2D(latitude: 47.60, longitude: -122.33) let marker = GMSMarker(position: position) clusterManager.add(marker)
هدف-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(47.60, -122.33); GMSMarker *marker = [GMSMarker markerWithPosition:position]; [_clusterManager addItem:marker];
مجموعه ای از نشانگرها
سویفت
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)
هدف-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];
فراخوانی خوشه نشانگر
هنگامی که خوشه نشانگر خود را ایجاد کردید و نشانگرهایی را که می خواهید خوشه بندی کنید ارسال کردید، تنها کاری که باید انجام دهید این است که متد cluster
در نمونه خوشه نشانگر خود فراخوانی کنید.
سویفت
clusterManager.cluster()
هدف-C
[_clusterManager cluster];
رویدادها را روی نشانگرها و خوشه ها مدیریت کنید
به طور کلی هنگام استفاده از Maps SDK برای iOS، برای گوش دادن به رویدادهای روی نقشه باید پروتکل GMSMapViewDelegate
را پیاده سازی کنید. میتوانید به رویدادهای نقشه گوش دهید، اما نمیتوانید به رویدادهای مدیریت خوشه ایمن نوع گوش کنید. هنگامی که کاربر روی یک نشانگر، یک آیتم خوشه منفرد یا یک خوشه ضربه میزند، API mapView:didTapMarker:
را راهاندازی میکند و دادههای خوشه اضافی را به ویژگی marker.userData
متصل میکند. سپس می توانید بررسی کنید که آیا userData
با پروتکل GMUCluster
مطابقت دارد یا خیر تا تعیین کنید که آیا یک نماد خوشه یا یک نشانگر ضربه زده شده است یا خیر.
سویفت
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 }
هدف-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; }
مدیر خوشه اکنون هر رویدادی را که در clusterManager
پیادهسازی کردهاید رهگیری میکند. در صورت ارائه، رویدادهای باقی مانده را به نماینده نقشه ارسال می کند. توجه داشته باشید که رویدادهای نشانگرهای استاندارد (یعنی نشانگرهایی که توسط رندر خوشه تولید نمی شوند) همیشه به نماینده نقشه ارسال می شوند.
خوشه بندی نشانگر را سفارشی کنید
شما می توانید یک پیاده سازی سفارشی برای GMUClusterRenderer
، GMUClusterIconGenerator
، یا GMUClusterAlgorithm
ارائه دهید. میتوانید پیادهسازی سفارشی خود را بر اساس اجرای نمونه از این پروتکلهای موجود در کتابخانه ابزار قرار دهید، یا میتوانید با تکمیل پروتکلها، یک پیادهسازی کاملاً سفارشی را کدنویسی کنید.