মার্কার ক্লাস্টারিং

প্ল্যাটফর্ম বেছে নিন: Android iOS JavaScript

এই পৃষ্ঠায় মার্কার ক্লাস্টারিং ইউটিলিটি সম্পর্কে বর্ণনা করা হয়েছে যা iOS-এর জন্য Maps SDK-এর ইউটিলিটি লাইব্রেরিতে উপলভ্য।

মার্কার ক্লাস্টার করার মাধ্যমে, আপনি ম্যাপে অনেক মার্কার যোগ করতে পারবেন যাতে ম্যাপ পড়তে অসুবিধা না হয়। মার্কার ক্লাস্টারিং ইউটিলিটি আপনাকে বিভিন্ন জুম লেভেলে একাধিক মার্কার ম্যানেজ করতে সাহায্য করে।

কোনও ব্যবহারকারী ম্যাপে অনেক বেশি জুম করলে, ম্যাপে আলাদা আলাদা মার্কার দেখা যায়। ব্যবহারকারী জুম-আউট করলে, মার্কারগুলি একসাথে ক্লাস্টারে জড়ো হয়, যাতে ম্যাপ দেখতে সুবিধা হয়।

নিচের স্ক্রিনশটে মার্কার ক্লাস্টারের ডিফল্ট স্টাইল দেখানো হয়েছে:

ডিফল্ট স্টাইলে ক্লাস্টার করা মার্কার সহ ম্যাপ

কাস্টম মার্কার ক্লাস্টারের উদাহরণ নিচে দেওয়া হল:

কাস্টম ক্লাস্টার করা মার্কার সহ ম্যাপ

পূর্বশর্ত ও নোট

Maps SDK for iOS Utility Library

মার্কার ক্লাস্টারিং ইউটিলিটি হল iOS-এর জন্য Maps SDK ইউটিলিটি লাইব্রেরি-এর অংশ। আপনি এখনও লাইব্রেরি সেট-আপ না করে থাকলে, এই পৃষ্ঠার বাকি অংশ পড়ার আগে সেট-আপ গাইড অনুসরণ করুন।

সেরা পারফর্ম্যান্সের জন্য, সাজেস্ট করা মার্কারের সর্বাধিক সংখ্যা হল ১০,০০০।

লোকেশন সংক্রান্ত অনুমতি

এই উদাহরণে, ব্যবহারকারীর লোকেশন এবং তার কোঅর্ডিনেটে ম্যাপ দেখানোর জন্য ডিভাইসের জিপিএস ব্যবহার করা হয়। এটি চালু করতে, আপনাকে অবশ্যই প্রোজেক্টের Info.plist ফাইলে NSLocationWhenInUseUsageDescription অনুমতির বিবরণ যোগ করতে হবে।

এটি যোগ করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. প্রপার্টি লিস্ট এডিটর খুলতে Xcode-এর প্রোজেক্ট নেভিগেটরে Info.plist ফাইলে ক্লিক করুন।
  2. নতুন প্রপার্টি যোগ করতে 'তথ্য প্রপার্টি তালিকা'-এর পাশে '+' আইকনে ক্লিক করুন।
  3. 'কী' ফিল্ডে, 'NSLocationWhenInUseUsageDescription' টাইপ করুন। Xcode অটোমেটিক এটিকে 'গোপনীয়তা - ব্যবহার করার সময় লোকেশন ব্যবহারের বিবরণ' নামে অনুবাদ করবে। সম্ভাব্য লোকেশন সংক্রান্ত অনুমতির প্রপার্টির সম্পূর্ণ তালিকার জন্য, Apple ডেভেলপার ডকুমেন্টেশনে লোকেশন পরিষেবার জন্য অনুমোদনের অনুরোধ করা দেখুন।
  4. 'ধরন' ফিল্ডটি 'স্ট্রিং' হিসেবে সেট করে রাখুন।
  5. 'ভ্যালু' ফিল্ডে, আপনার অ্যাপের কেন ব্যবহারকারীর লোকেশন প্রয়োজন তার কারণের বিবরণ টাইপ করুন। যেমন, "আশেপাশের ব্যবসার তালিকা প্রদান করার জন্য ব্যবহারকারীর লোকেশন ট্র্যাক করে।"

মার্কার ক্লাস্টারিং প্রয়োগ করা

