রুট পলিলাইনের অনুরোধ করা

ইউরোপীয় অর্থনৈতিক অঞ্চল (EEA)-এর ডেভেলপার

computeRoutes পদ্ধতি (REST) এবং ComputeRoutes পদ্ধতি (gRPC) দু'টিই উত্তরের অংশ হিসেবে পলিলাইন দ্বারা উপস্থাপিত রুট রিটার্ন করে। এইসব API দু'ধরনের পলিলাইন রিটার্ন করে:

  • প্রাথমিক পলিলাইন (ডিফল্ট), এটি একটি রুটকে বোঝায়, তবে পলিলাইনে ট্রাফিক সংক্রান্ত তথ্য এম্বেড করা থাকে না। যেসব অনুরোধে সাধারণ পলিলাইন রিটার্ন করা হয় সেগুলির জন্য Routes Basic রেট অনুযায়ী বিল করা হয়। Routes API-এর জন্য বিলিং সম্পর্কে আরও জানুন।

  • ট্রাফিক-সচেতন পলিলাইন, রুটের মধ্যে ট্রাফিক পরিস্থিতি সম্পর্কে তথ্য থাকে। ট্রাফিক কন্ডিশন স্পিড ক্যাটাগরি (NORMAL, SLOW, TRAFFIC_JAM) অনুযায়ী প্রকাশ করা হয় যা পলিলাইনের নির্দিষ্ট ইন্টারভ্যালের উপর প্রযোজ্য। ট্রাফিক-সচেতন পলিলাইনের অনুরোধের জন্য পছন্দের রুট রেট অনুযায়ী বিল করা হয়। Routes API-এর জন্য বিলিং সম্পর্কে আরও জানুন। আরও বিবরণের জন্য, পলাইন কোয়ালিটি কনফিগার করা দেখুন

পলিলাইন সম্পর্কে আরও জানতে, এগুলি দেখুন:

কোনও রুট, লেগ বা ধাপের জন্য সাধারণ পলিলাইনের অনুরোধ করা

পলিলাইনকে Polyline (REST) বা Polyline (gRPC) অবজেক্টের মাধ্যমে দেখানো হয়। আপনি উত্তর হিসেবে রুট, লেগ ও স্টেপ লেভেলে পলিলাইন দেখাতে পারেন।

রেসপন্স ফিল্ড মাস্ক ব্যবহার করে কোন পলিলাইন ফেরত দিতে হবে তা নির্দিষ্ট করুন:

  • রুট লেভেলে, উত্তর ফিল্ড মাস্কে routes.polyline যোগ করে উত্তরের মধ্যে একটি পলিলাইন রিটার্ন করুন।

  • লেগ লেভেলে, routes.legs.polyline অন্তর্ভুক্ত করে রুটের প্রতিটি লেগের জন্য রেসপন্সে একটি পলিলাইন রিটার্ন করুন।

  • ধাপের লেভেলে, routes.legs.steps.polyline অন্তর্ভুক্ত করে লেগের প্রতিটি ধাপের জন্য রেসপন্সে একটি পলিলাইন রিটার্ন করুন।

যেমন, পুরো রুটের জন্য, প্রতিটি লেগের জন্য এবং প্রতিটি লেগের প্রতিটি ধাপের জন্য পলিলাইন রিটার্ন করতে:

curl -X POST -d '{
  "origin":{
    "address": "1600 Amphitheatre Parkway, Mountain View, CA"
  },
  "destination":{
    "address": "24 Willie Mays Plaza, San Francisco, CA 94107"
  },
  "travelMode": "DRIVE"
}' \
-H 'Content-Type: application/json' \
-H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline,routes.legs.steps.polyline' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

এই অনুরোধ নিম্নলিখিত উত্তর প্রদান করে যার মধ্যে রুটের প্রতিটি লেগ এবং লেগের প্রতিটি ধাপের জন্য রুটের পলিলাইন অন্তর্ভুক্ত থাকে:

