রুট প্ল্যান করো

কখনও কখনও, আপনার অ্যাপ ব্যবহারকারীদের যে রুট প্রদান করে তা আপনি প্ল্যান করতে চাইতে পারেন। Routes API বা Route Optimization API থেকে রুট টোকেন ব্যবহার করলে, আপনার পরিকল্পিত রুটের জন্য দুটি জিনিস নির্দিষ্ট করতে সাহায্য করতে পারে:

  • রুটের জন্য পলিলাইন

  • আপনার রুটের উদ্দেশ্য

যেমন, আপনার কাছে থাকতে পারে এমন রাউটিং উদ্দেশ্যের কিছু উদাহরণ এখানে দেওয়া হল:

  • ডেলিভারি করার সময় কমানো: খাবার ডেলিভারি করে এমন কোনও ব্যবসা খাবার ডেলিভারি করার সময় কমাতে চাইতে পারে।

  • ভ্রমণের সময় বা জ্বালানি খরচ কমানো: কোনও লজিস্টিক ব্যবসা তাদের ড্রাইভারদের দক্ষতা উন্নত করতে এবং জ্বালানি খরচ কমাতে চাইতে পারে।

  • গন্তব্যে পৌঁছানোর সময় কমানো: কোনও পরিষেবা ডিসপ্যাচ অপারেশন, অপারেটরদের কোনও কাজের অনুরোধে পৌঁছানোর সময় কমাতে চাইতে পারে।

  • খরচ কমানো এবং নিরাপত্তা উন্নত করা: রাইড-শেয়ারিং ব্যবসা এমন রুট খুঁজতে চাইতে পারে যেখানে রাইডারদের খরচ কম হবে এবং নিরাপত্তার কারণে নির্দিষ্ট কিছু এলাকা এড়িয়ে যাওয়া যাবে।

রুট টোকেন ব্যবহার করে রুট প্ল্যান করার ব্যাপারে আরও তথ্যের জন্য, Routes API-তে রুট টোকেন পান এবং Route Optimization API-তে ট্রানজিশন পলিলাইন ও রুট টোকেন দেখুন।

রুট অবজেক্টিভের জন্য কেন রুট টোকেন ব্যবহার করবেন

Routes API বা Route Optimization API থেকে পাওয়া রুট টোকেনের মাধ্যমে, আপনি প্রদত্ত রুটের উপর আরও নিয়ন্ত্রণ পাবেন:

  • Navigation SDK-এর ব্যবহারের জন্য আগে থেকে রুট প্ল্যান করুন।

  • Navigation SDK-এর ব্যবহার করার জন্য সেরা রুট বেছে নিন। আপনি যদি Routes API-তে রুট তৈরি করার সময় রুট টোকেনের অনুরোধ করেন, তাহলে আপনি প্রতিটি তৈরি করা রুটের জন্য একটি করে রুট টোকেন পাবেন। তারপর আপনি যে রুটের জন্য টোকেন ব্যবহার করতে চান সেটি বেছে নিতে পারবেন এবং Navigation SDK-তে পাস করতে পারবেন।

  • ETA ও দূরত্বের অনুমান সহ আগে থেকে ভাড়ার অনুমান করুন। আসল খরচ ও সময় আলাদা হতে পারে, তবে এই অনুমান প্রত্যাশিত ও আসল রুটের খরচের মধ্যে পার্থক্য কম করে।

  • আরও উন্নত রুট অবজেক্টিভ নির্দিষ্ট করুন, যেমন ইকো রাউটিং বা সবচেয়ে ছোট রুট।

রুট টোকেন কীভাবে কাজ করে

আপনি Routes API বা Route Optimization API ব্যবহার করে রুটের উদ্দেশ্য অনুযায়ী রুট প্ল্যান করতে পারবেন। আপনি এই API-এর যেকোনও একটি থেকে পাওয়া রুট টোকেন Navigation SDK-তে পাস করতে পারেন, যাতে এটি আপনার গাড়িকে কীভাবে রুট করবে তা নির্দেশ করতে পারে।

আপনি রুট টোকেনের অনুরোধ করলে এবং ব্যবহার করলে কী হয় তা এখানে দেওয়া হল:

  1. Routes API বা Route Optimization API একটি এনক্রিপ্ট করা রুট টোকেন রিটার্ন করে যার মধ্যে রুট পলিলাইন ও রুট অবজেক্টিভ অন্তর্ভুক্ত থাকে।

  2. আপনি নেভিগেশন SDK-তে রুট টোকেন পাস করেন।

  3. আরও দ্রুত রুট উপলভ্য থাকলেও, Navigation SDK আপনার প্ল্যান করা রুটে নেভিগেশন শুরু করে।

  4. ট্রিপ চলাকালীন, ট্রাফিক বা রাস্তার অবস্থা পরিবর্তন হলে অথবা গাড়িটি পরিকল্পিত রুট থেকে সরে গেলে, Navigation SDK একটি নতুন রুট গণনা করে যা আপনার রুট টোকেনে সেট করা রুটের উদ্দেশ্য এবং রাউটিং বিকল্পগুলি অনুসরণ করে।

