דף זה מתאר את הכלי קיבוץ סמנים שזמין ספריית תשתיות ל-SDK של מפות Google ל-iOS.
קיבוץ הסמנים מאפשר לך להציב מספר גדול של סמנים במפה בלי שיהיה קשה לקרוא את המפה. הכלי 'קיבוץ סמנים' עוזר לך לנהל מספר סמנים ברמות מרחק שונות של מרחק.
כשמשתמש צופה במפה ברמת זום גבוהה, במפה. כשהמשתמש מתרחק, הסמנים נאספים את כולן באשכולות, כדי להקל על הצפייה במפה.
בצילום המסך הבא מוצג סגנון ברירת המחדל של אשכולות סמנים:
בהמשך מוצגת דוגמה לאשכולות סמנים מותאמים אישית:
דרישות מוקדמות והערות
SDK של מפות Google לספריית הכלים ל-iOS
השימוש בקיבוץ סמנים הוא חלק SDK של מפות ל-iOS ספריית השירותים. אם עדיין לא הגדרתם את הספרייה, פועלים לפי ההוראות במדריך ההגדרה. לפני שתקראו את שאר הדף.
לקבלת הביצועים הטובים ביותר, מספר הסמנים המקסימלי המומלץ הוא 10,000.
הרשאת מיקום
בדוגמה הזו נעשה שימוש ב-GPS של המכשיר כדי לאתר את המשתמש ואת המפה בקואורדינטות שלו. כדי להפעיל
זאת, חובה להוסיף תיאור להרשאה NSLocationWhenInUseUsageDescription
בקובץ Info.plist
של הפרויקט.
כדי להוסיף את התג:
- לוחצים על הקובץ
Info.plist
ב-Project Navigator ב-Xcode כדי לפתוח את עורך רשימת הנכסים. - לוחצים על הסמל '+'. סמל שלצד 'רשימת מאפייני מידע' כדי להוסיף נכס חדש.
- ב'מפתח' מקלידים 'NSLocationWhenInUseUsageDescription'. הקוד של Xcode יופעל באופן אוטומטי מתרגמים את השם הזה לשם הארוך 'פרטיות - מיקום בזמן השימוש בתיאור'. עבור לרשימה המלאה של המאפיינים האפשריים עם הרשאת מיקום: בקשת הרשאה לשירותי המיקום בתיעוד של Apple Developer.
- משאירים את השדה 'סוג'. השדה מוגדר ל'מחרוזת'.
- בשדה Value (ערך) מקלידים תיאור של הסיבה שבגללה האפליקציה דורשת שימוש המיקום של המשתמש. לדוגמה, "איתור המשתמש כדי לספק דפים עסקיים בקרבת מקום".
הטמעת אשכולות סמנים
יישום קיבוץ סמנים מורכב משלושה שלבים:
כדי לראות דוגמה מלאה להטמעה של אשכולות סמנים, אפשר לעיין באפליקציות לדוגמה של Objective-C ו-Swift ב-GitHub.יצירת מנהל האשכולות
כדי להשתמש במנהל האשכולות:
- צריך להגדיר את ה
ViewController
שבו המפה מעובדת כך שתעמוד בדרישות של פרוטוקולGMSMapViewDelegate
. - יוצרים מכונה של
GMUClusterManager
. - מעבירים את המופע של
GMSMapView
שרוצים להטמיע באשכולות של סמנים וההטמעות של הפרוטוקולים הבאים במכונהGMUClusterManager
:GMUClusterIconGenerator
: מספקת לוגיקה של אפליקציה שמאחזרת את סמלים של אשכולות לשימוש ברמות זום שונות.GMUClusterAlgorithm
: מציין אלגוריתם שקובע את ההתנהגות אופן הקיבוץ של סמנים, למשל המרחק בין סמנים שיש לכלול באותו אשכול.GMUClusterRenderer
: מספקת לוגיקה של האפליקציה שמטפלת עיבוד סמלי האשכול במפה.
- הגדרת הגישה במפה במכונה של
GMUClusterManager
.
ספריית הכלים כוללת הטמעות ברירת מחדל של מחולל הסמלים (GMUDefaultClusterIconGenerator
),
אלגוריתם (GMUNonHierarchicalDistanceBasedAlgorithm
) וכלי לרינדור (GMUDefaultClusterRenderer
).
יש לכם גם אפשרות ליצור כלי משלכם ליצירת סמלי אשכולות, אלגוריתם וכלי לרינדור.
הקוד הבא יוצר מנהל אשכולות על סמך ברירות המחדל האלה ב-viewDidLoad
קריאה חוזרת (callback) של 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
של Google. יש לך אפשרות להאזין ל
למפות אירועים, אבל אי אפשר
להאזין לאירועים של ניהול אשכולות מסוג בטוח. כשהמשתמש מקיש על סמן,
פריט אשכול ספציפי או אשכול, שה-API מפעיל
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
. אפשר לבסס את ההטמעה המותאמת אישית
בהטמעה לדוגמה של הפרוטוקולים האלה שכלולה
, לחלופין, תוכלו לקודד הטמעה מותאמת אישית מלאה על ידי ביצוע
ופרוטוקולים.