Żądanie linii łamanych

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

  • Podstawowa linia łamana (domyślna) przedstawia trasę, ale bez osadzonych w nich informacji o natężeniu ruchu. Żądania, które zwracają podstawową linię łamaną, są rozliczane według stawki podstawowej dotyczącej tras. Dowiedz się więcej o płatnościach za interfejs Routes API.

  • Zorientowana na natężenie ruchu linia łamana zawiera informacje o warunkach drogowych na trasie. Warunki ruchu są wyrażone w postaci kategorii prędkości (NORMAL, SLOW, TRAFFIC_JAM) mających zastosowanie w danym przedziale linii łamanej. Żądania dotyczące linii łamanych rozpoznających ruch są rozliczane według stawki Preferowana tras. Dowiedz się więcej o płatnościach za interfejs Routes API. Więcej informacji znajdziesz w artykule o konfigurowaniu jakości linii łamanych

Więcej informacji o liniach łamanych:

Wysyłanie żądania podstawowej linii łamanej dla trasy, etapu lub kroku

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

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

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

  • Na poziomie nogi zwraca linię łamaną w odpowiedzi na każdy etap trasy, uwzględniają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 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 odpowiedź zawierającą linię łamaną trasy, każdy etap trasy i każdy etap trasy:

{
  "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 punkt początkowy i miejsce docelowe, zwrócona trasa zawiera tylko jeden etap. Dlatego linia łamana odcinka jest taka sama dla trasy.

Jeśli dodasz do żądania pośredni punkt pośredni, zwrócona trasa będzie miała 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żdą z niepowtarzalną linią łamaną, i 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ć takimi terminami:

  • Dokładność punktów zmiennoprzecinkowych

    Punkty są określane za pomocą szerokości i długości geograficznej, czyli w formacie liczb zmiennoprzecinkowych o pojedynczej precyzji. Sprawdza się to dobrze w przypadku małych wartości (które można dokładnie przedstawić), ale precyzja maleje, gdy wartości rosną z powodu błędów zaokrąglania liczb zmiennoprzecinkowych.

    W metodach computeRoutes (REST) i ComputeRoutes steruje nimi polylineEncoding.

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

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

    W metodach computeRoutes (REST) i ComputeRoutes steruje nimi polylineQuality.

Skonfiguruj typ kodowania linii łamanej

Aby określić 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 używany będzie format zakodowanego algorytmu łamanego lub GEO_JSON_LINESTRING, co oznacza, że używany będzie format linii GeoJSON.

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'

Skonfiguruj jakość linii Poyline

polylineQuality określa jakość linii łamanej jako HIGH_QUALITY lub OVERVIEW (domyślną). W przypadku OVERVIEW linia łamana składa się z niewielkiej liczby punktów i ma krótszy 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",
  ...
}

Żądanie linii łamanej uwzględniającej ruch

Powyższe przykłady 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 jej każdym jej etapie.

Linie łamane uwzględniające natężenie ruchu zawierają informacje o ruchu drogowym na trasie. Warunki ruchu są wyrażone w postaci kategorii prędkości (NORMAL, SLOW, TRAFFIC_JAM) w danym przedziale linii łamanej odpowiedzi. Przedziały są definiowane przez indeksy ich początkowych (włącznie) i końcowych punktów linii łamanej (wyłącznie).

Na przykład ta odpowiedź pokazuje ruch NORMAL między punktami 2 i 4 linii łamanej:

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

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

  • Ustaw w polu tablicy extraComputations wartość TRAFFIC_ON_POLYLINE, aby włączyć obliczanie ruchu.

  • Ustaw travelMode na DRIVE lub TWO_WHEELER. Żądania dotyczące innych środków transportu zwracają błąd.

  • Określ w żądaniu ustawienie routingu TRAFFIC_AWARE lub TRAFFIC_AWARE_OPTIMAL. Więcej informacji znajdziesz w artykule o konfigurowaniu jakości i czasu oczekiwania.

  • Ustaw maskę pola odpowiedzi, która określa, czy mają być zwracane właściwości odpowiedzi:

    • Na poziomie trasy zwraca w odpowiedzi wszystkie informacje dotyczące podróży, dodając w odpowiedzi routes.travelAdvisory w masce pola odpowiedzi. Aby zwracać tylko informacje o ruchu, wpisz routes.travelAdvisory.speedReadingIntervals

    • Na poziomie etapu zwraca w odpowiedzi na każdy etap trasy wszystkie informacje dotyczące podróży, uwzględniając routes.legs.travelAdvisory. Aby zwracać tylko informacje o ruchu, wpisz 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ź dla linii łamanej rozpoznającej ruch

W odpowiedzi dane o ruchu są zakodowane na linii łamanej i zawarte w polu travelAdvisory typu RouteLegTravelAdvisory (każdy etap) lub w obiekcie RouteTravelAdvisory (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 obiekt SpeedReadingInterval (REST) lub SpeedReadingInterval (gRPC).

Obiekt SpeedReadingInterval uwzględnia odczyt prędkości dla interwał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 czasu jest taki sam jak punkt końcowy poprzedniego interwału.

Każdy interwał jest opisany przez jego startPolylinePointIndex, endPolylinePointIndex oraz odpowiednią kategorię prędkości. Zwróć uwagę, że brak indeksu początkowego w przedziale odpowiada indeksowi 0 zgodnie z protokołami protokołu 3.

Wartości startPolylinePointIndex i endPolylinePointIndex nie zawsze występują po sobie. 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.

Renderuj rozpoznające ruchy łamane za pomocą pakietu Maps SDK

Zalecamy wyświetlanie na mapie linii łamanych związanych z natężeniem ruchu za pomocą różnych funkcji oferowanych w pakietach SDK Map Google, takich jak niestandardowe kolorowanie, kreski i wzory wzdłuż rozciągnięć linii łamanej. Więcej informacji o używaniu linii łamanych znajdziesz w opisach funkcji Polyline na Androida i artykule o funkcjach Polyline na iOS.

Przykład renderowania linii łamanej

Użytkownicy pakietu SDK Map Google mogą zdefiniować niestandardową logikę mapowania między kategoriami prędkości a schematami renderowania linii łamanych. Na przykład można wyświetlić szybkość „NORMAL” jako grubą niebieską linię na mapie, a „WOLNA” – na przykład grubą pomarańczową linię.

Poniższe fragmenty kodu dodają grubą niebieską linię łamaną z segmentami geodezyjnymi z Melbourne do Perth. Więcej informacji znajdziesz w sekcjach Dostosowywanie wyglądu (na Androidzie) i Dostosowywanie Polyline (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