এই প্রসেস আপনার প্ল্যান করা রুটের কতটা কাছাকাছি আসল রুট আছে তা সর্বাধিক করে।

কেন প্ল্যান করা রুট হুবহু অনুসরণ করা নাও হতে পারে

আপনার প্ল্যান করা রুটে নেভিগেশন শুরু হয়, তবে নিম্নলিখিত পরিস্থিতির মতো ক্ষেত্রে আসল রুট আলাদা হতে পারে:

  • গাড়িটি পরিকল্পিত শুরুর পয়েন্ট থেকে দূরে শুরু হয়।
  • ট্রিপ চলাকালীন ট্রাফিক বা রাস্তার অবস্থা পরিবর্তন হয়।
  • গাড়িটি প্ল্যান করা রুট থেকে বেরিয়ে যায়।

এইসব পার্থক্য আপনার প্ল্যান করা দূরত্ব, ETA এবং ট্রিপের অন্যান্য গুরুত্বপূর্ণ বিষয়ের উপর প্রভাব ফেলতে পারে।

রুট টোকেন ব্যবহার করে রুট প্ল্যান করা

আপনি রুট টোকেন তৈরি করে এবং তারপরে সেটি Navigation SDK-তে পাস করে একটি রুট প্ল্যান করতে পারেন, যেমনটি নিম্নলিখিত ধাপে বর্ণনা করা হয়েছে:

ধাপ ১: Routes API বা Route Optimization API ব্যবহার করে রুট টোকেন তৈরি করুন

  1. নিম্নলিখিত যেকোনও একটি পদ্ধতি ব্যবহার করে রুট টোকেনের জন্য অনুরোধ করুন:

  2. প্রয়োজনীয়তা পূরণ করতে আপনার Routes API অনুরোধ সেট-আপ করুন যাতে রুট টোকেন ব্যবহার করা যায়:

    • travelMode-কে DRIVE বা TWO_WHEELER-এ সেট করুন।
    • routingPreference-কে TRAFFIC_AWARE বা TRAFFIC_AWARE_OPTIMAL-এ সেট করুন।
    • Viaটি ওয়েপয়েন্ট ব্যবহার করবেন না।

