Places API সহ রুট বরাবর অনুসন্ধান করুন

এই নথিতে একটি পরিকল্পিত রুট বরাবর একটি হোটেল, একটি রেস্তোরাঁ বা একটি গ্যাস স্টেশন খুঁজে বের করার বর্ণনা রয়েছে৷ একটি রুট পলিলাইন পেতে কিভাবে Routes API ব্যবহার করতে হয় এবং Places API সার্চ অ্যালং রুট (SAR) অনুরোধের সাথে সেটি ব্যবহার করতে আপনি শিখবেন। এছাড়াও আপনি রুট বরাবর অনুসন্ধানের উত্স সেট করে সেরা ফলাফল পেতে শিখবেন, উদাহরণস্বরূপ ট্রিপে 2 ঘন্টা।

রুট API

রুট বরাবর স্থান অনুসন্ধান করার জন্য, আমরা Routes API ব্যবহার করতে যাচ্ছি। Routes API প্রতিক্রিয়া থেকে রুট ডেটা হল উৎপত্তি থেকে গন্তব্য পর্যন্ত LatLong স্থানাঙ্কের একটি সিরিজ। রুট ডেটাতে পা এবং পদক্ষেপ রয়েছে যা রাস্তার নেটওয়ার্ক অনুসরণ করে।

রুটগুলিকে একটি এনকোডেড পলিলাইন হিসাবেও ফেরত দেওয়া হয়, যা আপনি এসএআর অনুরোধে একটি ইনপুট প্যারামিটার হিসাবে পাস করেন৷ পলিলাইন এনকোডিং হল একটি ক্ষতিকর কম্প্রেশন অ্যালগরিদম যা আপনাকে একক স্ট্রিং হিসাবে একাধিক স্থানাঙ্ক সংরক্ষণ করতে দেয়। রুট API থেকে পলিলাইন পাওয়া বাধ্যতামূলক নয়। আপনি নিজেই ডেটা তৈরি করতে পারেন তবে এই উদাহরণের উদ্দেশ্যে, রুট এপিআই প্রয়োজনীয় ডেটা পাওয়ার একটি দ্রুত এবং নিশ্চিত উপায়।

এই টিউটোরিয়ালে আমরা লন্ডন (-37.8167,144.9619) থেকে ম্যানচেস্টার (-37.8155, 144.9663) পর্যন্ত একটি রুট ব্যবহার করি।

Route from London to Manchester

উদাহরণে রুট: লন্ডন থেকে ম্যানচেস্টার

ধাপ 1: রুট API থেকে একটি রুট পান

Routes API থেকে একটি রুট পেতে, আপনাকে নিম্নলিখিত তথ্য প্রদান করতে হবে:

  • উত্স এবং গন্তব্য অবস্থান
  • পরিবহন পদ্ধতি (ড্রাইভিং, হাঁটা, ইত্যাদি)
  • যেকোন ওয়েপয়েন্ট (ঐচ্ছিক)
  • যেকোনো পছন্দ (টোল এড়িয়ে চলুন, হাইওয়ে এড়িয়ে চলুন ইত্যাদি)
  • ট্র্যাফিক সচেতন রাউটিং অগ্রাধিকার আপনাকে সবচেয়ে সুনির্দিষ্ট অনুমান দেবে তবে এটি গণনাগতভাবে ভারী অপারেশন এবং এইভাবে প্রতিক্রিয়ার লেটেন্সি যোগ করে।
{"origin":{
    "location": {
        "latLng":{
            "latitude":  -37.8167,
            "longitude": 144.9619
        }
    }
},
"destination":{
    "location": {
        "latLng":{
            "latitude":-37.8155,
            "longitude": 144.9663
        }
    }
},
"routingPreference":"TRAFFIC_AWARE",
"travelMode":"DRIVE"
}

কল করার সময় হেডার ফিল্ড মাস্কে "এনকোডেড পলিলাইন" ক্ষেত্রটি অন্তর্ভুক্ত করা নিশ্চিত করুন৷

headers = {
    "Content-Type": "application/json",
    "X-Goog-FieldMask": "routes.distanceMeters,routes.duration,routes.legs,routes.polyline.encodedPolyline"
}

কিভাবে একটি রুট পেতে এবং রুট পলিলাইন পেতে উদাহরণ সহ সম্পূর্ণ ডকুমেন্টেশন।