{
  "routes": [
    {
      "legs": [
        {
          "polyline": {
              "encodedPolyline": "ipkcFfich...@Bs@?A?O?SD{A@o@B}@I?qA?_AA_@@_@?"
          }
        },
          "steps": [
              {
                  "polyline": {
                      "encodedPolyline": "kclcF...@sC@YIOKI"
                  }
              },
              {
                  "polyline": {
                      "encodedPolyline": "wblcF~...SZSF_@?"
                  }
              },
              ...
      ],
      "distanceMeters": 56901,
      "duration": "2420s",
      "polyline": {
        "encodedPolyline": "ipkcFfich...@Bs@?A?O?SD{A@o@B}@I?qA?_AA_@@_@?"
      }
    }
  ]
}

এই অনুরোধে শুধুমাত্র সোর্স ও ডেস্টিনেশন থাকার কারণে, রিটার্ন করা রুটে শুধুমাত্র একটি লেগ থাকে। তাই, লেগ ও রুটের পলিলাইন একই।

আপনি অনুরোধে কোনও ইন্টারমিডিয়েট ওয়েপয়েন্ট যোগ করলে, রিটার্ন করা রুটে দুটি লেগ থাকে:

curl -X POST -d '{
  "origin":{
    "address": "1600 Amphitheatre Parkway, Mountain View, CA"
  },
  "destination":{
    "address": "24 Willie Mays Plaza, San Francisco, CA 94107"
  },
  "intermediates": [
    { "address": "450 Serra Mall, Stanford, CA 94305, USA"},
  ],
  "travelMode": "DRIVE",
}' \
-H 'Content-Type: application/json' \
-H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

এই অনুরোধ দুটি লেগ রিটার্ন করে, যার প্রতিটিতে একটি অনন্য পলিলাইন এবং সম্পূর্ণ রুটের জন্য একটি পলিলাইন রয়েছে:

