Żądanie linii łamanych

Deweloperzy z Europejskiego Obszaru Gospodarczego (EOG)

Metoda computeRoutes (REST) i metoda ComputeRoutes (gRPC) zwracają trasę reprezentowaną przez linię łamaną w ramach odpowiedzi. Te interfejsy API zwracają 2 typy linii łamanych:

  • Podstawowa linia łamana (domyślna), która reprezentuje trasę, ale bez informacji o natężeniu ruchu. Żądania, które zwracają podstawową linię łamaną, są rozliczane według stawki Routes Basic. Więcej informacji o płatnościach za interfejs Routes API.

  • Linia łamana uwzględniająca natężenie ruchu, która zawiera informacje o warunkach na drodze na trasie. Warunki na drodze są wyrażane w kategoriach prędkości (NORMAL, SLOW, TRAFFIC_JAM) obowiązujących w danym przedziale linii łamanej. Żądania dotyczące linii łamanych uwzględniających natężenie ruchu są rozliczane według stawki Routes Preferred. Więcej informacji o pł1atnościach za interfejs Routes API. Szczegółowe informacje znajdziesz w artykule Konfigurowanie jakości linii łamanej.

Więcej informacji o liniach łamanych znajdziesz w tych artykułach:

Wysyłanie prośby o podstawową linię łamaną dla trasy, etapu lub kroku

Linia łamana jest reprezentowana przez obiekt Polyline (REST) lub Polyline (gRPC). W odpowiedzi możesz zwrócić linię łamaną na poziomie trasy, etapu i kroku.

Określ, która linia łamana ma zostać zwrócona, za pomocą maski pola odpowiedzi:

  • Na poziomie trasy zwróć linię łamaną w odpowiedzi, dodając routes.polyline do maski pola odpowiedzi.

  • Na poziomie etapu zwróć linię łamaną w odpowiedzi dla każdego etapu trasy, dodając routes.legs.polyline.

  • Na poziomie kroku zwróć linię łamaną w odpowiedzi dla każdego kroku etapu, dodając routes.legs.steps.polyline.

Aby na przykład zwrócić linię łamaną dla całej trasy, dla każdego etapu i dla każdego kroku każdego etapu:

curl -X POST -d '{
  "origin":{
    "address": "1600 Amphitheatre Parkway, Mountain View, CA"
  },
  "destination":{
    "address": "24 Willie Mays Plaza, San Francisco, CA 94107"
  },
  "travelMode": "DRIVE"
}' \
-H 'Content-Type: application/json' \
-H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline,routes.legs.steps.polyline' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

To żądanie zwraca tę odpowiedź, która zawiera linię łamaną dla trasy, dla każdego etapu trasy i dla każdego kroku etapu:

{
  "routes": [
    {
      "legs": [
        {
          "polyline": {
              "encodedPolyline": "ipkcFfich...@Bs@?A?O?SD{A@o@B}@I?qA?_AA_@@_@?"
          }
        },
          "steps": [
              {
                  "polyline": {
                      "encodedPolyline": "kclcF...@sC@YIOKI"
                  }
              },
              {
                  "polyline": {
                      "encodedPolyline": "wblcF~...SZSF_@?"
                  }
              },
              ...
      ],
      "distanceMeters": 56901,
      "duration": "2420s",
      "polyline": {
        "encodedPolyline": "ipkcFfich...@Bs@?A?O?SD{A@o@B}@I?qA?_AA_@@_@?"
      }
    }
  ]
}

Ponieważ to żądanie zawiera tylko miejsce początkowe i docelowe, zwrócona trasa zawiera tylko 1 etap. Dlatego linia łamana dla etapu i dla trasy jest taka sama.

Jeśli do żądania dodasz punkt pośredni, zwrócona trasa będzie zawierać 2 etapy:

curl -X POST -d '{
  "origin":{
    "address": "1600 Amphitheatre Parkway, Mountain View, CA"
  },
  "destination":{
    "address": "24 Willie Mays Plaza, San Francisco, CA 94107"
  },
  "intermediates": [
    { "address": "450 Serra Mall, Stanford, CA 94305, USA"},
  ],
  "travelMode": "DRIVE",
}' \
-H 'Content-Type: application/json' \
-H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

To żądanie zwraca 2 etapy, każdy z unikalną linią łamaną, oraz linię łamaną dla całej trasy:

{
  "routes": [
    {
      "legs": [
        {
          "polyline": {
            "encodedPolyline": "kclcFfqchV?A...?I@G?GAECCCEKICBAFG"
          }
          "steps": [
            {
                "polyline": {
                    "encodedPolyline": "kclcFfqch...YIOKI"
                }
            },
        ...
        },
        {
          "polyline": {
            "encodedPolyline": "ojmcFtethV?K...QOYQOGA?_@MUG[Ga@G"
          }
          "steps": [
            {
                "polyline": {
                    "encodedPolyline": "uypeFbo`jVgJq...PoBiC"
                }
            },
        ...
        }
      ],
      "distanceMeters": 68403,
      "duration": "3759s",
      "polyline": {
          "encodedPolyline": "kclcFfqchV?A?CBKF[Ha...?GAECCCEKICBAFGJEBE"
      }
    }
  ]
}

Jakość linii łamanej

Jakość linii łamanej można opisać w tych kategoriach:

  • Reprezentacja zmiennoprzecinkowa punktów

    Punkty są określane jako wartości szerokości i długości geograficznej, które są reprezentowane w formacie reprezentacji zmiennoprzecinkowej pojedynczej precyzji. Sprawdza się to w przypadku małych wartości (które można dokładnie reprezentować), ale precyzja maleje wraz ze wzrostem wartości ze względu na błędy zaokrąglania zmiennoprzecinkowego.

    W computeRoutes (REST) i ComputeRoutes, jest to kontrolowane przez polylineEncoding.

  • Liczba punktów tworzących linię łamaną

    Im więcej punktów, tym gładsza linia łamana (zwłaszcza na krzywych).

    W metodzie computeRoutes (REST) i ComputeRoutes, jest to kontrolowane przez polylineQuality.

Konfigurowanie typu kodowania linii łamanej

Aby kontrolować typ linii łamanej, użyj opcji żądania polylineEncoding. Właściwość polylineEncoding określa, czy linia łamana będzie kodowana jako ENCODED_POLYLINE (domyślnie), co oznacza, że będzie używany format algorytmu zakodowanej linii łamanej, czy GEO_JSON_LINESTRING, co oznacza, że będzie używany format GeoJSON LineString.

Na przykład w treści żądania:

curl -X POST -d '{
  "origin":{
    "address": "1600 Amphitheatre Parkway, Mountain View, CA"
  },
  "destination":{
    "address": "24 Willie Mays Plaza, San Francisco, CA 94107"
  },
  "travelMode": "DRIVE",
  "polylineEncoding": "ENCODED_POLYLINE"
}' \
-H 'Content-Type: application/json' \
-H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

Konfigurowanie jakości linii łamanej

polylineQuality określa jakość linii łamanej jako HIGH_QUALITY lub OVERVIEW (domyślnie). W przypadku OVERVIEW linia łamana jest tworzona przy użyciu niewielkiej liczby punktów i ma mniejszy czas oczekiwania na żądanie niż HIGH_QUALITY.

Na przykład w treści żądania:

{
  "origin":{
    "location":{
      "latLng":{
        "latitude": 37.419734,
        "longitude": -122.0827784
      }
    }
  },
  "destination":{
    "location":{
      "latLng":{
        "latitude": 37.417670,
        "longitude": -122.079595
      }
    }
  },
  "travelMode": "DRIVE",
  "routingPreference": "TRAFFIC_AWARE",
  "polylineQuality": "HIGH_QUALITY",
  "polylineEncoding": "ENCODED_POLYLINE",
  "departureTime": "2023-10-15T15:01:23.045123456Z",
  ...
}

Wysyłanie prośby o linię łamaną uwzględniającą natężenie ruchu

Wszystkie przykłady pokazane powyżej zwracają podstawowe linie łamane, czyli linie łamane bez informacji o natężeniu ruchu. Możesz też poprosić, aby linia łamana zawierała informacje o natężeniu ruchu na trasie i na każdym etapie trasy.

Linie łamane uwzględniające natężenie ruchu zawierają informacje o warunkach na drodze na trasie. Warunki na drodze są wyrażane w kategoriach prędkości (NORMAL, SLOW, TRAFFIC_JAM) dla danego przedziału linii łamanej w odpowiedzi. Przedziały są definiowane przez indeksy punktów początkowych (włącznie) i końcowych (wyłącznie) linii łamanej.

Na przykład ta odpowiedź pokazuje NORMAL natężenie ruchu między punktami 2 a 4 linii łamanej:

{
  "startPolylinePointIndex": 2,
  "endPolylinePointIndex": 4,
  "speed": "NORMAL"
}

Aby wysłać żądanie obliczenia linii łamanej uwzględniającej natężenie ruchu, ustaw te właściwości w żądaniu:

  • Aby włączyć obliczanie natężenia ruchu, ustaw pole tablicy extraComputations na TRAFFIC_ON_POLYLINE.

  • Ustaw travelMode na DRIVE lub TWO_WHEELER. Żądania dotyczące innych trybów podróży zwracają błąd.

  • W żądaniu określ preferencję routingu TRAFFIC_AWARE lub TRAFFIC_AWARE_OPTIMAL. Więcej informacji znajdziesz w artykule Konfigurowanie jakości a czasu oczekiwania.

  • Ustaw maskę pola odpowiedzi, która określa, że mają zostać zwrócone te właściwości odpowiedzi:

    • Na poziomie trasy zwróć wszystkie informacje o podróży w odpowiedzi, dodając routes.travelAdvisory do maski pola odpowiedzi. Aby zwrócić tylko informacje o natężeniu ruchu, określ routes.travelAdvisory.speedReadingIntervals.

    • Na poziomie etapu zwróć wszystkie informacje o podróży w odpowiedzi dla każdego etapu trasy, dodając routes.legs.travelAdvisory. Aby zwrócić tylko informacje o natężeniu ruchu, określ routes.legs.travelAdvisory.speedReadingIntervals.

curl -X POST -d '{
  "origin":{
    "address": "1600 Amphitheatre Parkway, Mountain View, CA"
  },
  "destination":{
    "address": "24 Willie Mays Plaza, San Francisco, CA 94107"
  },
  "travelMode": "DRIVE",
  "extraComputations": ["TRAFFIC_ON_POLYLINE"],
  "routingPreference": "TRAFFIC_AWARE_OPTIMAL"
}' \
-H 'Content-Type: application/json' \
-H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: routes.duration,routes.distanceMeters,routes.polyline,routes.legs.polyline,routes.travelAdvisory,routes.legs.travelAdvisory' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