একবার আপনি অনুরোধে এই তথ্য প্রদান করলে, রুট এপিআই একটি রুট অবজেক্ট ফিরিয়ে দেবে। রুট অবজেক্টে নিম্নলিখিত তথ্য থাকবে:

  • রুটের মোট দূরত্ব
  • রুটের মোট সময়কাল
  • পথের পা ও ধাপ
  • রুট, পা এবং পদক্ষেপের এনকোড করা পলিলাইন।
{
  "routes": [
    {
      "legs": [
        {
          "distanceMeters": 321799,
          "duration": "15401s",
          "staticDuration": "14518s",
          "polyline": {
            "encodedPolyline": "y_kyH`_XOr@q@xKGnBBZ|AlGPj@Y^k@^MEqAfAQLK?eI … <rest of content removed for readability>"
          },
          "startLocation": {
            "latLng": {
              "latitude": 51.507334500000006,
              "longitude": -0.1280107
            }
          },
          "endLocation": {
            "latLng": {
              "latitude": 53.4808513,
              "longitude": -2.2425864
            }
          },
          "steps": [
            {
              "distanceMeters": 320,
              "staticDuration": "82s",
              "polyline": {
                "encodedPolyline": "y_kyH`_XOr@q@xKGnBBZ|AlG"
              },
              "startLocation": {
                "latLng": {
                  "latitude": 51.507334500000006,
                  "longitude": -0.1280107
                }
              },
              "endLocation": {
                "latLng": {
                  "latitude": 51.507207,
                  "longitude": -0.1323681
                }
              },
              "navigationInstruction": {
                "maneuver": "DEPART",
                "instructions": "Head northwest on Trafalgar Sq/A4 toward Spring Gardens\nContinue to follow A4\nLeaving toll zone\nEntering toll zone\nLeaving toll zone in 210m at Haymarket"
              },
              "localizedValues": {
                "distance": {
                  "text": "0.3 km"
                },
                "staticDuration": {
                  "text": "1 min"
                }
              },
# rest of the response removed for readability

ধাপ 2: রুট অনুরোধ বরাবর অনুসন্ধান করুন

Places API পাঠ্য অনুসন্ধানে একটি অনুসন্ধান বরাবর রুটের অনুরোধ রয়েছে যা আপনাকে একটি রুট বরাবর স্থানগুলি অনুসন্ধান করতে দেয়৷ রুটের অনুরোধে অনুসন্ধান করতে, আপনাকে নিম্নলিখিত ন্যূনতম তথ্য প্রদান করতে হবে:

  • প্রতিক্রিয়ায় কোন ক্ষেত্রগুলির ফিল্ড মাস্ক ফেরত দেওয়া হয়
  • Google ক্লাউড কনসোলে সক্ষম API-এর জন্য একটি বৈধ API কী
  • আপনি কোন জায়গাগুলি খুঁজছেন তা উল্লেখ করে টেক্সট স্ট্রিং অনুসন্ধান করুন, উদাহরণস্বরূপ "মশলাদার নিরামিষ রেস্টুরেন্ট"
  • রুটের এনকোড করা পলিলাইন, পূর্ববর্তী রুট API কল থেকে পুনরুদ্ধার করা হয়েছে
  • স্থান পাঠ্য অনুসন্ধান API শেষবিন্দুর জন্য Url
import requests

url = 'https://places.googleapis.com/v1/places:searchText'
api_key = 'YOUR_API_KEY'  # Replace with your actual API key
route_polyline = 'YOUR_ROUTE_POLYLINE'  # Replace with your encoded route polyline

headers = {
    'Content-Type': 'application/json',
    'X-Goog-Api-Key': api_key,
    'X-Goog-FieldMask': 'places.displayName,places.formattedAddress,places.priceLevel'
}

data = {
    "textQuery":
 "Spicy Vegetarian Food",
    "searchAlongRouteParameters": {
        "polyline": {
            "encodedPolyline": route_polyline
        }
    }
}

response = requests.post(url, headers=headers, json=data)

উদাহরণ অনুরোধ তথ্য

সার্চ অ্যালং রুটের অনুরোধ রুটের পাশে অবস্থিত জায়গাগুলির একটি তালিকা ফিরিয়ে দেবে। এখানে উদাহরণ ডেটার একটি সংক্ষিপ্ত অংশ। প্রতিক্রিয়ার দৈর্ঘ্য সর্বাধিক সংখ্যক ফলাফলের প্যারামিটার সেট করে সীমিত করা যেতে পারে এবং অবশ্যই আরও ক্ষেত্র যোগ করলে প্রাপ্ত ডেটার পরিমাণ বৃদ্ধি পায়। স্থান API প্রতিক্রিয়া সম্পর্কে আরও বিশদ বিবরণের জন্য ডকুমেন্টেশন দেখুন।

{
  "places": [
    {
      "formattedAddress": "33 Haymarket, London SW1Y 4HA, UK",
      "displayName": {
        "text": "xxx",
        "languageCode": "en"
      }
    },
    {
      "formattedAddress": "224 Piccadilly, London W1J 9HP, UK",
      "priceLevel": "PRICE_LEVEL_MODERATE",
      "displayName": {
        "text": "yyy",
        "languageCode": "en"
      }
    },
    {
      "formattedAddress": "63 Neal St, London WC2H 9PJ, UK",
      "displayName": {
        "text": "zzz",
        "languageCode": "en"
      }
    },

উদাহরণ প্রতিক্রিয়া তথ্য

রাউটিং সারাংশ এবং চক্কর বার

শুধুমাত্র অবস্থানগুলি খুঁজে পাওয়া দুর্দান্ত তবে এই অবস্থানগুলিতে যেতে কতটা সময় লাগে তার তথ্য যুক্ত করা কার্যকর হবে৷ SAR in Places API টেক্সট অনুসন্ধান একটি রাউটিং সারাংশ ক্ষেত্রও ফেরত দিতে পারে যাতে ভ্রমণের সময়কাল এবং দূরত্ব উভয়ই থাকে। রাউটিং সারাংশ ডাটা ফিল্ড হল রেসপন্স রুটের একটি শিশু, তাই আপনি অবশ্যই ফিল্ড মাস্কে " স্থানগুলি " অন্তর্ভুক্ত করবেন না।

'X-Goog-FieldMask': 'places.displayName,places.formattedAddress,places.priceLevel,routingSummaries'

সারাংশ পেতে, আপনাকে অবশ্যই অনুসন্ধানের জন্য মূল অবস্থানের প্যারামিটার প্রদান করতে হবে যা গণনার জন্য ব্যবহৃত হয়।

"routingParameters": {
      "origin": {
        "latitude":  -37.8167,
        "longitude": 144.9619
      }
    }

আপনি যখন প্রতিক্রিয়া পাবেন তখন এটিতে রাউটিং সারাংশ সহ একটি নতুন বিভাগ রয়েছে যেখানে পা রয়েছে যার সময়কাল এবং মিটারে দূরত্ব রয়েছে।

"routingSummaries": [
    {
      "legs": [
        {
          "duration": "662s",
          "distanceMeters": 3093
        }
      ]
    },

এরপরে আমরা অনুসন্ধান শুরু করতে রুট বরাবর কোথায় আপনি সংজ্ঞায়িত করতে পারেন তা দেখুন।

ধাপ 3: রুট বরাবর 2 ঘন্টা অবস্থান পান

একটি সাধারণ ব্যবহারের ক্ষেত্রে বিবেচনা করুন যেখানে ড্রাইভার রুটের শুরুতে নয়, বরং রাস্তার আরও নিচে রেস্টুরেন্ট খুঁজতে চায়। আমাদের উদাহরণে লন্ডন থেকে ম্যানচেস্টার পর্যন্ত যাত্রা প্রায় 4 ঘন্টা। ড্রাইভার 2 ঘন্টা পথ ধরে একটি রেস্টুরেন্ট খুঁজতে চায়। এই অনুরোধটি আমাদের সময়কাল 120 ​​মিনিট * 60 সেকেন্ড = 7200 সেকেন্ড পায়।

Routes API প্রতিক্রিয়াতে আমাদের কাছে রুটের প্রতিটি পায়ের সময়কাল এবং একটি পায়ের প্রতিটি ধাপ রয়েছে। আপনার অনুরোধে ফিল্ড মাস্কে " পা " ক্ষেত্রটি অন্তর্ভুক্ত করা নিশ্চিত করুন৷ জমে থাকা সময়কাল 2 ঘন্টা বা 7200 সেকেন্ডের সীমাতে না পৌঁছানো পর্যন্ত পা এবং পদক্ষেপের মধ্য দিয়ে লুপ করুন। তারপরে আমরা পা এবং ধাপ খুঁজে পেয়েছি যা SAR অনুরোধের উত্স হিসাবে সেট করতে হবে

আপনার কাজের গতি বাড়ানোর জন্য, আপনি Python-এর জন্য পলিলাইন লাইব্রেরি ব্যবহার করে দেখতে চাইতে পারেন। আপনি " polyline.endodedPolyline" ডেটা ক্ষেত্র থেকে স্থানাঙ্ক পেতে এটি ব্যবহার করতে পারেন।

আপনার পরিবেশ টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান।

> pip install polyline
import requests
import polyline

# We've covered getting a Routes API response earlier,
data = response.json()

  # Extract the first route and its encoded polyline
  route = data["routes"][0]
  polyline_points = polyline.decode(route["polyline"]["encodedPolyline"])

  # Calculate total duration of the route in seconds
  total_duration_seconds = route["duration"]

  # Calculate the desired time offset in seconds, 2h = 120 minutes * 60
  desired_time_offset_seconds = time_offset_minutes * 60

  # Iterate through the legs and steps to find the point at the desired time offset
  elapsed_time_seconds = 0
  for leg in route["legs"]:
      for step in leg["steps"]:
          step_duration_seconds = step["staticDuration"]

          # Check if the desired time offset falls within this step, remove last "s" from string and convert to int
          second_value = int(step_duration_seconds[:-1])
          if elapsed_time_seconds + second_value >= desired_time_offset_seconds:
              # Interpolate to find the exact point within the step
              fraction_of_step = (desired_time_offset_seconds - elapsed_time_seconds) / second_value
              step_polyline_points = polyline.decode(step["polyline"]["encodedPolyline"])
              index = int(len(step_polyline_points) * fraction_of_step)
              return step_polyline_points[index]

          elapsed_time_seconds += second_value

  # If the point is not found (e.g., time offset exceeds route duration)
  return None

এখন যেহেতু আমরা রুটে অবস্থান খুঁজে পেয়েছি যা ট্রিপে 2 ঘন্টা, আমরা অনুরোধে এটি ব্যবহার করতে পারি। "অরিজিন" প্যারামিটারে কেবল অক্ষাংশ এবং দ্রাঘিমাংশ যোগ করুন, যা "রাউটিং প্যারামিটার" প্যারামিটারের অংশ। "রাউটিং সারাংশ" ডেটা ক্ষেত্র যা আমরা আগে কভার করেছি তা সুপারিশ করা হয়। আপনি চাইলে অতিরিক্ত প্যারামিটার যেমন ভ্রমণ মোড এবং টোল এড়াতে নির্দেশাবলী যোগ করতে পারেন।


"routingParameters": {
    "origin": {
      "latitude": xx.xxxx,
      "longitude": yy.yyyy
    },
    "travelMode":"DRIVE",
    "routeModifiers": {
      "avoidTolls": true
    }
  }

Route with search results

উদাহরণের ফলাফল (অনুসন্ধানের উৎস দেখানোর জন্য গাড়ির আইকন যোগ করা হয়েছে)।

আপনি ছবিতে দেখতে পাচ্ছেন, API সেই জায়গাগুলিকে ফেরত দেয় যা রুটের শেষ পর্যন্ত পক্ষপাতদুষ্ট, ফলাফলগুলি মধ্য ট্রিপ থেকে শুরু করে। অনুসন্ধানটি এখনও একই Google মানচিত্র প্ল্যাটফর্ম ডেটা দ্বারা ক্ষমতাপ্রাপ্ত হয় যা অন্যান্য কারণগুলির মধ্যে স্থানের প্রাসঙ্গিকতা এবং দূরত্বকে বিবেচনা করে।

উপসংহার

এই টিউটোরিয়ালে আমরা শিখেছি কিভাবে দুটি Google Maps প্ল্যাটফর্ম এপিআই, রুট এবং স্থানগুলিকে একত্রিত করতে হয়, ভ্রমণের পরিকল্পনা করতে এবং যাত্রার 2 ঘন্টা পরে খাওয়ার জায়গাগুলি খুঁজে বের করতে হয়। প্রতিটি ধাপের জন্য অক্ষাংশ এবং দ্রাঘিমাংশের স্থানাঙ্ক সমন্বিত একটি এনকোড করা পলিলাইন এবং সর্বোত্তম ফলাফল পেতে সার্চ অ্যালং রুট রিকোয়েস্ট সেট করা প্রয়োজন।

এই বৈশিষ্ট্যটি ইতিমধ্যে বিদ্যমান টেক্সট অনুসন্ধান এবং Places API এ উপলব্ধ কাছাকাছি অনুসন্ধানে একটি শক্তিশালী নতুন টুল যোগ করে। যৌক্তিক ফলো আপটি লোকেশন পরিষেবাগুলিকে যুক্ত করবে যাতে আপনি সর্বোত্তম অনুসন্ধানের উত্স সন্ধানের জন্য একটি সূচনা পয়েন্ট হিসাবে ড্রাইভারের অবস্থান ব্যবহার করতে পারেন। এছাড়াও এই বৈশিষ্ট্যটি একটি ইন-কার ভয়েস সহকারীর সাথে পুরোপুরি একসাথে কাজ করবে যার সাথে আপনি আপনার পছন্দের ডাইনিং বিকল্পগুলিকে ভয়েস করবেন।

পরবর্তী অ্যাকশন

প্রস্তাবিত আরও পড়ার:

অবদানকারী

Google এই ডকুমেন্ট রক্ষণাবেক্ষণ করে। নিম্নলিখিত অবদানকারী মূলত এটি লিখেছেন.

প্রধান লেখক: Mikko Toivanen | গুগল ম্যাপ প্ল্যাটফর্ম সলিউশন ইঞ্জিনিয়ার