توضّح هذه الصفحة أداة تجميع العلامات التي تتوفّر في مكتبة الخدمات لحزمة تطوير البرامج (SDK) للخرائط لنظام التشغيل iOS.
من خلال تجميع العلامات، يمكنك وضع عدد كبير من العلامات على الخريطة بدون جعل قراءة الخريطة صعبة. تساعدك أداة تجميع العلامات على إدارة علامات متعددة على مستويات تكبير/تصغير مختلفة.
عندما يشاهد المستخدم الخريطة عند مستوى تكبير/تصغير مرتفع، تظهر العلامات الفردية على الخريطة. عند تصغير المستخدم، تتجمع العلامات معًا في مجموعات، لتسهيل عرض الخريطة.
تعرض لقطة الشاشة التالية النمط التلقائي لمجموعات العلامات:

في ما يلي مثال على مجموعات العلامات المحدَّدة:

المتطلبات الأساسية والملاحظات
حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لمكتبة iOS Utility
تعد أداة تجميع العلامات جزءًا من حزمة تطوير البرامج (SDK) للخرائط لخدمة "خرائط Google" لنظام التشغيل iOS. إذا لم يتم إعداد المكتبة بعد، يُرجى اتّباع دليل الإعداد قبل قراءة بقية هذه الصفحة.
وللحصول على أفضل أداء، الحد الأقصى لعدد العلامات المقترح هو 10000 علامة.
إذن تحديد الموقع الجغرافي
يستخدم هذا المثال نظام تحديد المواقع العالمي (GPS) للجهاز لتحديد موقع المستخدم والخريطة على إحداثياته. لتفعيل
ذلك، عليك إضافة وصف إلى إذن NSLocationWhenInUseUsageDescription
في ملف Info.plist
على المشروع.
لإضافة هذا، يمكنك إجراء ما يلي:
- انقر على ملف
Info.plist
في Project Navigator (أداة التنقّل في المشروع) في Xcode لفتح محرّر قائمة المواقع. - انقر على الرمز '؛+'؛ بجانب '؛قائمة خصائص المعلومات'؛ لإضافة موقع جديد.
- في الحقل '؛key'؛ اكتب 'NSLocationwhenInUsageDescription'. وسيترجم تطبيق Xcode هذا تلقائيًا إلى الاسم الطويل 'الخصوصية - الموقع الجغرافي عند استخدام وصف الاستخدام'. للحصول على قائمة كاملة بالخصائص المحتمَلة لأذونات الموقع الجغرافي، يمكنك الاطّلاع على طلب تفويض خدمات الموقع الجغرافي في مستندات Apple Developers.
- اترُك الحقل " #39;Type'" إلى 'String'.
- في الحقل '؛القيمة&39؛ اكتب وصفًا للسبب الذي يتطلب من تطبيقك استخدام الموقع الجغرافي للمستخدم. على سبيل المثال، "تحدد الموقع الجغرافي للمستخدم لتقديم بيانات الأنشطة التجارية المجاورة.
تنفيذ تجميع العلامات
يتطلّب تنفيذ تجميع العلامات ثلاث خطوات:
للاطّلاع على مثال كامل حول كيفية تجميع العلامات، يمكنك الاطّلاع على أمثلة عن الأهداف C-وSwift على GitHub.إنشاء مدير المجموعة
لاستخدام مدير المجموعة، عليك تنفيذ ما يلي:
- يمكنك تحديد
ViewController
في المكان الذي يتم فيه عرض خريطتك للتوافق مع بروتوكولGMSMapViewDelegate
. - أنشِئ نسخة افتراضية من
GMUClusterManager
. - اجتياز مثيل
GMSMapView
الذي تريد تنفيذ تجميع العلامات وتنفيذ البروتوكولات التالية على مثيلGMUClusterManager
:GMUClusterIconGenerator
: توفّر منطق التطبيق الذي يجلب رموز المجموعات المُراد استخدامها على مستويات تكبير/تصغير مختلفة.GMUClusterAlgorithm
: تحدِّد خوارزمية تحدّد سلوك كيفية تجميع العلامات، مثل المسافة بين العلامات التي يمكن تضمينها في المجموعة نفسها.GMUClusterRenderer
: توفّر منطق التطبيق الذي يتعامل مع العرض الفعلي لرموز المجموعات على الخريطة.
- اضبط مفوِّض الخريطة على مثيل
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];
التعامل مع الأحداث على العلامات والمجموعات
بشكل عام، عند استخدام حزمة تطوير البرامج (SDK) لتطبيق "خرائط 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
. يمكنك الاستناد إلى التنفيذ المخصّص استنادًا إلى نموذج تنفيذ هذه البروتوكولات المضمّنة في مكتبة الخدمات، أو يمكنك ترميز تنفيذ مخصّص بالكامل من خلال تنفيذ البروتوكولات.