เอกสารนี้จะอธิบายวิธีค้นหาโรงแรม ร้านอาหาร หรือปั๊มน้ำมันตามเส้นทางที่วางแผนไว้ คุณจะได้เรียนรู้วิธีใช้ Routes API เพื่อรับ Polyline ของเส้นทางและใช้กับคําขอ Places API Search Along Route (SAR) นอกจากนี้ คุณยังจะได้ดูวิธีรับผลลัพธ์ที่ดีที่สุดด้วยการตั้งค่าจุดเริ่มต้นการค้นหาตามเส้นทาง เช่น 2 ชั่วโมงในการเดินทาง
Routes API
เราจะใช้ Routes API เพื่อค้นหาสถานที่ต่างๆ บนเส้นทาง ข้อมูลเส้นทางจากการตอบกลับของ Routes API คือชุดพิกัด LatLong จากต้นทางไปยังปลายทาง ข้อมูลเส้นทางประกอบด้วยช่วงและขั้นตอนที่ไปตามเครือข่ายถนน
ระบบจะแสดงเส้นทางเป็นPolyline ที่เข้ารหัสด้วย ซึ่งคุณส่งต่อเป็นพารามิเตอร์อินพุตไปยังคำขอ SAR การเข้ารหัสรูปหลายเส้นเป็นอัลกอริทึมการบีบอัดแบบสูญเสียข้อมูลที่ให้คุณจัดเก็บชุดพิกัดเป็นสตริงเดียว คุณไม่จำเป็นต้องรับเส้นประกอบจาก Routes API คุณอาจสร้างข้อมูลด้วยตนเอง แต่สำหรับวัตถุประสงค์ของตัวอย่างนี้ Routes API เป็นวิธีที่รวดเร็วและแน่นอนในการรับข้อมูลที่จําเป็น
ในบทแนะนำนี้ เราจะใช้เส้นทางจากลอนดอน (-37.8167,144.9619) ไปยังแมนเชสเตอร์ (-37.8155, 144.9663)
เส้นทางในตัวอย่าง: ลอนดอนไปแมนเชสเตอร์
ขั้นตอนที่ 1: รับเส้นทางจาก Routes 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"
}
เมื่อเรียกใช้ ให้ใส่ฟิลด์ "encodedPolyline" ในมาสก์ฟิลด์ส่วนหัว
headers = {
"Content-Type": "application/json",
"X-Goog-FieldMask": "routes.distanceMeters,routes.duration,routes.legs,routes.polyline.encodedPolyline"
}
เอกสารประกอบฉบับเต็มพร้อมตัวอย่างวิธีรับเส้นทางและรับ Polyline ของเส้นทาง
เมื่อคุณระบุข้อมูลนี้ในคำขอแล้ว Routes API จะแสดงออบเจ็กต์เส้นทาง ออบเจ็กต์เส้นทางจะมีข้อมูลต่อไปนี้
- ระยะทางรวมของเส้นทาง
- ระยะเวลารวมของเส้นทาง
- ช่วงและขั้นตอนของเส้นทาง
- เส้นประกอบที่เข้ารหัสของเส้นทาง ส่วน และขั้นตอน
{
"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 มีคำขอค้นหาตามเส้นทางที่ช่วยให้คุณค้นหาสถานที่ตามเส้นทางได้ หากต้องการส่งคำขอค้นหาตามเส้นทาง คุณจะต้องระบุข้อมูลขั้นต่ำต่อไปนี้
- มาสก์ฟิลด์ของฟิลด์ที่จะแสดงในการตอบกลับ
- คีย์ API ที่ถูกต้องสําหรับ API ที่เปิดใช้ในคอนโซล Google Cloud
- สตริงข้อความค้นหาที่ระบุสถานที่ที่คุณกำลังมองหา เช่น "ร้านอาหารมังสวิรัติรสเผ็ด"
- เส้นประกอบที่เข้ารหัสของเส้นทางที่ดึงมาจากการเรียกใช้ Routes API ก่อนหน้านี้
- URL ของปลายทาง 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)
ตัวอย่างข้อมูลคําขอ
คำขอค้นหาระหว่างเส้นทางจะแสดงรายการสถานที่ที่อยู่ตามเส้นทาง ต่อไปนี้คือตัวอย่างข้อมูลสั้นๆ คุณจำกัดความยาวของคำตอบได้โดยการตั้งค่าจำนวนพารามิเตอร์ผลลัพธ์สูงสุด และแน่นอนว่าการเพิ่มช่องอื่นๆ จะเพิ่มปริมาณข้อมูลที่รับ ดูรายละเอียดเพิ่มเติมเกี่ยวกับการตอบกลับของ Places 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 ใน Places API Text Search ยังแสดงผลช่องสรุปการแนะนำเส้นทางที่มีทั้งระยะเวลาและระยะทางในการเดินทางได้ด้วย ช่องข้อมูลสรุปการกำหนดเส้นทางเป็นช่องข้อมูลย่อยของรูทคำตอบ คุณจึงต้องไม่ใส่ส่วนนำหน้า "places." ในมาสก์ช่อง
'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 ชั่วโมงตลอดเส้นทาง
ลองพิจารณา Use Case ปกติที่ไดรเวอร์ต้องการค้นหาร้านอาหารที่ไม่ได้อยู่ตรงจุดเริ่มต้นของเส้นทาง แต่อยู่ไกลออกไป ในตัวอย่างของเรา การเดินทางจากลอนดอนไปแมนเชสเตอร์ใช้เวลาประมาณ 4 ชั่วโมง คนขับต้องการค้นหาร้านอาหารที่ใช้เวลาเดินทาง 2 ชั่วโมง คําขอนี้ช่วยให้เราทราบระยะเวลา 120 นาที * 60 วินาที = 7200 วินาที
ในการตอบกลับของ Routes API เรามีระยะเวลาของเส้นทางแต่ละช่วงและแต่ละขั้นตอนของเส้นทาง อย่าลืมใส่ช่อง "legs" ในมาสก์ช่องในคำขอ เล่นซ้ำผ่านช่วงพักและขั้นตอนต่างๆ จนกว่าระยะเวลาสะสมจะถึงขีดจำกัด 2 ชั่วโมงหรือ 7200 วินาที จากนั้นเราพบเที่ยวบินและขั้นตอนที่จะกำหนดเป็นแหล่งที่มาของคำขอ SAR
หากต้องการทํางานให้เร็วขึ้น คุณอาจลองใช้ไลบรารี Polyline สําหรับ 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 ชั่วโมงแล้ว เราจึงใช้ตำแหน่งนั้นในคำขอได้ เพียงเพิ่มละติจูดและลองจิจูดในพารามิเตอร์ "origin" ซึ่งเป็นส่วนหนึ่งของพารามิเตอร์ "routingParameters" เราขอแนะนำให้ใช้ช่องข้อมูล "routingSummaries" ที่เราได้พูดถึงก่อนหน้านี้ นอกจากนี้ คุณยังเพิ่มพารามิเตอร์อื่นๆ เช่น โหมดการเดินทางและวิธีการหลีกเลี่ยงค่าผ่านทางได้หากต้องการ
"routingParameters": {
"origin": {
"latitude": xx.xxxx,
"longitude": yy.yyyy
},
"travelMode":"DRIVE",
"routeModifiers": {
"avoidTolls": true
}
}
ตัวอย่างผลลัพธ์ (เพิ่มไอคอนรถยนต์เพื่อแสดงต้นทางการค้นหา)
ดังที่เห็นในรูปภาพ API จะแสดงสถานที่ซึ่งเอนเอียงไปทางจุดสิ้นสุดของเส้นทาง โดยผลการค้นหาจะเริ่มแสดงประมาณครึ่งทาง การค้นหายังคงใช้ข้อมูลแพลตฟอร์ม Google Maps เดียวกัน ซึ่งพิจารณาความเกี่ยวข้องของสถานที่และระยะทาง รวมถึงปัจจัยอื่นๆ
สรุป
ในบทแนะนํานี้ เราได้เรียนรู้วิธีรวม Google Maps Platform API 2 รายการ ได้แก่ Routes และ Places เพื่อวางแผนการเดินทางและค้นหาสถานที่ทานอาหารหลังจากเดินทาง 2 ชั่วโมง ขั้นตอนที่ต้องทำคือรับเส้นประกอบที่เข้ารหัสซึ่งมีพิกัดละติจูดและลองจิจูดสำหรับแต่ละขั้นตอนของเส้นทาง และตั้งค่าต้นทางคำขอ "ค้นหาตามเส้นทาง" เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด
ฟีเจอร์นี้จะเพิ่มเครื่องมือใหม่ที่มีประสิทธิภาพในการค้นหาข้อความและการค้นหาใกล้เคียงที่มีอยู่แล้วใน Places API การดําเนินการต่ออย่างมีเหตุผลคือการเพิ่มบริการตําแหน่งเพื่อให้คุณใช้ตําแหน่งของไดรเวอร์เป็นจุดเริ่มต้นในการค้นหาต้นทางการค้นหาที่ดีที่สุด นอกจากนี้ ฟีเจอร์นี้ยังทำงานร่วมกับผู้ช่วยเสียงในรถได้อย่างลงตัว ซึ่งคุณจะบอกตัวเลือกร้านอาหารที่ต้องการได้
การดำเนินการถัดไป
- ลองทำตามตัวอย่างในเอกสารประกอบ
- แสดงความคิดเห็น
แหล่งข้อมูลอื่นๆ ที่แนะนํา
ผู้เขียน
Google เป็นผู้ดูแลเอกสารนี้ ผู้มีส่วนร่วมต่อไปนี้เป็นผู้เขียนเนื้อหานี้ในตอนแรก
ผู้เขียนหลัก: Mikko Toivanen | Google Maps Platform Solutions Engineer