Places API ile Rota Boyunca Arama

Bu belgede, planlanan bir rota üzerinde otel, restoran veya benzin istasyonunun nasıl bulunacağı açıklanmaktadır. Routes API'yi kullanarak rota poliline nasıl ulaşacağınızı ve bunu Places API Rota Üzerinde Arama (SAR) isteğiyle nasıl kullanacağınızı öğreneceksiniz. Ayrıca, arama başlangıcını rota üzerinde, örneğin yolculuğun 2. saatinde olacak şekilde ayarlayarak en iyi sonuçları nasıl alacağınızı da öğreneceksiniz.

Routes API

Rota üzerindeki yerleri aramak için Routes API'yi kullanacağız. Rotalar API yanıtındaki rota verileri, başlangıç noktasından varış noktasına kadar olan bir dizi enlem/boylam koordinatıdır. Rota verileri, yol ağını takip eden ayakları ve adımları içerir.

Rotalar, SAR isteğine giriş parametresi olarak ilettiğiniz kodlanmış çoklu çizgi olarak da döndürülür. Çoklu çizgi kodlama, bir dizi koordinatı tek bir dize olarak saklamanıza olanak tanıyan kayıplı bir sıkıştırma algoritmasıdır. Routes API'den çoklu çizgi almak zorunlu değildir. Verileri kendiniz oluşturabilirsiniz ancak bu örnekte, gerekli verileri almanın hızlı ve güvenli bir yolu olarak Routes API kullanılmaktadır.

Bu eğiticide Londra (-37.8167,144.9619) ile Manchester (-37.8155, 144.9663) arasındaki bir rotayı kullanıyoruz.

Londra'dan Manchester'a rota

Örnekteki rota: Londra-Manchester

1. adım: Routes API'den rota alın

Routes API'den rota almak için aşağıdaki bilgileri sağlamanız gerekir:

  • Başlangıç ve varış noktaları
  • Ulaşım şekli (araba, yaya vb.)
  • Tüm ara noktalar (isteğe bağlı)
  • Tercihler (ücretli geçişleri kullanma, otoyolları kullanma vb.)
  • Trafiğe duyarlı yönlendirme tercihi, en doğru tahminleri sunar ancak hesaplama açısından daha ağır bir işlemdir ve bu nedenle yanıtın gecikmesini artırır.
{"origin":{
    "location": {
        "latLng":{
            "latitude":  -37.8167,
            "longitude": 144.9619
        }
    }
},
"destination":{
    "location": {
        "latLng":{
            "latitude":-37.8155,
            "longitude": 144.9663
        }
    }
},
"routingPreference":"TRAFFIC_AWARE",
"travelMode":"DRIVE"
}

Aramayı yaparken "encodedPolyline" alanını üstbilgi alan maskesine eklediğinizden emin olun.

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

Rota alma ve rota poliline alma ile ilgili örneklerin yer aldığı eksiksiz doküman.

İstekte bu bilgileri sağladığınızda, Routes API bir rota nesnesi döndürür. Rota nesnesi aşağıdaki bilgileri içerir:

  • Rotanın toplam mesafesi
  • Rotanın toplam süresi
  • Rotanın ayakları ve adımları
  • Rotanın, ayakların ve adımların kodlanmış çoklu çizgisi.
{
  "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. adım: Rota boyunca arama isteği

Places API Metin Arama'da, bir rota üzerindeki yerleri aramanıza olanak tanıyan Rota Üzerinde Arama isteği bulunur. Rota boyunca arama isteği göndermek için en azından aşağıdaki bilgileri sağlamanız gerekir:

  • Yanıt içinde hangi alanların döndürüldüğünün alan maskesi
  • Google Cloud Console'da etkinleştirilen API için geçerli bir API anahtarı
  • Aradığınız yerleri belirten arama metni dizesi (ör. "baharatlı vejetaryen restoran")
  • Önceki Routes API çağrısından alınan rotanın kodlanmış çoklu çizgi
  • Places Metin Arama API uç noktasının URL'si
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)

Örnek istek verileri

Rota Boyunca Arama isteği, rota üzerinde bulunan yerlerin listesini döndürür. Örnek verilerin kısa bir bölümünü aşağıda bulabilirsiniz. Yanıtın uzunluğu, maksimum sonuç sayısı parametreleri ayarlanarak sınırlandırılabilir. Elbette daha fazla alan eklemek, alınan veri miktarını artırır. Places API yanıtı hakkında daha fazla bilgi için belgelere bakın.

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

Örnek yanıt verileri