ধাপ ২: Navigation SDK-তে রুট টোকেন পাস করা

  1. রুট টোকেন স্টোর করা: Navigation SDK-তে, রুট টোকেন স্টোর করার জন্য একটি স্ট্রিং সেট-আপ করুন। যেমন:

    let routeToken = "route token returned by Routes API"
    

    ফেরত পাঠানো রুট টোকেনের উদাহরণ:

    {
    // Other fields
    "routeToken": "CqMBCjoKCJQOor5DHcwiEhBon3XpHXFnVvDeWMwd9PpAGgz6wtnFDKIBrAHTARpCApUDSggAAAAACjcrP3gBEAQaTApKChgKDQoCCAERAAAAAACAZkAR3SQGgZUXdUASEggAEAMQBhATEBIYAkIEGgIIBSIYChZ2VEJiWlBPSkk1aU5wUVRzNTV5d0FRKAEiFQBcJuds-Efh-2QZhOMTtUCCxEVL_g",
    }
    
  2. mapView.navigator-এর setDestinationsWithToken:completionHandler: পদ্ধতি ব্যবহার করে Navigation SDK-তে রুট টোকেন পাস করুন। Navigation SDK, রুট টোকেন থেকে গন্তব্য ও রুটিং সংক্রান্ত বিকল্প পায়, তাই আপনাকে ওয়েপয়েন্ট পাস করতে হয় না।

    আপনার অ্যাপে সেট করা ভ্রমণ মোড, যেমন mapView.travelMode, অবশ্যই নিম্নলিখিত ভ্যালুগুলির মধ্যে একটি হতে হবে:

    • .driving (GMSNavigationTravelModeDriving): গাড়ি চালানো। এটি হল ডিফল্ট ভ্যালু, তাই বেশিরভাগ অ্যাপের ক্ষেত্রে এটি পরিবর্তন করার প্রয়োজন হয় না।
    • .twoWheeler (GMSNavigationTravelModeTwoWheeler): মোটরসাইকেল।

    অন্য যেকোনও ভ্রমণ মোড .travelModeUnsupported (GMSRouteStatusTravelModeUnsupported) সহ অনুরোধটি ব্যর্থ করে। যেকোনও একটি কাজ করে এমন ভ্যালুর সাথে, রুটটি আপনার রুট টোকেনে ভ্রমণ মোড ব্যবহার করে। যেমন, আপনার অ্যাপ যদি ড্রাইভিং ব্যবহার করে এবং আপনার রুট টোকেন যদি টু-হুইলার রুটের জন্য হয়, তাহলে Navigation SDK টু-হুইলার রুট প্রদান করে। রুটটি কোন ভ্রমণ মোড ব্যবহার করে তা নিশ্চিত করতে, resolvedParameters.travelMode চেক করুন। আরও তথ্যের জন্য, সমাধান করা রাউটিং বিকল্প দেখুন।

  3. আপনার কমপ্লিশন হ্যান্ডলারে রুটের স্ট্যাটাস চেক করুন। Navigation SDK রুট গণনা করা শেষ করলে, এটি আপনার কমপ্লিশন হ্যান্ডলারের কাছে GMSNavigationRouteDescription পাস করে। গাড়ির লোকেশন থেকে আপনার রুট টোকেনে থাকা গন্তব্যে যাওয়ার রুট খুঁজে পেলে, রুটের বিবরণের routeStatus হল .OK (GMSRouteStatusOK) এবং আপনি গাইডেন্স শুরু করতে পারবেন। অন্যথায়, আপনার সম্পূর্ণকরণ হ্যান্ডলারও একটি NSError পায় যা ব্যর্থতার বিবরণ দেয়। যেমন:

    mapView.navigator?.setDestinationsWithToken(routeToken) { [weak self] routeDescription, error in
      if routeDescription?.routeStatus == .OK {
        self?.mapView.navigator?.isGuidanceActive = true
      }
    }
    

Navigation SDK আপনার রুট টোকেন প্রয়োগ করেছে কিনা তা চেক করুন

.OK-এর রুট স্ট্যাটাস মানে হল, Navigation SDK একটি রুট খুঁজে পেয়েছে, তবে এটি আপনার প্ল্যান করা রুট নাও হতে পারে। রুটটি আপনার পরিকল্পিত রুটের সাথে মেলে কিনা তা চেক করতে, আপনার সম্পূর্ণকরণ হ্যান্ডলারে এইসব ধাপ অনুসরণ করুন:

  1. কনফার্ম করুন যে রুটের বিবরণের routeStatus হল .OK। Navigation SDK শুধুমাত্র রুট খুঁজে পেলে তবেই রুট টোকেনের বিবরণ প্রদান করে। আরও তথ্যের জন্য, ধাপ ২ দেখুন।

  2. রুটের বিবরণের routeTokenExecutionDetails পান, এটি এমন একটি অবজেক্ট যা GMSNavigationRouteTokenExecutionDetails প্রোটোকল মেনে চলে। সার্ভার যদি রুট টোকেনের বিবরণ না দেয়, তাহলে এই প্রপার্টি nil হবে।

  3. এক্সিকিউশনের বিবরণের tokenExecutionStatus প্রপার্টি চেক করুন। এটি .tokenSuccessfullyApplied হলে, রুটটি আপনার প্ল্যান করা রুটের সাথে মিলে যায়। অন্য কোনও স্ট্যাটাস থাকলে বুঝতে হবে যে আপনার প্ল্যান করা রুটের থেকে এই রুট আলাদা হতে পারে। প্রতিটি স্ট্যাটাস সম্পর্কে আরও তথ্য পেতে, টোকেন এক্সিকিউশন স্ট্যাটাস ভ্যালু দেখুন।

  4. ঐচ্ছিক: স্ট্যাটাস .tokenSuccessfullyApplied হলে, একই এক্সিকিউশন বিবরণের resolvedParameters প্রপার্টি চেক করে দেখুন যে রুটটি কোন রাউটিং বিকল্প ব্যবহার করে, যেমন এটি টোল এড়িয়ে যায় কিনা। আরও তথ্যের জন্য, সমাধান করা রাউটিং বিকল্প দেখুন।

টোকেন এক্সিকিউশন স্ট্যাটাস ভ্যালু

routeStatus যদি .OK হয়, তাহলে আপনি যেকোনও টোকেন এক্সিকিউশন স্ট্যাটাসের সাথে গাইডেন্স শুরু করতে পারবেন। রুটটি আপনার প্ল্যান করা রুট অনুসরণ করে কিনা তা স্ট্যাটাস থেকে জানতে পারবেন।

