Menelusuri Sepanjang Rute dengan Places API

Dokumen ini menjelaskan cara menemukan hotel, restoran, atau SPBU di sepanjang rute yang direncanakan. Anda akan mempelajari cara menggunakan Routes API untuk mendapatkan polyline rute dan menggunakannya dengan permintaan Places API Search Along Route (SAR). Anda juga akan mempelajari cara mendapatkan hasil terbaik dengan menetapkan origin penelusuran sepanjang rute, misalnya 2 jam perjalanan.

Routes API

Untuk menelusuri tempat di sepanjang rute, kita akan menggunakan Routes API. Data rute dari respons Routes API adalah serangkaian koordinat LatLong dari asal ke tujuan. Data rute berisi segmen dan langkah yang mengikuti jaringan jalan.

Rute juga ditampilkan sebagai polyline yang dienkode, yang Anda teruskan sebagai parameter input ke permintaan SAR. Encoding polyline adalah algoritma kompresi lossy yang memungkinkan Anda menyimpan serangkaian koordinat sebagai satu string. Mendapatkan polyline dari Routes API tidak wajib. Anda dapat membuat data sendiri, tetapi untuk tujuan contoh ini, Routes API adalah cara yang cepat dan pasti untuk mendapatkan data yang diperlukan.

Dalam tutorial ini, kita menggunakan rute dari London (-37.8167,144.9619) ke Manchester (-37.8155, 144.9663)

Rute dari London ke Manchester

Rute dalam contoh: London ke Manchester

Langkah 1: Dapatkan rute dari Routes API

Untuk mendapatkan rute dari Routes API, Anda harus memberikan informasi berikut:

  • Lokasi asal dan tujuan
  • Jenis transportasi (mengemudi, berjalan kaki, dll.)
  • Titik jalan apa pun (opsional)
  • Preferensi apa pun (hindari jalan tol, hindari jalan raya, dll.)
  • Preferensi pemilihan rute yang mempertimbangkan traffic akan memberi Anda estimasi paling presisi, tetapi operasinya lebih berat secara komputasi sehingga menambah latensi respons.
{"origin":{
    "location": {
        "latLng":{
            "latitude":  -37.8167,
            "longitude": 144.9619
        }
    }
},
"destination":{
    "location": {
        "latLng":{
            "latitude":-37.8155,
            "longitude": 144.9663
        }
    }
},
"routingPreference":"TRAFFIC_AWARE",
"travelMode":"DRIVE"
}

Saat melakukan panggilan, pastikan untuk menyertakan kolom "encodedPolyline" dalam mask kolom header.

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

Dokumentasi lengkap dengan contoh cara mendapatkan rute dan mendapatkan polyline rute.

Setelah Anda memberikan informasi ini dalam permintaan, Routes API akan menampilkan objek rute. Objek rute akan berisi informasi berikut:

  • Total jarak rute
  • Total durasi rute
  • Bagian dan langkah-langkah rute
  • Polyline yang dienkode dari rute, segmen, dan langkah.
{
  "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

Langkah 2: Permintaan Penelusuran Sepanjang Rute

Places API Text Search memiliki permintaan Penelusuran Sepanjang Rute yang memungkinkan Anda menelusuri tempat di sepanjang rute. Untuk melakukan permintaan Penelusuran Sepanjang Rute, Anda harus menyediakan informasi minimum berikut:

  • Mask kolom yang kolomnya ditampilkan dalam respons
  • Kunci API yang valid untuk API yang diaktifkan di konsol Google Cloud
  • String teks penelusuran yang menyatakan tempat yang Anda cari, misalnya "restoran vegetarian pedas"
  • Polyline rute yang dienkode, diambil dari panggilan Routes API sebelumnya
  • URL untuk endpoint Places Text Search API
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)

Contoh data permintaan

Permintaan Penelusuran Sepanjang Rute akan menampilkan daftar tempat yang berada di sepanjang rute. Berikut adalah bagian singkat dari contoh data. Panjang respons dapat dibatasi dengan menetapkan jumlah maksimum parameter hasil dan menambahkan lebih banyak kolom tentu saja akan meningkatkan jumlah data yang diterima. Untuk detail selengkapnya tentang respons Places API, lihat dokumentasi.

{
  "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"
      }
    },

Contoh data respons

Ringkasan pemilihan rute dan waktu pengalihan