Przykładowa odpowiedź dotycząca linii łamanej uwzględniającej natężenie ruchu

W odpowiedzi dane o natężeniu ruchu są kodowane w linii łamanej i znajdują się w polu travelAdvisory typu RouteLegTravelAdvisory obiekt (każdy etap) i RouteTravelAdvisory obiekt (trasa).

Na przykład:

{
  "routes": [
    {
      "legs": {
        "polyline": {
          "encodedPolyline": "}boeF~zbjVAg@EmB`GWHlD"
        },
        // Traffic data for the leg.
        "travelAdvisory": {
          "speedReadingIntervals": [
            {
              "endPolylinePointIndex": 1,
              "speed": "NORMAL"
            },
            {
              "startPolylinePointIndex": 1,
              "endPolylinePointIndex": 2,
              "speed": "SLOW"
            },
            {
              "startPolylinePointIndex": 2,
              "endPolylinePointIndex": 4,
              "speed": "NORMAL"
            }
          ] 
        }
      },
      "polyline": {
        "encodedPolyline": "}boeF~zbjVAg@EmB`GWHlD"
      },
      // Traffic data for the route.
      "travelAdvisory": {
        "speedReadingIntervals": [
          {
            "endPolylinePointIndex": 1,
            "speed": "NORMAL"
          },
          {
            "startPolylinePointIndex": 1,
            "endPolylinePointIndex": 2,
            "speed": "SLOW"
          },
          {
            "startPolylinePointIndex": 2,
            "endPolylinePointIndex": 4,
            "speed": "NORMAL"
          }
        ] 
      }
    }
  ]
}

Zarówno RouteTravelAdvisory, jak i RouteLegTravelAdvisory zawierają pole tablicy o nazwie speedReadingIntervals, które zawiera informacje o prędkości ruchu. Każdy obiekt w tablicy jest reprezentowany przez SpeedReadingInterval (REST) lub SpeedReadingInterval (gRPC).

Obiekt SpeedReadingInterval zawiera odczyt prędkości dla przedziału trasy, np. NORMAL, SLOW lub TRAFFIC_JAM. Cała tablica obiektów obejmuje całą linię łamaną trasy bez nakładania się. Punkt początkowy określonego przedziału jest taki sam jak punkt końcowy poprzedniego przedziału.

Każdy przedział jest opisany przez startPolylinePointIndex, endPolylinePointIndex i odpowiednią kategorię prędkości. Zwróć uwagę, że brak indeksu początkowego w przedziale odpowiada indeksowi 0 zgodnie z praktykami proto3.

Wartości startPolylinePointIndex i endPolylinePointIndex nie zawsze są kolejne. Na przykład:

{
  "startPolylinePointIndex": 2,
  "endPolylinePointIndex": 4,
  "speed": "NORMAL"
}

W tym przypadku warunki na drodze były takie same od indeksu 2 do indeksu 4.

Renderowanie linii łamanych uwzględniających natężenie ruchu za pomocą pakietu Maps SDK

Zalecamy wyświetlanie na mapie linii łamanych uwzględniających natężenie ruchu za pomocą różnych funkcji oferowanych przez pakiety SDK Map Google, w tym niestandardowych kolorów, obrysów i wzorów wzdłuż odcinków linii łamanej. Więcej informacji o korzystaniu z linii łamanych, zobacz Funkcje linii łamanych na Androida i Funkcje linii łamanych na iOS.

Przykładowe renderowanie linii łamanej

Użytkownicy pakietu Maps SDK mogą zdefiniować niestandardową logikę mapowania między kategoriami prędkości a schematami renderowania linii łamanej. Na przykład można zdecydować, że prędkość „NORMAL” będzie wyświetlana na mapie jako gruba niebieska linia, a prędkość „SLOW” jako gruba pomarańczowa linia.

Te fragmenty kodu dodają grubą niebieską linię łamaną z segmentami geodezyjnymi z Melbourne do Perth. Więcej informacji znajdziesz w sekcjach Dostosowywanie wyglądu (na Androida) i Dostosowywanie linii łamanej (na iOS).

Android

Java

Polyline line = map.addPolyline(new PolylineOptions()
    .add(new LatLng(-37.81319, 144.96298), new LatLng(-31.95285, 115.85734))
    .width(25)
    .color(Color.BLUE)
    .geodesic(true));

Kotlin

val line: Polyline = map.addPolyline(
  PolylineOptions()
    .add(LatLng(-37.81319, 144.96298), LatLng(-31.95285, 115.85734))
    .width(25f)
    .color(Color.BLUE)
    .geodesic(true)
)

iOS

Objective-C

GMSMutablePath *path = [GMSMutablePath path];
[path addLatitude:-37.81319 longitude:144.96298];
[path addLatitude:-31.95285 longitude:115.85734];
GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
polyline.strokeWidth = 10.f;
polyline.strokeColor = .blue;
polyline.geodesic = YES;
polyline.map = mapView;

Swift

let path = GMSMutablePath()
path.addLatitude(-37.81319, longitude: 144.96298)
path.addLatitude(-31.95285, longitude: 115.85734)
let polyline = GMSPolyline(path: path)
polyline.strokeWidth = 10.0
polyline.geodesic = true
polyline.map = mapView

Korzystanie z zakodowanych linii łamanych w wyszukiwaniu wzdłuż trasy

Aby wyszukiwać wzdłuż obliczonej trasy, użyj wyszukiwania tekstowego w interfejsie Places API. Do żądania wyszukiwania tekstowego przekaż zakodowaną linię łamaną wstępnie obliczonej trasy z interfejsu Routes API. Odpowiedź zawiera miejsca, które pasują do kryteriów wyszukiwania i znajdują się w pobliżu określonej trasy. Więcej informacji znajdziesz w artykule Wyszukiwanie wzdłuż trasy.

Aby na przykład zwrócić kawiarnie na trasie między miejscem początkowym a docelowym:

Node.js

const API_KEY = 'YOUR_API_KEY';
const routes_service = 'https://routes.googleapis.com/directions/v2:computeRoutes';
const textSearch_service = 'https://places.googleapis.com/v1/places:searchText';

function init(){ const routes_request = { "origin":{ "address": "1600 Amphitheatre Parkway, Mountain View, CA" }, "destination":{ "address": "24 Willie Mays Plaza, San Francisco, CA 94107" }, "travelMode": "DRIVE" }; const textSearch_request = { "textQuery": "cafe", "searchAlongRouteParameters": { "polyline": { "encodedPolyline": "" } } }; fetchResources(routes_service,routes_request).then(routes => { textSearch_request.searchAlongRouteParameters.polyline.encodedPolyline = routes.routes[0].polyline.encodedPolyline; fetchResources(textSearch_service,textSearch_request).then(places => { console.log(places); }); }); } async function fetchResources(resource,reqBody){ const response = await fetch(resource, { method: 'POST', body: JSON.stringify(reqBody), headers: { 'Content-Type': 'application/json', 'X-Goog-Api-Key': API_KEY, 'X-Goog-FieldMask': '*' } }); const responseJSON = await response.json(); return responseJSON; } init();