خوشه بندی نشانگر

پلتفرم را انتخاب کنید: Android iOS JavaScript

این صفحه ابزار خوشه‌بندی نشانگر را توصیف می‌کند که در کتابخانه ابزار برای Maps SDK برای iOS موجود است.

با خوشه بندی نشانگرهای خود، می توانید تعداد زیادی نشانگر را روی نقشه قرار دهید بدون اینکه خوانش نقشه دشوار شود. ابزار خوشه بندی نشانگر به شما کمک می کند چندین نشانگر را در سطوح بزرگنمایی مختلف مدیریت کنید.

وقتی کاربر نقشه را در سطح زوم بالا مشاهده می کند، نشانگرهای جداگانه روی نقشه نشان داده می شوند. هنگامی که کاربر بزرگنمایی می کند، نشانگرها به صورت خوشه جمع می شوند تا مشاهده نقشه را آسان تر کنند.

تصویر زیر سبک پیش‌فرض خوشه‌های نشانگر را نشان می‌دهد:

نقشه ای با نشانگرهای خوشه ای در سبک پیش فرض

در زیر نمونه ای از خوشه های نشانگر سفارشی آورده شده است:

نقشه ای با نشانگرهای خوشه ای سفارشی

پیش نیازها و نکات

Maps SDK برای کتابخانه ابزار iOS

ابزار خوشه‌بندی نشانگر بخشی از Maps SDK برای کتابخانه ابزار iOS است. اگر هنوز کتابخانه را راه‌اندازی نکرده‌اید، قبل از خواندن بقیه این صفحه ، راهنمای راه‌اندازی را دنبال کنید.

برای بهترین عملکرد، حداکثر تعداد نشانگرهای توصیه شده 10000 است.

مجوز مکان

این مثال از GPS دستگاه برای تعیین مکان کاربر و نقشه روی مختصات آنها استفاده می کند. برای فعال کردن این، باید یک توضیح به مجوز NSLocationWhenInUseUsageDescription در فایل Info.plist پروژه اضافه کنید.

برای اضافه کردن این موارد، موارد زیر را انجام دهید:

  1. روی فایل Info.plist در Project Navigator در Xcode کلیک کنید تا Property List Editor باز شود.
  2. برای افزودن یک ویژگی جدید، روی نماد '+' در کنار 'فهرست مشخصات اطلاعات' کلیک کنید.
  3. در فیلد «کلید»، «NSLocationWhenInUseUsageDescription» را تایپ کنید. Xcode به طور خودکار این را به نام طولانی "Privacy - Location When In Use Usage Description" ترجمه می کند. برای فهرست کامل ویژگی‌های مجوز مکان ممکن، به درخواست مجوز برای سرویس‌های مکان در اسناد برنامه‌نویس اپل مراجعه کنید.
  4. قسمت "Type" را روی "String" بگذارید.
  5. در فیلد «مقدار»، توضیحی در مورد دلیلی که برنامه شما به استفاده از موقعیت مکانی کاربر نیاز دارد تایپ کنید. به عنوان مثال، «کاربر را برای ارائه فهرست‌های کسب‌وکار نزدیک تعیین می‌کند».

اجرای خوشه بندی نشانگر

پیاده سازی خوشه بندی نشانگر سه مرحله دارد:

  1. یک نمونه مدیر خوشه ایجاد کنید.
  2. نشانگرهایی را که می خواهید دسته بندی کنید به آخور خوشه منتقل کنید.
  3. مدیر خوشه را فراخوانی کنید.
برای مشاهده یک مثال کامل از نحوه پیاده‌سازی خوشه‌بندی نشانگر، برنامه‌های نمونه Objective-C و Swift را در GitHub بررسی کنید.

ایجاد مدیر خوشه

برای استفاده از Cluster Manager موارد زیر را انجام دهید:

  1. ViewController در جایی که نقشه شما رندر می شود تنظیم کنید تا با پروتکل GMSMapViewDelegate مطابقت داشته باشد.
  2. یک نمونه از GMUClusterManager ایجاد کنید.
  3. نمونه ای از GMSMapView را که می خواهید خوشه بندی نشانگر و پیاده سازی پروتکل های زیر را در آن پیاده سازی کنید به نمونه GMUClusterManager ارسال کنید:
    • GMUClusterIconGenerator : منطق برنامه را ارائه می دهد که نمادهای خوشه را برای استفاده در سطوح مختلف بزرگنمایی واکشی می کند.
    • GMUClusterAlgorithm : الگوریتمی را مشخص می کند که رفتار نحوه خوشه بندی نشانگرها را تعیین می کند، مانند فاصله بین نشانگرها برای گنجاندن در همان خوشه.
    • GMUClusterRenderer : منطق برنامه ای را ارائه می دهد که رندر واقعی نمادهای خوشه روی نقشه را انجام می دهد.
  4. نماینده نقشه را روی نمونه 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 ارائه دهید. می‌توانید پیاده‌سازی سفارشی خود را بر اساس اجرای نمونه از این پروتکل‌های موجود در کتابخانه ابزار قرار دهید، یا می‌توانید با تکمیل پروتکل‌ها، یک پیاده‌سازی کاملاً سفارشی را کدنویسی کنید.