মার্কার ক্লাস্টারিং প্রয়োগ করতে তিনটি ধাপ অনুসরণ করতে হয়:

  1. ক্লাস্টার ম্যানেজার ইনস্ট্যান্স তৈরি করুন।
  2. আপনি যে মার্কার ক্লাস্টার করতে চান সেটি ক্লাস্টার ম্যানেজারে পাস করুন।
  3. ক্লাস্টার ম্যানেজার চালু করুন।
মার্কার ক্লাস্টারিং কীভাবে প্রয়োগ করতে হয় তার সম্পূর্ণ উদাহরণ দেখতে, Objective-C এবং Swift GitHub-এ উদাহরণ অ্যাপ চেক করুন।

ক্লাস্টার ম্যানেজার তৈরি করা হচ্ছে

ক্লাস্টার ম্যানেজার ব্যবহার করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. ViewController সেট করুন যেখানে আপনার ম্যাপ GMSMapViewDelegate প্রোটোকল মেনে চলার জন্য রেন্ডার করা হয়।
  2. GMUClusterManager-এর ইনস্ট্যান্স তৈরি করুন।
  3. আপনি যে GMSMapView-এর ইনস্ট্যান্সের মার্কার ক্লাস্টারিং প্রয়োগ করতে চান সেটি এবং নিম্নলিখিত প্রোটোকলের প্রয়োগ GMUClusterManager ইনস্ট্যান্সে পাস করুন:
    • GMUClusterIconGenerator: অ্যাপ্লিকেশন লজিক প্রদান করে যা বিভিন্ন জুম লেভেলে ব্যবহার করার জন্য ক্লাস্টার আইকন নিয়ে আসে।
    • GMUClusterAlgorithm: এমন একটি অ্যালগরিদম নির্দিষ্ট করে যা নির্ধারণ করে যে কীভাবে মার্কারগুলি ক্লাস্টার করা হয়, যেমন একই ক্লাস্টারে অন্তর্ভুক্ত করার জন্য মার্কারগুলির মধ্যে দূরত্ব।
    • GMUClusterRenderer: অ্যাপ্লিকেশন লজিক প্রদান করে যা ম্যাপে ক্লাস্টার আইকনের প্রকৃত রেন্ডারিং পরিচালনা করে।
  4. GMUClusterManager ইনস্ট্যান্সে ম্যাপ ডেলিগেট সেট করুন।

ইউটিলিটি লাইব্রেরিতে আইকন জেনারেটর (GMUDefaultClusterIconGenerator), অ্যালগরিদম (GMUNonHierarchicalDistanceBasedAlgorithm) এবং রেন্ডারার (GMUDefaultClusterRenderer)-এর ডিফল্ট ইমপ্লিমেন্টেশন অন্তর্ভুক্ত থাকে। আপনি চাইলে নিজের কাস্টম ক্লাস্টারিং আইকন জেনারেটর, অ্যালগরিদম এবং রেন্ডারার তৈরি করতে পারেন।

নিম্নলিখিত কোডটি ViewController-এর viewDidLoad কলব্যাকে এইসব ডিফল্ট ব্যবহার করে একটি ক্লাস্টার ম্যানেজার তৈরি করে:

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

মার্কার ও ক্লাস্টারে ইভেন্ট ম্যানেজ করুন

সাধারণত iOS-এর জন্য Maps SDK ব্যবহার করার সময়, ম্যাপে ইভেন্ট শুনতে আপনাকে অবশ্যই GMSMapViewDelegate প্রোটোকল প্রয়োগ করতে হবে। আপনি ম্যাপ ইভেন্ট শুনতে পারবেন, কিন্তু টাইপ-সেফ ক্লাস্টার ম্যানেজার ইভেন্ট শুনতে পারবেন না। ব্যবহারকারী কোনও মার্কার, কোনও স্বতন্ত্র ক্লাস্টার আইটেম বা ক্লাস্টারে ট্যাপ করলে, 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-এর জন্য কাস্টম ইমপ্লিমেন্টেশন প্রদান করতে পারেন। আপনি ইউটিলিটি লাইব্রেরিতে অন্তর্ভুক্ত এইসব প্রোটোকলের স্যাম্পেল ইমপ্লিমেন্টেশনের ভিত্তিতে কাস্টম ইমপ্লিমেন্টেশন করতে পারেন অথবা প্রোটোকল পূরণ করে সম্পূর্ণ কাস্টম ইমপ্লিমেন্টেশনের কোড লিখতে পারেন।