Places API ile Rota Boyunca Arama

Bu dokümanda, planlanmış bir rota üzerinde otel, restoran veya benzin istasyonu bulma hakkında bilgi verilmektedir. Rota poli çizgisi almak için Routes API'yi nasıl kullanacağınızı ve bunu Places API Rota Üzerinde Arama (SAR) isteğiyle nasıl kullanacağınızı öğreneceksiniz. Ayrıca, arama başlangıç noktasını rota üzerinde (ör. yolculuğun 2. saatinde) 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. Routes API yanıtındaki rota verileri, başlangıçtan hedefe kadar bir dizi LatLong koordinatıdır. Rota verileri, yol ağını takip eden bölümleri ve adımları içerir.

Rotalar, SAR isteğine giriş parametresi olarak ilettiğiniz kodlanmış bir çok çizgi olarak da döndürülür. Poli çizgi kodlaması, bir dizi koordinatı tek bir dize olarak depolamanı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, Routes API gerekli verileri elde etmenin hızlı ve güvenli bir yoludur.

Bu eğitimde, 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'dan Manchester'a

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

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

  • Kalkış ve varış konumları
  • Ulaşım şekli (araba, yürüyüş vb.)
  • Tüm yol işaretleri (isteğe bağlı)
  • Tercihler (ücretli geçişleri kullanmama, otoyolları kullanmama vb.)
  • Trafik bilinçli yönlendirme tercihi, size 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"
}

Çağrıyı yaparken headers alan maskesine "encodedPolyline" alanını 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 poli çizgileri alma ile ilgili örneklerin yer aldığı dokümanların tamamı.

İstekte bu bilgileri sağladıktan sonra 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 bölümleri ve adımları
  • Rotanın, bacaklarının ve adımlarını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, rota üzerindeki yerleri aramanıza olanak tanıyan bir rota boyunca arama isteği vardır. Rota boyunca arama isteği göndermek için aşağıdaki minimum bilgileri sağlamanız gerekir:

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

Örnek istek verileri

Rota Boyunca Ara isteği, rota üzerinde bulunan yerlerin listesini döndürür. Örnek verilerin kısa bir bölümünü aşağıda bulabilirsiniz. Sonuç parametrelerinin maksimum sayısını ayarlayarak yanıtın uzunluğu sınırlanabilir. Elbette daha fazla alan eklemek, alınan veri miktarını artırır. Places API yanıtı hakkında daha fazla bilgi için dokümanlara 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

Yönlendirme özeti ve yan yol süreleri

Yalnızca konumları bulmak harika olsa da bu konumlara gitmenin ne kadar sürdüğüyle ilgili bilgileri eklemek faydalı olacaktır. Places API metin aramasında SAR, hem seyahat süresini hem de mesafeyi içeren bir yönlendirme özetlerini alanı da döndürebilir. Yönlendirme özetleri veri alanı, yanıt kökünün alt öğesidir. Bu nedenle, alan maskesine "places." ön ekini eklemeniz gerekmez.

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

Özetleri almak için aramanın kaynak konumu parametresini de sağlamanız gerekir. Bu parametre, hesaplamalar için kullanılır.

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

Yanıtı aldığınızda, süresi ve mesafesi metre cinsinden olan adımların yer aldığı rota özetini içeren yeni bir bölüm görürsünüz.

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

Ardından, aramayı rotanın neresinde başlatacağınızı nasıl tanımlayabileceğinize göz atacağız.

3. adım: Rotanın 2 saat ilerisindeki konumu alın

Sürücünün, rotanın başlangıcında değil de daha ileride restoran bulmak istediği normal bir kullanım alanını düşünün. Örneğimizde, Londra'dan Manchester'a yolculuk yaklaşık 4 saat sürmektedir. Sürücü, rotanın 2 saatlik bir yerinde bir restoran bulmak istiyor. Bu istek, 120 dakika * 60 saniye = 7.200 saniyelik bir süre döndürür.

Routes API yanıtında, rotanın her bir adımını ve her bir adımın süresini görebilirsiniz. İsteğinizdeki alan maskesine "legs" alanını eklediğinizden emin olun. Toplam süre 2 saat veya 7.200 saniyeye ulaşana kadar parçaları ve adımları tekrarlayın. Ardından, SAR isteği için kaynak olarak ayarlanacak ayağı ve adımı bulduk

Çalışmanızı hızlandırmak için Python için poli çizgi kitaplığını deneyebilirsiniz. "polyline.endodedPolyline" veri alanından koordinatları almak için bu işlevi 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

Yolculuk için 2 saatlik mesafedeki konumu bulduk. Bu konumu isteğimizde kullanabiliriz. Enlem ve boylamı, "routingParameters" parametresinin bir parçası olan "origin" parametresine eklemeniz yeterlidir. Daha önce bahsettiğimiz "routingSummaries" veri alanı önerilir. İsterseniz seyahat modu ve otoyol ücretlerinden 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 eklenmiştir).

Resimde de görebileceğiniz gibi API, rotanın sonuna doğru eğilimli yerler döndürür ve sonuçlar yaklaşık olarak seyahatin ortasından başlar. Arama, diğer faktörlerin yanı sıra yer alaka düzeyini ve mesafeyi dikkate alan aynı Google Haritalar Platformu verilerinden yararlanmaya devam eder.

Sonuç

Bu eğitimde, bir gezi planlamak ve yolculuğun 2. saatinden sonra yemek yiyebileceğiniz yerleri bulmak için Rotalar ve Yerler adlı iki Google Haritalar Platformu API'sini nasıl birleştireceğinizi öğrendik. Atılması gereken adımlar, yolun her adımı için enlem ve boylam koordinatlarını içeren kodlanmış bir çoklu çizgi elde etmek ve en iyi sonuçları elde etmek için rota boyunca arama isteği kaynağını ayarlamaktır.

Bu özellik, Places API'de mevcut olan metin arama ve yakın arama özelliklerine güçlü bir yeni araç ekler. Bu işlemin ardından, en uygun arama kaynağını bulmak için sürücü konumunu başlangıç noktası olarak kullanabilmeniz amacıyla konum hizmetlerini eklemeniz gerekir. Ayrıca bu özellik, tercih ettiğiniz yemek seçeneklerini sesli olarak söyleyebileceğiniz araç içi sesli asistanla mükemmel bir şekilde çalışır.

Sonraki İşlemler

Önerilen Daha Fazla Okuma:

Katkıda bulunanlar

Bu belge Google tarafından yönetilir. Bu makaleyi ilk olarak aşağıdaki katkıda bulunan kişi yazmıştır.

Baş yazar: Mikko Toivanen | Google Haritalar Platformu Çözümleri Mühendisi