Menemukan lokasi saja sudah bagus, tetapi akan lebih baik jika Anda menambahkan informasi waktu yang diperlukan untuk pergi ke lokasi tersebut. Penelusuran Teks SAR di Places API juga dapat menampilkan kolom ringkasan rute yang berisi durasi dan jarak yang akan ditempuh. Kolom data ringkasan perutean adalah turunan dari root respons, sehingga Anda tidak boleh menyertakan awalan "places." dalam mask kolom.

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

Untuk mendapatkan ringkasan, Anda juga harus memberikan parameter lokasi origin untuk penelusuran yang digunakan untuk penghitungan.

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

Saat Anda menerima respons, respons tersebut memiliki bagian baru dengan ringkasan pemilihan rute yang berisi segmen yang memiliki durasi dan jarak dalam meter.

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

Selanjutnya, kita akan melihat cara menentukan tempat di sepanjang rute untuk memulai penelusuran.

Langkah 3: Dapatkan lokasi 2 jam di sepanjang rute

Pertimbangkan kasus penggunaan normal saat pengemudi ingin menemukan restoran, bukan di awal rute, tetapi di sepanjang jalan. Dalam contoh kami, perjalanan dari London ke Manchester memerlukan waktu sekitar 4 jam. Pengemudi ingin menemukan restoran 2 jam di sepanjang rute. Permintaan ini memberi kita durasi 120 menit * 60 detik = 7200 detik.

Dalam respons Routes API, kita memiliki durasi setiap segmen rute dan setiap langkah segmen. Pastikan untuk menyertakan kolom "legs" dalam mask kolom dalam permintaan Anda. Lakukan loop pada segmen dan langkah hingga durasi kumulatif mencapai batas 2 jam atau 7.200 detik. Kemudian, kita telah menemukan segmen dan langkah yang akan ditetapkan sebagai asal permintaan SAR

Untuk mempercepat pekerjaan, sebaiknya coba library polyline untuk Python. Anda dapat menggunakannya untuk mendapatkan koordinat dari kolom data "polyline.endodedPolyline".

Jalankan perintah berikut di terminal lingkungan Anda.

> 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

Setelah menemukan lokasi di rute yang berjarak 2 jam dari perjalanan, kita dapat menggunakannya dalam permintaan. Cukup tambahkan lintang dan bujur di parameter "origin", yang pada gilirannya merupakan bagian dari parameter "routingParameters". Kolom data "routingSummaries" yang telah kita bahas sebelumnya direkomendasikan. Anda juga dapat menambahkan parameter tambahan seperti mode perjalanan dan petunjuk untuk menghindari tol jika mau.


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

Rute dengan hasil penelusuran

Contoh hasil (ikon mobil ditambahkan untuk menampilkan asal penelusuran).

Seperti yang dapat Anda lihat pada gambar, API menampilkan tempat yang bias ke akhir rute, dengan hasil yang dimulai sekitar pertengahan perjalanan. Penelusuran masih didukung oleh data Google Maps Platform yang sama yang memperhitungkan relevansi tempat dan jarak di antara faktor lainnya.

Kesimpulan

Dalam tutorial ini, kita telah mempelajari cara menggabungkan dua API Google Maps Platform, Rute dan Tempat, untuk merencanakan perjalanan dan menemukan tempat makan setelah 2 jam perjalanan. Langkah-langkah yang perlu dilakukan adalah mendapatkan polyline yang dienkode yang berisi koordinat lintang dan bujur untuk setiap langkah di sepanjang jalan dan menetapkan asal permintaan Penelusuran Sepanjang Rute untuk mendapatkan hasil terbaik.

Fitur ini menambahkan alat baru yang canggih ke penelusuran teks dan penelusuran terdekat yang sudah ada di Places API. Tindak lanjut yang logis adalah menambahkan layanan lokasi sehingga Anda dapat menggunakan lokasi pengemudi sebagai titik awal untuk menemukan asal penelusuran yang optimal. Selain itu, fitur ini akan berfungsi dengan sempurna bersama dengan asisten suara dalam mobil yang akan Anda gunakan untuk menyampaikan opsi tempat makan pilihan Anda.

Tindakan Berikutnya

Bacaan Lebih Lanjut yang Disarankan:

Kontributor

Google mengelola dokumen ini. Kontributor berikut awalnya menulisnya.

Penulis utama: Mikko Toivanen | Google Maps Platform Solutions Engineer