স্ট্যাটাস আপনার প্ল্যান করা রুট অনুসরণ করে বিবরণ
.tokenSuccessfullyApplied হ্যাঁ Navigation SDK আপনার রুট টোকেন প্রয়োগ করেছে।
.tokenAppliedWithLocationMismatch ঠিক তা নয় Navigation SDK আপনার প্ল্যান করা রুট আবার তৈরি করতে পারেনি এবং আপনার রুট টোকেনে ডিভাইসটি উৎস থেকে ২৫ মিটারের বেশি দূরে ছিল। রুটটি এখনও আপনার রুট টোকেন থেকে গন্তব্য এবং রাউটিং বিকল্পগুলি ব্যবহার করে।
.tokenIgnoredOther ঠিক তা নয় অন্য কোনও কারণে Navigation SDK আপনার প্ল্যান করা রুট আবার তৈরি করতে পারেনি, যেমন, আপনার প্ল্যান করা রুটের কোনও রাস্তা বন্ধ হয়ে গেছে। রুটটি এখনও আপনার রুট টোকেন থেকে গন্তব্য এবং রাউটিং বিকল্পগুলি ব্যবহার করে।
.noTokenProvided প্রযোজ্য নয় রুটের অনুরোধে কোনও রুট টোকেন অন্তর্ভুক্ত ছিল না।
.unknown অজানা স্ট্যাটাস অজানা।

রুটটি যদি আপনার পরিকল্পিত রুট অনুসরণ না করে এবং সঠিক রুটটি গুরুত্বপূর্ণ হয়, উদাহরণস্বরূপ, কারণ আপনি এটি একটি মূল্য গণনা করতে ব্যবহার করেছেন, স্ট্যাটাস লগ করুন অথবা গাড়ির বর্তমান লোকেশন থেকে একটি নতুন রুট টোকেন অনুরোধ করুন।

সমাধান করা রাউটিং বিকল্প

resolvedParameters হল এমন একটি অবজেক্ট যা GMSNavigationRouteTokenResolvedParameters প্রোটোকল মেনে চলে অথবা রাউটিং বিকল্প উপলভ্য না থাকলে nil। এতে নিম্নলিখিত প্রপার্টি আছে:

  • travelMode: রুট যে ট্রাভেল মোড ব্যবহার করে, যেমন .driving (GMSNavigationTravelModeDriving)। রুট এমন কোনও ট্রাভেল মোড ব্যবহার করলে যার কোনও ম্যাচিং ভ্যালু নেই অথবা ট্রাভেল মোড উপলভ্য না থাকলে, Navigation SDK-ও .driving রিপোর্ট করে।
  • avoidTolls: রুটে টোল এড়ানো যাবে কিনা।
  • avoidHighways: রুটটি হাইওয়ে এড়িয়ে যায় কিনা।
  • avoidFerries: রুটে ফেরি এড়ানো হয়েছে কিনা।
  • avoidTunnels: সম্ভব হলে টানেল এড়িয়ে যাওয়ার জন্য রুট গণনা করা হয়েছে কিনা।
  • avoidVignettes: যেসব দেশে সম্ভব হলে টোল ভিনিয়েট এড়িয়ে যাওয়ার জন্য রুট গণনা করা হয়েছে, সেগুলি ইউনিকোড CLDR দুই-অক্ষরের অঞ্চল কোড হিসেবে দেখানো হয়েছে, যেমন সুইজারল্যান্ডের জন্য CH।
  • rerouteStrategy: ট্রিপ চলাকালীন নতুন রুট গণনা করার জন্য রাউটিং ব্যাকএন্ড যে কৌশলটি ব্যবহার করে। কৌশলের মধ্যে রয়েছে .bestBasedOnTokenParameters (GMSNavigationRerouteStrategyBestBasedOnTokenParameters), যা নতুন রুট গণনা করার জন্য আপনার রুট টোকেনে রাউটিং প্যারামিটার ব্যবহার করে।

টোকেন এক্সিকিউশন স্ট্যাটাস .tokenSuccessfullyApplied না হলে, Navigation SDK শুধুমাত্র travelMode, avoidTolls, avoidHighways এবং avoidFerries রিপোর্ট করে। অন্যান্য প্রপার্টির ডিফল্ট ভ্যালু আছে, এমনকি আপনি রুট টোকেনের অনুরোধ করার সময় টানেল বা টোল ভিনিয়েট এড়িয়ে যাওয়ার অনুরোধ করলেও: avoidTunnels হল false (NO), avoidVignettes খালি আছে এবং rerouteStrategy হল .unknown (GMSNavigationRerouteStrategyUnknown)।