{
  "routes": [
    {
      "legs": [
        {
          "polyline": {
            "encodedPolyline": "kclcFfqchV?A...?I@G?GAECCCEKICBAFG"
          }
          "steps": [
            {
                "polyline": {
                    "encodedPolyline": "kclcFfqch...YIOKI"
                }
            },
        ...
        },
        {
          "polyline": {
            "encodedPolyline": "ojmcFtethV?K...QOYQOGA?_@MUG[Ga@G"
          }
          "steps": [
            {
                "polyline": {
                    "encodedPolyline": "uypeFbo`jVgJq...PoBiC"
                }
            },
        ...
        }
      ],
      "distanceMeters": 68403,
      "duration": "3759s",
      "polyline": {
          "encodedPolyline": "kclcFfqchV?A?CBKF[Ha...?GAECCCEKICBAFGJEBE"
      }
    }
  ]
}

পলিলাইনের কোয়ালিটি

পলাইন কোয়ালিটি নিম্নলিখিত শব্দ ব্যবহার করে বর্ণনা করা যেতে পারে:

  • পয়েন্টের ফ্লোটিং-পয়েন্ট প্রিসিশন

    পয়েন্টগুলি অক্ষাংশ এবং দ্রাঘিমাংশের মান হিসাবে নির্দিষ্ট করা হয়, যা একক-নির্ভুল ফ্লোটিং-পয়েন্ট ফর্ম্যাটে উপস্থাপন করা হয়। এটি ছোট ভ্যালুর জন্য ভালো কাজ করে (যা সঠিকভাবে উপস্থাপন করা যায়), কিন্তু ফ্লোটিং-পয়েন্ট রাউন্ডিং সংক্রান্ত সমস্যার কারণে ভ্যালু বেড়ে গেলে নির্ভুলতা কমে যায়।

    computeRoutes মেথড (REST) এবং ComputeRoutes-এ এটি polylineEncoding দ্বারা নিয়ন্ত্রিত হয়।

  • পলিলাইন তৈরি করা পয়েন্টের সংখ্যা

    যত বেশি পয়েন্ট থাকবে, পলিলাইন তত মসৃণ হবে (বিশেষ করে কার্ভের ক্ষেত্রে)।

    computeRoutes মেথড (REST) এবং ComputeRoutes-এ এটি polylineQuality দ্বারা নিয়ন্ত্রিত হয়।

পলিলাইন এনকোডিংয়ের ধরন কনফিগার করা

পলিলাইন টাইপ কন্ট্রোল করার জন্য polylineEncoding অনুরোধ বিকল্প ব্যবহার করুন। polylineEncoding প্রপার্টি নিয়ন্ত্রণ করে যে পলিলাইন ENCODED_POLYLINE (ডিফল্ট) হিসেবে এনকোড করা হবে কিনা, যার অর্থ হল এনকোড করা পলিলাইন অ্যালগরিদম ফর্ম্যাট ব্যবহার করা হবে, অথবা GEO_JSON_LINESTRING, যার অর্থ হল GeoJSON লাইনস্ট্রিং ফর্ম্যাট ব্যবহার করা হবে।

যেমন, অনুরোধের বডিতে:

curl -X POST -d '{
  "origin":{
    "address": "1600 Amphitheatre Parkway, Mountain View, CA"
  },
  "destination":{
    "address": "24 Willie Mays Plaza, San Francisco, CA 94107"
  },
  "travelMode": "DRIVE",
  "polylineEncoding": "ENCODED_POLYLINE"
}' \
-H 'Content-Type: application/json' \
-H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

পলিলাইনের কোয়ালিটি কনফিগার করুন

polylineQuality পলিলাইনের কোয়ালিটি HIGH_QUALITY বা OVERVIEW (ডিফল্ট) হিসেবে নির্দিষ্ট করে। OVERVIEW-এর ক্ষেত্রে, পলিলাইনটি অল্প সংখ্যক পয়েন্ট ব্যবহার করে তৈরি করা হয় এবং HIGH_QUALITY-এর তুলনায় এর অনুরোধ লেটেন্সি কম হয়।

যেমন, অনুরোধের বডিতে:

{
  "origin":{
    "location":{
      "latLng":{
        "latitude": 37.419734,
        "longitude": -122.0827784
      }
    }
  },
  "destination":{
    "location":{
      "latLng":{
        "latitude": 37.417670,
        "longitude": -122.079595
      }
    }
  },
  "travelMode": "DRIVE",
  "routingPreference": "TRAFFIC_AWARE",
  "polylineQuality": "HIGH_QUALITY",
  "polylineEncoding": "ENCODED_POLYLINE",
  "departureTime": "2023-10-15T15:01:23.045123456Z",
  ...
}

ট্রাফিক-অ্যাওয়ার পলিলাইনের জন্য অনুরোধ করুন

উপরে দেখানো সব উদাহরণই সাধারণ পলিলাইন রিটার্ন করে, অর্থাৎ ট্রাফিক তথ্য ছাড়া পলিলাইন। এছাড়াও, আপনি অনুরোধ করতে পারেন যে পলিলাইন যেন রুটের এবং রুটের প্রতিটি লেগের জন্য ট্রাফিক সংক্রান্ত তথ্য অন্তর্ভুক্ত করে।

ট্রাফিক-সচেতন পলিলাইন রুটের বিভিন্ন অংশ জুড়ে ট্রাফিক পরিস্থিতি সম্পর্কে তথ্য প্রদান করে। রেসপন্স পলিলাইনের নির্দিষ্ট ইন্টারভ্যালের জন্য ট্রাফিক কন্ডিশন স্পিড ক্যাটেগরি (NORMAL, SLOW, TRAFFIC_JAM) হিসেবে প্রকাশ করা হয়। ইন্টারভ্যালগুলি তাদের শুরুর (ইনক্লুসিভ) এবং শেষের (এক্সক্লুসিভ) পলিলাইন পয়েন্টের ইনডেক্স দ্বারা নির্ধারিত হয়।

যেমন, নিম্নলিখিত উত্তরে NORMAL পলিলাইন পয়েন্ট ২ ও ৪-এর মধ্যে ট্রাফিক দেখানো হয়েছে:

{
  "startPolylinePointIndex": 2,
  "endPolylinePointIndex": 4,
  "speed": "NORMAL"
}

ট্রাফিক-সচেতন পলিলাইন কম্পিউট করার অনুরোধ করতে, অনুরোধে নিম্নলিখিত প্রপার্টি সেট করুন:

  • ট্রাফিক গণনা চালু করতে extraComputations অ্যারে ফিল্ডকে TRAFFIC_ON_POLYLINE হিসেবে সেট করুন।

  • travelMode-কে DRIVE বা TWO_WHEELER হিসেবে সেট করুন। অন্য কোনও ভ্রমণের মোডের অনুরোধ করলে, সেটির উত্তর হিসেবে একটি সমস্যা সংক্রান্ত মেসেজ দেখানো হয়।

  • অনুরোধে TRAFFIC_AWARE বা TRAFFIC_AWARE_OPTIMAL রাউটিং পছন্দ নির্দিষ্ট করুন। আরও তথ্যের জন্য, কোয়ালিটি বনাম লেটেন্সি কনফিগার করুন।

  • এমন একটি রেসপন্স ফিল্ড মাস্ক সেট করুন যা রেসপন্স প্রপার্টি ফেরত দেওয়ার কথা নির্দিষ্ট করে:

    • রুট লেভেলে, উত্তর ফিল্ড মাস্কে routes.travelAdvisory যোগ করে উত্তরে সব ভ্রমণ সংক্রান্ত তথ্য ফেরত দিন। শুধুমাত্র ট্রাফিক সংক্রান্ত তথ্য পেতে routes.travelAdvisory.speedReadingIntervals উল্লেখ করুন

    • লেগ লেভেলে, routes.legs.travelAdvisory সহ রুটের প্রতিটি লেগের জন্য উত্তরে সমস্ত ভ্রমণের তথ্য ফেরত দাও। শুধুমাত্র ট্রাফিক সংক্রান্ত তথ্য পেতে, routes.legs.travelAdvisory.speedReadingIntervals উল্লেখ করুন।

curl -X POST -d '{
  "origin":{
    "address": "1600 Amphitheatre Parkway, Mountain View, CA"
  },
  "destination":{
    "address": "24 Willie Mays Plaza, San Francisco, CA 94107"
  },
  "travelMode": "DRIVE",
  "extraComputations": ["TRAFFIC_ON_POLYLINE"],
  "routingPreference": "TRAFFIC_AWARE_OPTIMAL"
}' \
-H 'Content-Type: application/json' \
-H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline,routes.travelAdvisory,routes.legs.travelAdvisory' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

