ค้นหาบนเส้นทางด้วย Places API

เอกสารนี้อธิบายวิธีค้นหาโรงแรม ร้านอาหาร หรือปั๊มน้ำมันตามเส้นทางที่วางแผนไว้ คุณจะได้เรียนรู้วิธีใช้ Routes API เพื่อรับเส้น โพลีไลน์และใช้ร่วมกับคำขอ Places API ค้นหาตามเส้นทาง (SAR) นอกจากนี้ คุณยังจะได้เรียนรู้วิธีรับผลลัพธ์ที่ดีที่สุดโดยการตั้งค่าต้นทางการค้นหาตามเส้นทาง เช่น 2 ชั่วโมงนับจากเริ่มการเดินทาง

Routes API

หากต้องการค้นหาสถานที่ตามเส้นทาง เราจะใช้ Routes API เส้นทาง ข้อมูลจากการตอบกลับของ Routes API คือชุดพิกัด LatLong จาก ต้นทางไปยังปลายทาง ข้อมูลเส้นทางประกอบด้วยช่วงและขั้นตอนที่อยู่ตาม เครือข่ายถนน

นอกจากนี้ เส้นทางยังแสดงผลเป็นโพลีไลน์ ที่เข้ารหัส ซึ่งคุณส่งต่อเป็นพารามิเตอร์อินพุตไปยังคำขอ SAR การเข้ารหัส Polyline เป็น อัลกอริทึมการบีบอัดแบบสูญเสียข้อมูลที่ช่วยให้คุณจัดเก็บชุดพิกัดเป็น สตริงเดียวได้ คุณไม่จำเป็นต้องรับเส้นประกอบจาก 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"
}

เอกสารประกอบฉบับเต็มพร้อมตัวอย่างวิธีรับเส้นทาง และรับโพลีไลน์ของเส้นทาง

เมื่อคุณระบุข้อมูลนี้ในคำขอแล้ว 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 Console
  • สตริงข้อความค้นหาที่ระบุสถานที่ที่คุณกำลังมองหา เช่น "ร้านอาหารมังสวิรัติรสเผ็ด"
  • เส้นประกอบที่เข้ารหัสของเส้นทางที่ดึงข้อมูลจากการเรียก 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 ยังแสดงผลฟิลด์สรุปการกำหนดเส้นทาง ซึ่งมีทั้งระยะเวลาและระยะทางในการเดินทางได้ด้วย ฟิลด์ข้อมูล Routing summaries เป็นฟิลด์ย่อยของรูทการตอบกลับ ดังนั้นคุณจึงต้องไม่รวม คำนำหน้า "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 ชั่วโมงตามเส้นทาง

ลองพิจารณากรณีการใช้งานปกติที่คนขับต้องการหาร้านอาหารที่ไม่ได้อยู่ ที่จุดเริ่มต้นของเส้นทาง แต่อยู่ถัดไปตามเส้นทาง ในตัวอย่างของเรา การเดินทาง จากลอนดอนไปแมนเชสเตอร์ใช้เวลาประมาณ 4 ชั่วโมง คนขับต้องการหาร้านอาหาร ที่อยู่ห่างออกไป 2 ชั่วโมงตามเส้นทาง คำขอนี้จะทำให้เราได้ระยะเวลา 120 นาที * 60 วินาที = 7200 วินาที

ในการตอบกลับของ Routes API เรามีระยะเวลาของแต่ละช่วงของเส้นทางและ แต่ละขั้นตอนของช่วง อย่าลืมใส่ช่อง "ขา" ใน FieldMask ในคำขอ วนซ้ำผ่านขาและขั้นตอนจนกว่าระยะเวลาสะสมจะถึงขีดจำกัด 2 ชั่วโมงหรือ 7,200 วินาที จากนั้นเราจะพบขาและ ขั้นตอนที่จะตั้งเป็นต้นทางของคำขอ 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 Platform เดียวกัน ซึ่งพิจารณาความเกี่ยวข้องของสถานที่และระยะทาง รวมถึงปัจจัยอื่นๆ

สรุป

ในบทแนะนำนี้ เราได้เรียนรู้วิธีรวม Google Maps Platform API 2 รายการ ได้แก่ Routes และ Places เพื่อวางแผนการเดินทางและค้นหาร้านอาหารหลังจากเดินทางไปแล้ว 2 ชั่วโมง ขั้นตอนที่ต้องทำคือรับเส้นประกอบที่เข้ารหัสซึ่งมีพิกัดละติจูดและลองจิจูดสำหรับแต่ละขั้นตอนของเส้นทาง และตั้งค่าต้นทางของคำขอค้นหาตามเส้นทางเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด

ฟีเจอร์นี้จะเพิ่มเครื่องมือใหม่ที่มีประสิทธิภาพให้กับเครื่องมือค้นหาข้อความและการค้นหาใกล้เคียงที่มีอยู่แล้วใน Places API การดำเนินการที่สมเหตุสมผลต่อจากนี้คือการเพิ่ม บริการตำแหน่งเพื่อให้คุณใช้ตำแหน่งของคนขับเป็นจุดเริ่มต้น ในการค้นหาต้นทางการค้นหาที่เหมาะสมที่สุด นอกจากนี้ ฟีเจอร์นี้ยังทำงานร่วมกับผู้ช่วยเสียงในรถได้อย่างสมบูรณ์แบบ ซึ่งคุณสามารถพูดตัวเลือกการรับประทานอาหารที่ต้องการได้

การดำเนินการถัดไป

อ่านเพิ่มเติมที่แนะนำ

ผู้เขียน

Google เป็นผู้ดูแลเอกสารนี้ ผู้มีส่วนร่วมต่อไปนี้เป็นผู้เขียนต้นฉบับ

ผู้เขียนหลัก: Mikko Toivanen | วิศวกรโซลูชัน Google Maps Platform