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

প্ল্যাটফর্ম নির্বাচন করুন: অ্যান্ড্রয়েড আইওএস জাভাস্ক্রিপ্ট

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

আপনার মার্কারগুলোকে গুচ্ছবদ্ধ করার মাধ্যমে, আপনি মানচিত্রটিকে পাঠযোগ্য করে না তুলেই এতে প্রচুর সংখ্যক মার্কার স্থাপন করতে পারেন। মার্কার গুচ্ছবদ্ধকরণ ইউটিলিটি আপনাকে বিভিন্ন জুম লেভেলে একাধিক মার্কার পরিচালনা করতে সাহায্য করে।

যখন কোনো ব্যবহারকারী মানচিত্রটি উচ্চ জুম স্তরে দেখেন, তখন স্বতন্ত্র মার্কারগুলো মানচিত্রে প্রদর্শিত হয়। যখন ব্যবহারকারী জুম আউট করেন, তখন মার্কারগুলো একত্রিত হয়ে গুচ্ছ তৈরি করে, যাতে মানচিত্রটি দেখা সহজ হয়।

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

ডিফল্ট শৈলীতে গুচ্ছবদ্ধ চিহ্নিতকারী সহ একটি মানচিত্র

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

কাস্টম ক্লাস্টার মার্কার সহ একটি মানচিত্র

পূর্বশর্ত এবং নোট

iOS ইউটিলিটি লাইব্রেরির জন্য ম্যাপস এসডিকে

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

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

অবস্থানের অনুমতি

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

এটি যোগ করতে, নিম্নলিখিতগুলি করুন:

  1. প্রপার্টি লিস্ট এডিটর খোলার জন্য এক্সকোডের প্রজেক্ট নেভিগেটরে থাকা Info.plist ফাইলটিতে ক্লিক করুন।
  2. নতুন প্রপার্টি যোগ করতে 'ইনফরমেশন প্রপার্টি লিস্ট'-এর পাশে থাকা '+' আইকনে ক্লিক করুন।
  3. 'key' ফিল্ডে 'NSLocationWhenInUseUsageDescription' টাইপ করুন। Xcode স্বয়ংক্রিয়ভাবে এটিকে 'Privacy - Location When In Use Usage Description' এই পূর্ণ নামে অনুবাদ করবে। সম্ভাব্য লোকেশন পারমিশন প্রপার্টিগুলোর সম্পূর্ণ তালিকার জন্য, Apple Developer ডকুমেন্টেশনে 'Requesting Authorization for Location Services' দেখুন।
  4. 'Type' ফিল্ডটি 'String'-এ সেট করা রাখুন।
  5. 'Value' ফিল্ডে, আপনার অ্যাপের কেন ব্যবহারকারীর অবস্থান ব্যবহারের প্রয়োজন, তার কারণ বর্ণনা করুন। উদাহরণস্বরূপ, "কাছাকাছি ব্যবসার তালিকা দেখানোর জন্য ব্যবহারকারীর অবস্থান নির্ণয় করে।"

মার্কার ক্লাস্টারিং বাস্তবায়ন করা

মার্কার ক্লাস্টারিং বাস্তবায়নে তিনটি ধাপ রয়েছে:

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

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

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

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

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

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

সুইফট

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)
    // ...
  }
  // ...
}
      

উদ্দেশ্য-সি

@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
      

মার্কার যোগ করা

মার্কার ক্লাস্টারারে মার্কার যোগ করার দুটি উপায় আছে: এককভাবে অথবা একটি অ্যারে হিসেবে।

ব্যক্তিগত চিহ্নিতকারী

সুইফট

let position = CLLocationCoordinate2D(latitude: 47.60, longitude: -122.33)
let marker = GMSMarker(position: position)
clusterManager.add(marker)
      

উদ্দেশ্য-সি

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(47.60, -122.33);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
[_clusterManager addItem:marker];
      

মার্কারের অ্যারে

সুইফট

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)
      

উদ্দেশ্য-সি

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 মেথডটি কল করতে হবে।

সুইফট

clusterManager.cluster()
      

উদ্দেশ্য-সি

[_clusterManager cluster];
      

মার্কার এবং ক্লাস্টারের ইভেন্টগুলি পরিচালনা করুন

সাধারণত iOS-এর জন্য Maps SDK ব্যবহার করার সময়, ম্যাপের ইভেন্টগুলো শোনার জন্য আপনাকে অবশ্যই GMSMapViewDelegate প্রোটোকলটি ইমপ্লিমেন্ট করতে হবে। আপনি ম্যাপ ইভেন্টগুলো শুনতে পারবেন, কিন্তু টাইপ-সেফ ক্লাস্টার ম্যানেজার ইভেন্টগুলো শুনতে পারবেন না। যখন ব্যবহারকারী একটি মার্কার, একটি স্বতন্ত্র ক্লাস্টার আইটেম, বা একটি ক্লাস্টার ট্যাপ করেন, তখন API-টি mapView:didTapMarker: ট্রিগার করে এবং অতিরিক্ত ক্লাস্টার ডেটা marker.userData প্রপার্টিতে সংযুক্ত করে। এরপর আপনি userData টি GMUCluster প্রোটোকল মেনে চলে কিনা তা পরীক্ষা করে দেখতে পারেন যে একটি ক্লাস্টার আইকন নাকি একটি মার্কার ট্যাপ করা হয়েছে।

সুইফট

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
}
      

উদ্দেশ্য-সি

- (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 এর জন্য একটি নিজস্ব ইমপ্লিমেন্টেশন প্রদান করতে পারেন। আপনি ইউটিলিটি লাইব্রেরিতে অন্তর্ভুক্ত এই প্রোটোকলগুলোর নমুনা ইমপ্লিমেন্টেশনের উপর ভিত্তি করে আপনার নিজস্ব ইমপ্লিমেন্টেশন তৈরি করতে পারেন, অথবা প্রোটোকলগুলো পূরণ করে একটি সম্পূর্ণ নিজস্ব ইমপ্লিমেন্টেশন কোড করতে পারেন।