ট্রাফিক-সচেতন পলিলাইনের জন্য উত্তরের উদাহরণ

উত্তরে, ট্রাফিক ডেটা পলিলাইনে এনকোড করা থাকে এবং travelAdvisory ফিল্ডে থাকে, যার ধরন হল RouteLegTravelAdvisory অবজেক্ট (প্রতিটি লেগ) এবং RouteTravelAdvisory অবজেক্ট (রুট)।

যেমন:

{
  "routes": [
    {
      "legs": {
        "polyline": {
          "encodedPolyline": "}boeF~zbjVAg@EmB`GWHlD"
        },
        // Traffic data for the leg.
        "travelAdvisory": {
          "speedReadingIntervals": [
            {
              "endPolylinePointIndex": 1,
              "speed": "NORMAL"
            },
            {
              "startPolylinePointIndex": 1,
              "endPolylinePointIndex": 2,
              "speed": "SLOW"
            },
            {
              "startPolylinePointIndex": 2,
              "endPolylinePointIndex": 4,
              "speed": "NORMAL"
            }
          ] 
        }
      },
      "polyline": {
        "encodedPolyline": "}boeF~zbjVAg@EmB`GWHlD"
      },
      // Traffic data for the route.
      "travelAdvisory": {
        "speedReadingIntervals": [
          {
            "endPolylinePointIndex": 1,
            "speed": "NORMAL"
          },
          {
            "startPolylinePointIndex": 1,
            "endPolylinePointIndex": 2,
            "speed": "SLOW"
          },
          {
            "startPolylinePointIndex": 2,
            "endPolylinePointIndex": 4,
            "speed": "NORMAL"
          }
        ] 
      }
    }
  ]
}

