تجميع العلامات

اختيار النظام الأساسي: نظام التشغيل Android iOS JavaScript

تصف هذه الصفحة الأداة المساعدة لتجميع العلامات المتوفرة في مكتبة الخدمات العامة لحزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لتطبيقات iOS

من خلال تجميع العلامات، يمكنك وضع عدد كبير من العلامات على الخريطة دون جعل الخريطة صعبة القراءة. تساعدك أداة تجميع العلامات إدارة محددات متعددة على مستويات تكبير/تصغير مختلفة.

عندما يعرض المستخدم الخريطة بمستوى تكبير عالي، فإن الفرد تظهر العلامات على الخريطة. عندما يقوم المستخدم بالتصغير، تجمع العلامات معًا في مجموعات، لتسهيل عرض الخريطة.

توضح لقطة الشاشة التالية النمط التلقائي لمجموعات العلامات:

خريطة بها علامات مجمعة بالنمط الافتراضي

في ما يلي مثال على مجموعات العلامات المخصّصة:

خريطة بعلامات مجمعة مخصصة

المتطلّبات الأساسية والملاحظات

حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لمكتبة أدوات iOS

تعتبر أداة تجميع العلامات جزءًا من حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لتطبيقات iOS مكتبة الخدمات: إذا لم تكن قد أعددت المكتبة بعد، اتّباع دليل الإعداد قبل قراءة بقية هذه الصفحة.

للحصول على أفضل أداء، يبلغ الحد الأقصى الموصى به لعدد العلامات 10,000 علامة.

إذن تحديد الموقع الجغرافي

يستخدم هذا المثال نظام تحديد المواقع العالمي (GPS) في الجهاز لتحديد موقع المستخدم والخريطة على إحداثياته. للتفعيل لهذا، يجب إضافة وصف إلى إذن "NSLocationWhenInUseUsageDescription". في ملف Info.plist للمشروع.

لإجراء ذلك، اتّبِع الخطوات التالية:

  1. انقر على ملف Info.plist في Project Navigator في Xcode لفتح محرر قائمة المواقع.
  2. انقر على الرمز "+" الرمز بجانب "قائمة خصائص المعلومات" لإضافة موقع جديد.
  3. في "المفتاح" اكتب "NSLocationWhenInUseUsageDescription". سيقوم Xcode تلقائيًا ترجم ذلك إلى الاسم الكامل "الخصوصية - وصف الموقع الجغرافي عند الاستخدام". بالنسبة إلى قائمة كاملة بخصائص إذن تحديد الموقع الجغرافي المحتملة، يُرجى مراجعة طلب تفويض لخدمات الموقع الجغرافي في وثائق مطوّر برامج Apple.
  4. اترك حقل "النوع" على "سلسلة".
  5. في عمود 'Value' فاكتب وصفًا لسبب طلب تطبيقك استخدام موقع المستخدم. على سبيل المثال، "تحديد موقع المستخدم لتقديم بيانات النشاط التجاري القريبة".

تنفيذ التجميع العنقودي للعلامات

يتطلب تنفيذ تجميع العلامات ثلاث خطوات:

  1. أنشئ مثيل مدير مجموعة.
  2. مرِّر العلامات التي تريد تجميعها إلى مدير المجموعة.
  3. استدعِ مدير المجموعة.
للاطلاع على مثال كامل لكيفية تنفيذ تجميع العلامات، اطلع على أمثلة على تطبيقات Objective-C وSwift على GitHub.

إنشاء مدير المجموعة

لاستخدام مدير المجموعات، عليك إجراء ما يلي:

  1. ضبط ViewController حيث يتم عرض الخريطة لتتوافق مع GMSMapViewDelegate.
  2. إنشاء مثيل لـ GMUClusterManager
  3. مرِّر مثيل GMSMapView الذي تريد تنفيذ تجميع العلامات. البروتوكولات التالية وتنفيذها لمثيل GMUClusterManager:
    • GMUClusterIconGenerator: يوفِّر منطقًا للتطبيق يجلب لتجميع الرموز العنقودية لاستخدامها على مستويات تكبير/تصغير مختلفة.
    • GMUClusterAlgorithm: تحدِّد هذه السياسة خوارزمية تحدِّد السلوك. كيفية تجميع العلامات، مثل المسافة بين العلامات لتضمينها في نفس المجموعة العنقودية.
    • GMUClusterRenderer: يوفِّر منطقًا للتطبيق يعالج العمليات الفعلية عرض رموز المجموعات العنقودية على الخريطة.
  4. اضبط تفويض الخريطة على مثيل GMUClusterManager.

تتضمن مكتبة الأدوات المساعدة التطبيقات التلقائية لمنشئ الرموز (GMUDefaultClusterIconGenerator)، الخوارزمية (GMUNonHierarchicalDistanceBasedAlgorithm) والعارض (GMUDefaultClusterRenderer). يمكنك اختياريًا إنشاء أداة إنشاء رموز التجميع والخوارزمية وأداة العرض المخصّصة.

ينشئ الرمز التالي مدير مجموعة باستخدام هذه الإعدادات التلقائية في viewDidLoad معاودة الاتصال لـ 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
      

إضافة العلامات

هناك طريقتان لإضافة علامات إلى أداة تجميع العلامات: بشكل فردي أو كمصفوفة.

علامة فردية

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];
      

مصفوفة العلامات

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];
      

استدعاء أداة تجميع العلامات

بعد إنشاء أداة تجميع العلامات وتمريرها العلامات التي تريد تجميعها، الذي عليك فعله هو استدعاء طريقة cluster على مثيل أداة تجميع محدّدات المواقع.

Swift

clusterManager.cluster()
      

Objective-C

[_clusterManager cluster];
      

التعامل مع الأحداث في العلامات والمجموعات

بشكل عام، عند استخدام حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لنظام التشغيل iOS، يجب تنفيذ الإجراءات اللازمة للاستماع إلى الأحداث على الخريطة. GMSMapViewDelegate والبروتوكول. يمكنك الاستماع إلى تحديد الأحداث، ولكن لا يمكنك الاستماع إلى أحداث مدير المجموعات الآمنة من النوع. عندما ينقر المستخدم على علامة، عنصر مجموعة فردي أو مجموعة، تشغل واجهة برمجة التطبيقات mapView:didTapMarker: وترفق بيانات المجموعة الإضافية الموقع الإلكتروني marker.userData. ويمكنك بعد ذلك التحقّق ممّا إذا كانت السمة userData تتوافق مع بروتوكول GMUCluster لتحديد ما إذا تم النقر على رمز مجموعة أو علامة.

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;
}
      

يعترض مدير المجموعة الآن أي أحداث تم تنفيذها على clusterManager يعيد توجيه أي أحداث متبقية إلى الخريطة. المفوَّض، إذا تم تقديمه. لاحظ أن أحداث العلامات العادية تتم دائمًا إعادة توجيه العلامات التي لم يتم إنشاؤها بواسطة عارض المجموعة إلى الشخص المفوَّض بالخريطة.

تخصيص تجميع العلامات

يمكنك توفير طريقة تنفيذ مخصّصة GMUClusterRenderer أو GMUClusterIconGenerator أو GMUClusterAlgorithm يمكنك تحديد مصدر تنفيذ مخصّص على نموذج تنفيذ هذه البروتوكولات المضمّنة في الأداة أو يمكنك إدخال رمز تنفيذ مخصص بالكامل من خلال تنفيذ والبروتوكولات.