אשכול סימון

בחירת פלטפורמה: Android iOS JavaScript

דף זה מתאר את הכלי קיבוץ סמנים שזמין ספריית תשתיות ל-SDK של מפות Google ל-iOS.

קיבוץ הסמנים מאפשר לך להציב מספר גדול של סמנים במפה בלי שיהיה קשה לקרוא את המפה. הכלי 'קיבוץ סמנים' עוזר לך לנהל מספר סמנים ברמות מרחק שונות של מרחק.

כשמשתמש צופה במפה ברמת זום גבוהה, במפה. כשהמשתמש מתרחק, הסמנים נאספים את כולן באשכולות, כדי להקל על הצפייה במפה.

בצילום המסך הבא מוצג סגנון ברירת המחדל של אשכולות סמנים:

מפה עם סמנים מקובצים בסגנון ברירת המחדל

בהמשך מוצגת דוגמה לאשכולות סמנים מותאמים אישית:

מפה עם סמנים מקובצים בהתאמה אישית

דרישות מוקדמות והערות

SDK של מפות Google לספריית הכלים ל-iOS

השימוש בקיבוץ סמנים הוא חלק SDK של מפות ל-iOS ספריית השירותים. אם עדיין לא הגדרתם את הספרייה, פועלים לפי ההוראות במדריך ההגדרה. לפני שתקראו את שאר הדף.

לקבלת הביצועים הטובים ביותר, מספר הסמנים המקסימלי המומלץ הוא 10,000.

הרשאת מיקום

בדוגמה הזו נעשה שימוש ב-GPS של המכשיר כדי לאתר את המשתמש ואת המפה בקואורדינטות שלו. כדי להפעיל זאת, חובה להוסיף תיאור להרשאה NSLocationWhenInUseUsageDescription בקובץ Info.plist של הפרויקט.

כדי להוסיף את התג:

  1. לוחצים על הקובץ Info.plist ב-Project Navigator ב-Xcode כדי לפתוח את עורך רשימת הנכסים.
  2. לוחצים על הסמל '+'. סמל שלצד 'רשימת מאפייני מידע' כדי להוסיף נכס חדש.
  3. ב'מפתח' מקלידים 'NSLocationWhenInUseUsageDescription'. הקוד של Xcode יופעל באופן אוטומטי מתרגמים את השם הזה לשם הארוך 'פרטיות - מיקום בזמן השימוש בתיאור'. עבור לרשימה המלאה של המאפיינים האפשריים עם הרשאת מיקום: בקשת הרשאה לשירותי המיקום בתיעוד של Apple Developer.
  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 קריאה חוזרת (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. אפשר לבסס את ההטמעה המותאמת אישית בהטמעה לדוגמה של הפרוטוקולים האלה שכלולה , לחלופין, תוכלו לקודד הטמעה מותאמת אישית מלאה על ידי ביצוע ופרוטוקולים.