RouteTravelAdvisory এবং RouteLegTravelAdvisory, দুটিতেই speedReadingIntervals নামের একটি অ্যারে ফিল্ড আছে যেখানে ট্রাফিক স্পিড সংক্রান্ত তথ্য থাকে। অ্যারের প্রতিটি অবজেক্টকে SpeedReadingInterval (REST) বা SpeedReadingInterval (gRPC) অবজেক্টের মাধ্যমে দেখানো হয়।

SpeedReadingInterval অবজেক্টে রুট ইন্টারভ্যালের জন্য স্পিড রিডিং অন্তর্ভুক্ত থাকে, যেমন NORMAL, SLOW বা TRAFFIC_JAM। অবজেক্টের সম্পূর্ণ অ্যারে ওভারল্যাপ না করেই রুটের সম্পূর্ণ পলিলাইন কভার করে। নির্দিষ্ট ইন্টারভ্যালের শুরুর পয়েন্টটি আগের ইন্টারভ্যালের শেষ পয়েন্টের সমান।

প্রতিটি ইন্টারভ্যাল তার startPolylinePointIndex, endPolylinePointIndex এবং সংশ্লিষ্ট স্পিড ক্যাটেগরি দ্বারা বর্ণনা করা হয়। মনে রাখবেন যে, ইন্টারভ্যালের মধ্যে স্টার্ট ইন্ডেক্স না থাকলে তা proto3 প্র্যাক্টিস অনুযায়ী ইন্ডেক্স ০-এর সাথে মিলে যায়।

startPolylinePointIndex ও endPolylinePointIndex ভ্যালু সবসময় পরপর থাকে না। যেমন:

{
  "startPolylinePointIndex": 2,
  "endPolylinePointIndex": 4,
  "speed": "NORMAL"
}

এই ক্ষেত্রে, ইনডেক্স ২ থেকে ইনডেক্স ৪ পর্যন্ত ট্রাফিকের অবস্থা একই ছিল।

Maps SDK-এর মাধ্যমে ট্রাফিক-সচেতন পলিলাইন রেন্ডার করা

আমরা সাজেস্ট করি যে, কাস্টম কালারিং, স্ট্রোক এবং পলিলাইন স্ট্রেচ বরাবর প্যাটার্ন সহ Google Maps SDK-এর দেওয়া বিভিন্ন ফিচার ব্যবহার করে ম্যাপে ট্রাফিক সচেতন পলিলাইন দেখানো হোক। পলিলাইন ব্যবহার করা সম্পর্কে আরও বিবরণ পেতে, Android-এর জন্য পলিলাইন ফিচার এবং iOS-এর জন্য পলিলাইন ফিচার দেখুন।

পলিলাইন রেন্ডারিংয়ের উদাহরণ

Maps SDK ব্যবহারকারীদের কাছে স্পিড ক্যাটেগরি ও পলিলাইন রেন্ডারিং স্কিমার মধ্যে কাস্টমাইজ করা ম্যাপিং লজিক নির্ধারণ করার সুযোগ থাকে। যেমন, কেউ ম্যাপে "স্বাভাবিক" স্পিডকে মোটা নীল লাইন হিসেবে দেখানোর সিদ্ধান্ত নিতে পারেন, আবার "ধীর" স্পিডকে মোটা কমলা লাইন হিসেবে দেখানো হতে পারে।