Rota özeti ve alternatif rota süreleri

Sadece konumları bulmak harika ancak bu konumlara gitmenin ne kadar sürdüğünü de eklemek faydalı olacaktır. Places API Text Search'teki SAR, seyahat süresini ve mesafesini içeren bir routing summaries alanı da döndürebilir. Yönlendirme özetleri veri alanı, yanıt kökünün alt öğesidir. Bu nedenle, alan maskesine "places." önekini eklememelisiniz.

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

Özetleri almak için hesaplamalarda kullanılan arama için kaynak konum parametresini de sağlamanız gerekir.

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

Yanıtı aldığınızda, rota özeti içeren yeni bir bölüm eklenir. Bu bölümde, süre ve mesafeyi metre cinsinden gösteren ayaklar yer alır.

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

Ardından, rotanın hangi noktasında aramaya başlayacağınızı nasıl tanımlayabileceğinize göz atıyoruz.

3. adım: Rota üzerinde 2 saatlik mesafedeki konumu alın

Sürücünün rotanın başında değil, daha ilerideki restoranları bulmak istediği normal bir kullanım alanını ele alalım. Örneğimizde Londra'dan Manchester'a yolculuk yaklaşık 4 saat sürüyor. Sürücü, rota üzerinde 2 saatlik mesafede bir restoran bulmak istiyor. Bu istek, 120 dakika * 60 saniye = 7.200 saniye süreyi elde etmemizi sağlar.

Routes API yanıtında, rotanın her ayağının ve bir ayağın her adımının süresi yer alır. İsteğinizdeki alan maskesine "legs" alanını eklediğinizden emin olun. Birikmiş süre 2 saat veya 7.200 saniye sınırına ulaşana kadar adımları ve aşamaları tekrarlayın. Daha sonra, SAR isteğinin kaynağı olarak ayarlanacak bacağı ve adımı buluruz.

Çalışmanızı hızlandırmak için Python için çoklu çizgi kitaplığını deneyebilirsiniz. Bu işlevi, "polyline.endodedPolyline" veri alanındaki koordinatları almak için kullanabilirsiniz.

Ortam terminalinizde aşağıdaki komutları çalıştırın.

> 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

Şimdi, rotada yolculuğun 2. saatinde olan konumu bulduğumuza göre bunu istekte kullanabiliriz. Enlemi ve boylamı "origin" parametresine eklemeniz yeterlidir. Bu parametre de "routingParameters" parametresinin bir parçasıdır. Daha önce ele aldığımız "routingSummaries" veri alanı önerilir. İsterseniz seyahat modu ve ücretli yollardan kaçınma talimatları gibi ek parametreler de ekleyebilirsiniz.


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

Arama sonuçlarıyla rota

Örnek sonuçlar (arama kaynağını göstermek için araba simgesi eklendi).

Resimde de görebileceğiniz gibi API, rotanın sonuna doğru olan yerleri döndürüyor. Sonuçlar, yolculuğun ortasından itibaren başlıyor. Arama, yerin alaka düzeyini ve mesafeyi de hesaba katan aynı Google Haritalar Platformu verileriyle desteklenmeye devam eder.

Sonuç

Bu eğiticide, bir gezi planlamak ve yolculuğun 2. saatinden sonra yemek yenecek yerler bulmak için iki Google Haritalar Platformu API'sini (Rotalar ve Yerler) nasıl birleştireceğimizi öğrendik. Gerekli adımlar, yolun her adımına ait enlem ve boylam koordinatlarını içeren kodlanmış bir çoklu çizgi elde etmek ve en iyi sonuçları almak için Rota Boyunca Arama isteği başlangıcını ayarlamaktır.

Bu özellik, Places API'de bulunan mevcut metin arama ve yakındaki yerleri arama özelliklerine güçlü bir yeni araç ekler. Mantıksal takip, sürücü konumunu en uygun arama başlangıcını bulmak için başlangıç noktası olarak kullanabilmeniz amacıyla konum hizmetlerini eklemek olacaktır. Ayrıca bu özellik, tercih ettiğiniz yemek seçeneklerini sesli olarak iletebileceğiniz araç içi sesli asistanla mükemmel şekilde birlikte çalışır.

Sonraki İşlemler

Önerilen Ek Okumalar:

Katkıda bulunanlar

Bu belge Google tarafından yönetilir. Bu makale ilk olarak aşağıdaki katkıda bulunan tarafından yazılmıştır.

Başlıca yazar: Mikko Toivanen | Google Haritalar Platformu Çözüm Mühendisi