تصف هذه الصفحة الأداة المساعدة لتجميع العلامات المتوفرة في مكتبة الخدمات العامة لحزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لتطبيقات iOS
من خلال تجميع العلامات، يمكنك وضع عدد كبير من العلامات على الخريطة دون جعل الخريطة صعبة القراءة. تساعدك أداة تجميع العلامات إدارة محددات متعددة على مستويات تكبير/تصغير مختلفة.
عندما يعرض المستخدم الخريطة بمستوى تكبير عالي، فإن الفرد تظهر العلامات على الخريطة. عندما يقوم المستخدم بالتصغير، تجمع العلامات معًا في مجموعات، لتسهيل عرض الخريطة.
توضح لقطة الشاشة التالية النمط التلقائي لمجموعات العلامات:
![خريطة بها علامات مجمعة بالنمط الافتراضي](https://developers-dot-devsite-v2-prod.appspot.com/static/maps/documentation/ios-sdk/images/clustering-default-icon.png?authuser=4&hl=ar)
في ما يلي مثال على مجموعات العلامات المخصّصة:
![خريطة بعلامات مجمعة مخصصة](https://developers-dot-devsite-v2-prod.appspot.com/static/maps/documentation/ios-sdk/images/clustering-custom-icon.png?authuser=4&hl=ar)
المتطلّبات الأساسية والملاحظات
حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لمكتبة أدوات iOS
تعتبر أداة تجميع العلامات جزءًا من حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لتطبيقات iOS مكتبة الخدمات: إذا لم تكن قد أعددت المكتبة بعد، اتّباع دليل الإعداد قبل قراءة بقية هذه الصفحة.
للحصول على أفضل أداء، يبلغ الحد الأقصى الموصى به لعدد العلامات 10,000 علامة.
إذن تحديد الموقع الجغرافي
يستخدم هذا المثال نظام تحديد المواقع العالمي (GPS) في الجهاز لتحديد موقع المستخدم والخريطة على إحداثياته. للتفعيل
لهذا، يجب إضافة وصف إلى إذن "NSLocationWhenInUseUsageDescription
".
في ملف Info.plist
للمشروع.
لإجراء ذلك، اتّبِع الخطوات التالية:
- انقر على ملف
Info.plist
في Project Navigator في Xcode لفتح محرر قائمة المواقع. - انقر على الرمز "+" الرمز بجانب "قائمة خصائص المعلومات" لإضافة موقع جديد.
- في "المفتاح" اكتب "NSLocationWhenInUseUsageDescription". سيقوم Xcode تلقائيًا ترجم ذلك إلى الاسم الكامل "الخصوصية - وصف الموقع الجغرافي عند الاستخدام". بالنسبة إلى قائمة كاملة بخصائص إذن تحديد الموقع الجغرافي المحتملة، يُرجى مراجعة طلب تفويض لخدمات الموقع الجغرافي في وثائق مطوّر برامج Apple.
- اترك حقل "النوع" على "سلسلة".
- في عمود 'Value' فاكتب وصفًا لسبب طلب تطبيقك استخدام موقع المستخدم. على سبيل المثال، "تحديد موقع المستخدم لتقديم بيانات النشاط التجاري القريبة".
تنفيذ التجميع العنقودي للعلامات
يتطلب تنفيذ تجميع العلامات ثلاث خطوات:
للاطلاع على مثال كامل لكيفية تنفيذ تجميع العلامات، اطلع على أمثلة على تطبيقات Objective-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];
التعامل مع الأحداث في العلامات والمجموعات
بشكل عام، عند استخدام حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط 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
يمكنك تحديد مصدر تنفيذ مخصّص
على نموذج تنفيذ هذه البروتوكولات المضمّنة في الأداة
أو يمكنك إدخال رمز تنفيذ مخصص بالكامل من خلال تنفيذ
والبروتوكولات.