নিম্নলিখিত স্নিপেটগুলি মেলবোর্ন থেকে পার্থে জিওডেসিক সেগমেন্ট সহ একটি মোটা নীল পলিলাইন যোগ করে। আরও তথ্যের জন্য, আউটলুক কাস্টমাইজ করা (Android-এর জন্য) এবং পলাইন কাস্টমাইজ করা (iOS-এর জন্য) দেখুন।

Android

Java

Polyline line = map.addPolyline(new PolylineOptions()
    .add(new LatLng(-37.81319, 144.96298), new LatLng(-31.95285, 115.85734))
    .width(25)
    .color(Color.BLUE)
    .geodesic(true));

Kotlin

val line: Polyline = map.addPolyline(
  PolylineOptions()
    .add(LatLng(-37.81319, 144.96298), LatLng(-31.95285, 115.85734))
    .width(25f)
    .color(Color.BLUE)
    .geodesic(true)
)

iOS

Objective-C

GMSMutablePath *path = [GMSMutablePath path];
[path addLatitude:-37.81319 longitude:144.96298];
[path addLatitude:-31.95285 longitude:115.85734];
GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
polyline.strokeWidth = 10.f;
polyline.strokeColor = .blue;
polyline.geodesic = YES;
polyline.map = mapView;

Swift

let path = GMSMutablePath()
path.addLatitude(-37.81319, longitude: 144.96298)
path.addLatitude(-31.95285, longitude: 115.85734)
let polyline = GMSPolyline(path: path)
polyline.strokeWidth = 10.0
polyline.geodesic = true
polyline.map = mapView

'রুট বরাবর সার্চ করুন' ফিচারের সাথে এনকোড করা পলিলাইন ব্যবহার করা

গণনা করা রুট বরাবর সার্চ করতে, Places API (নতুন)-এ টেক্সট সার্চ (নতুন) ব্যবহার করুন। আপনি Routes API Compute Routes থেকে আগে গণনা করা রুটের এনকোড করা পলিলাইনকে টেক্সট সার্চ (নতুন) অনুরোধে পাস করেন। উত্তরে সেইসব জায়গা দেখানো হয় যেগুলি সার্চের মাপকাঠি পূরণ করে এবং নির্দিষ্ট রুটের কাছাকাছি অবস্থিত। আরও বিবরণের জন্য, কোনও রুট ধরে সার্চ করা দেখুন।

যেমন, যাত্রা শুরুর স্থান ও গন্তব্যের মধ্যে রুটে ক্যাফে খুঁজতে:

Node.js

const API_KEY = 'YOUR_API_KEY';
const routes_service = 'https://routes.googleapis.com/directions/v2:computeRoutes';
const textSearch_service = 'https://places.googleapis.com/v1/places:searchText';

function init(){ const routes_request = { "origin":{ "address": "1600 Amphitheatre Parkway, Mountain View, CA" }, "destination":{ "address": "24 Willie Mays Plaza, San Francisco, CA 94107" }, "travelMode": "DRIVE" }; const textSearch_request = { "textQuery": "cafe", "searchAlongRouteParameters": { "polyline": { "encodedPolyline": "" } } }; fetchResources(routes_service,routes_request).then(routes => { textSearch_request.searchAlongRouteParameters.polyline.encodedPolyline = routes.routes[0].polyline.encodedPolyline; fetchResources(textSearch_service,textSearch_request).then(places => { console.log(places); }); }); } async function fetchResources(resource,reqBody){ const response = await fetch(resource, { method: 'POST', body: JSON.stringify(reqBody), headers: { 'Content-Type': 'application/json', 'X-Goog-Api-Key': API_KEY, 'X-Goog-FieldMask': '*' } }); const responseJSON = await response.json(); return responseJSON; } init();