উদাহরণ

নিম্নলিখিত কোডের উদাহরণ থেকে বোঝা যায় যে কীভাবে রুট টোকেন ব্যবহার করে রুট প্ল্যান করতে হয়, Navigation SDK টোকেন প্রয়োগ করেছে কিনা তা চেক করতে হয় এবং নির্দেশনা শুরু করতে হয়।

সুইফ্ট

let routeToken = "route token returned by Routes API"

mapView.navigator?.setDestinationsWithToken(routeToken) { [weak self] routeDescription, error in
  // Check whether the Navigation SDK found a route.
  guard routeDescription?.routeStatus == .OK else {
    print("Route error: \(error?.localizedDescription ?? "unknown")")
    return
  }

  // Check whether the Navigation SDK applied the route token.
  if let executionDetails = routeDescription?.routeTokenExecutionDetails {
    if executionDetails.tokenExecutionStatus != .tokenSuccessfullyApplied {
      print("The route might differ from your planned route.")
    }
  } else {
    print("Route token details aren't available.")
  }

  self?.mapView.navigator?.isGuidanceActive = true
}

Objective-C

NSString *routeToken = @"route token returned by Routes API";

[mapView.navigator setDestinationsWithToken:routeToken
                          completionHandler:^(id<GMSNavigationRouteDescription> _Nullable routeDescription,
                                              NSError *_Nullable error) {
  // Check whether the Navigation SDK found a route.
  if (routeDescription.routeStatus != GMSRouteStatusOK) {
    NSLog(@"Route error: %@", error.localizedDescription);
    return;
  }

  // Check whether the Navigation SDK applied the route token.
  id<GMSNavigationRouteTokenExecutionDetails> executionDetails =
      routeDescription.routeTokenExecutionDetails;
  if (executionDetails == nil) {
    NSLog(@"Route token details aren't available.");
  } else if (executionDetails.tokenExecutionStatus !=
             GMSNavigationRouteTokenExecutionStatusTokenSuccessfullyApplied) {
    NSLog(@"The route might differ from your planned route.");
  }

  mapView.navigator.guidanceActive = YES;
}];

একাধিক স্টপ সহ পরিস্থিতি

আপনি সর্বাধিক ২৫টি ওয়েপয়েন্ট কনফিগার করতে পারবেন।

Navigation SDK অটোমেটিক পরবর্তী গন্তব্যে নিয়ে যায় না। গাড়িটি কোনও ওয়েপয়েন্টে পৌঁছালে, ট্রিপের পরবর্তী অংশ শুরু করতে continueToNextDestinationWithCompletion: কল করুন। এটি সেইসব রুট টোকেনের ক্ষেত্রেও প্রযোজ্য যেগুলিতে ইন্টারমিডিয়েট ওয়েপয়েন্ট আছে। আপনি পরবর্তী গন্তব্যে এগিয়ে গেলে, Navigation SDK নতুন রুট প্ল্যান করার পরিবর্তে আপনার রুট টোকেন থেকে রুট ফলো করা চালিয়ে যায়।

রুট টোকেন ও Navigation SDK কীভাবে ইন্টার‍্যাক্ট করে

Navigation SDK কীভাবে আপনার প্ল্যান করা রুট ম্যানেজ করে তা এখানে দেওয়া হল:

  • ট্রিপ চলাকালীন নতুন রুট গণনা করার সময় সহ, আপনার অ্যাপে নিম্নলিখিত সেটিংসের পরিবর্তে আপনার রুট টোকেনে সেট করা রাউটিং বিকল্প ব্যবহার করে:

    • avoidsHighways
    • avoidsTolls
    • avoidsFerries
    • licensePlateRestriction
    • আপনার অ্যাপে সেট করা ভ্রমণ মোড
  • রুট গণনা বা অ্যাডজাস্ট করার সময় এই সেটিংস অনুসরণ করে:

    • আপনার রুট টোকেন থেকে রুটের উদ্দেশ্য, যেমন ইকো রাউটিং বা সবচেয়ে ছোট রুট। Navigation SDK-কে রুট অ্যাডজাস্ট করতে হলে, এটি রুট টোকেনের অনুরোধ করার সময় আপনার উল্লেখ করা রুট অবজেক্টিভ ব্যবহার করে।
    • আপনার রুট টোকেন থেকে ওয়েপয়েন্ট-সম্পর্কিত বিকল্প, যেমন রাস্তার-দিক সংক্রান্ত পছন্দ।