Как построить маршрут на общественном транспорте

Разработчики из Европейской экономической зоны (ЕЭЗ)

Маршрут на общественном транспорте содержит инструкции по навигации с использованием общественного транспорта, доступного в регионе. Варианты общественного транспорта могут включать автобусы, метро, поезда и т. д. Маршрут для общественного транспорта также обычно включает инструкции о том, как дойти до станции, от нее и между ними. Поскольку маршрут общественного транспорта обычно включает несколько видов транспорта, запрос маршрута и некоторые части ответа отличаются.

Чем маршруты общественного транспорта отличаются от других маршрутов

Маршруты общественного транспорта, которые вы запрашиваете, задав для travelMode значение TRANSIT, отличаются от маршрутов, использующих другие варианты travelMode. Нельзя запросить все те же объекты и параметры, и в ответе будут возвращены другие поля по сравнению с другими маршрутами.

В Routes API шаги всегда представляют собой одну инструкцию по навигации для всех видов транспорта. Каждая инструкция по навигации – это шаг. Ответ с маршрутом на общественном транспорте очень похож на ответ с маршрутом для других способов передвижения, но есть несколько ключевых отличий:

Запросить различия Различия в ответах
Нельзя указать промежуточные путевые точки. Включает информацию об общественном транспорте.
Не удается построить экологичный маршрут Включает метаданные для каждого вида транспорта, содержащие краткое описание этапов (поле `stepsOverview`). Чтобы запросить эти метаданные, используйте маску поля `routes.legs.stepsOverview`.
Нельзя указать, как и нужно ли включать данные о трафике.
Нельзя указать, каких особенностей маршрута следует избегать
Для routingPreference можно указать только значение transitPreferences. Подробную информацию можно найти в статье TransitPreferences.

Подробнее об ответах Routes API…

Как проложить маршрут на общественном транспорте

  1. Укажите пункты отправления и назначения.

  2. Установите режим передвижения на общественном транспорте:

    travelMode: "TRANSIT"

  3. Добавьте маску поля, чтобы получить нужные поля ответа. Подробнее о том, как запросить нужные поля маршрута общественного транспорта…

  4. При необходимости задайте дополнительные параметры. Подробнее о том, как задавать параметры маршрута общественного транспорта…

Запросите нужные поля маршрута общественного транспорта

Запрашивайте нужные поля маршрута общественного транспорта с помощью масок полей. В таблице ниже приведены некоторые рекомендуемые ответы для маршрута общественного транспорта и маска поля, которую следует использовать для запроса.

Как запросить информацию Используйте эту маску поля
Все сведения о маршруте routes.*
Все сведения об общественном транспорте routes.legs.steps.transitDetails
Пункт отправления для каждого этапа routes.legs.steps.startLocation
Конечная точка каждого участка маршрута routes.legs.steps.endLocation
Ломаная линия маршрута для каждого шага routes.legs.steps.polyline
Тип транспорта, используемого на каждом этапе. routes.legs.steps.travelMode
Расчетная стоимость каждого этапа и всего маршрута, а также локализованная расчетная стоимость routes.travel_advisory.transitFare localized routes.localizedValues.transitFare

Примечание. Значение transitFare предоставляется только в том случае, если API может определить стоимость проезда на общественном транспорте для всех этапов.

Локализованный текст для продолжительности и расстояния routes.localizedValues

Подробнее о том, как выбрать возвращаемые поля…

Как задать параметры маршрута на общественном транспорте

Ниже перечислены параметры, относящиеся к маршрутам общественного транспорта.

Как это сделать Используйте этот параметр Примечания
Как выбрать вид транспорта travelMode: "TRANSIT" Обязательно. Подробнее…
Как задать время отправления или прибытия "arrivalTime": "yyyy-mm-ddThh:mm:ssZ"

ИЛИ

"departureTime": "yyyy-mm-ddThh:mm:ssZ"
Необязательное поле. Можно указать либо arrival_time, либо departure_time. Если не указано ни одно из значений, для departure_time по умолчанию используется текущее время выполнения (now). Время прибытия и отправления можно задать только в пределах следующего временного окна, используя текущее время выполнения (now) в качестве ориентира:
  • не позднее чем за 7 дней до now
  • до 100 дней после now включительно
Время указывается в виде временной метки в формате RFC3339 UTC "Zulu". Подробнее…

Примечание. Расписания общественного транспорта часто меняются, поэтому доступные маршруты могут меняться со временем. Мы не можем гарантировать точные прогнозы на длительный срок.

Включить альтернативные маршруты "computeAlternativeRoutes": true Необязательное поле. Установите значение true, чтобы Compute Routes вычислял до 3 дополнительных маршрутов, если они доступны. Подробнее…
Как задать параметры маршрутов на общественном транспорте "transitPreferences": { allowedTravelModes: ["BUS","SUBWAY","TRAIN","LIGHT_RAIL","RAIL"]}

Примечание. Если вы укажете предпочтительный способ передвижения, в возвращенных маршрутах все равно могут использоваться другие виды транспорта (или даже только другие виды транспорта) в зависимости от эффективности маршрута и доступности предпочтительного способа передвижения.

Необязательное поле. Укажите предпочитаемые виды транспорта. Подробнее…
Как задать параметры маршрута на общественном транспорте "transitPreferences": {routingPreference: "LESS_WALKING|FEWER_TRANSFERS"} Необязательное поле. Укажите параметры маршрутов на общественном транспорте. Подробнее…

Пример: как построить маршрут на общественном транспорте

В примере ниже показано, как получить маршрут на общественном транспорте с помощью следующих параметров:

  • Указывает, что предпочтительны поездки на поезде и меньше ходьбы.

  • Запрашивает альтернативные маршруты.

  • Содержит маску поля, которая возвращает информацию о маршруте общественного транспорта:

curl -X POST -H 'content-type: application/json' -d '{
  "origin": {
    "address": "Humberto Delgado Airport, Portugal"
  },
  "destination": {
    "address": "Basílica of Estrela, Praça da Estrela, 1200-667 Lisboa, Portugal"
  },
  "travelMode": "TRANSIT",
  "computeAlternativeRoutes": true,
  "transitPreferences": {
     routingPreference: "LESS_WALKING",
     allowedTravelModes: ["TRAIN"]
  },
}' \
-H 'Content-Type: application/json' \
-H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: routes.legs.steps.transitDetails' \
'https://routes.googleapis.com/directions/v2:computeRoutes'

В ответе показаны поля route.legs.steps.transitDetails для двух маршрутов:

{
  "routes": [
    {
    "legs": [
        {
        "steps": [
          {},
          {},
          {},
          {
          "transitDetails": {
            "stopDetails": {
            "arrivalStop": {
              "name": "Saldanha",
              "location": {
                "latLng": {
                  "latitude": 38.73532,
                  "longitude": -9.14543
                }
              }
            },
            "arrivalTime": "2023-08-26T10:49:42Z",
            "departureStop": {
              "name": "Aeroporto",
              "location": {
                "latLng": {
                  "latitude": 38.769047799999996,
                  "longitude": -9.1284593
                }
              }
            },
            "departureTime": "2023-08-26T10:32:10Z"
              },
              "localizedValues": {
              "arrivalTime": {
                  "time": {
                    "text": "11:49"
                  },
                  "timeZone": "Europe/Lisbon"
              },
              "departureTime": {
                "time": {
                  "text": "11:32"
                },
                "timeZone": "Europe/Lisbon"
              }
            },
              "headsign": "São Sebastião",
              "transitLine": {
                "agencies": [
                  {
                    "name": "Metropolitano de Lisboa, E.P.E.",
                    "phoneNumber": "+351 21 350 0115",
                    "uri": "https://www.metrolisboa.pt/"
                  }
                ],
                "name": "Vermelha",
                "color": "#f23061",
                "nameShort": "Vm",
                "textColor": "#000000",
                "vehicle": {
                  "name": {
                    "text": "Metrô"
                  },
                "type": "SUBWAY",
                "iconUri": "//maps.gstatic.com/mapfiles/transit/iw2/6/subway2.png"
                }
              },
              "stopCount": 11
            }
          },
        {},
        {
          "transitDetails": {
            "stopDetails": {
              "arrivalStop": {
                "name": "Rato",
                "location": {
                  "latLng": {
                    "latitude": 38.7201022,
                    "longitude": -9.1540562
                  }
              }
            },
            "arrivalTime": "2023-08-26T11:01:37Z",
            "departureStop": {
              "name": "Saldanha",
                "location": {
                  "latLng": {
                    "latitude": 38.73527,
                    "longitude": -9.1455200000000012
                  }
                }
              },
              "departureTime": "2023-08-26T10:57:57Z"
            },
            "localizedValues": {
              "arrivalTime": {
                "time": {
                  "text": "12:01"
                },
                "timeZone": "Europe/Lisbon"
              },
              "departureTime": {
                "time": {
                  "text": "11:57"
                },
                "timeZone": "Europe/Lisbon"
              }
            },
            "headsign": "Rato",
            "transitLine": {
              "agencies": [
                {
                "name": "Metropolitano de Lisboa, E.P.E.",
                "phoneNumber": "+351 21 350 0115",
                "uri": "https://www.metrolisboa.pt/"
                }
              ],
              "name": "Amarela",
              "color": "#f2c200",
              "nameShort": "Am",
              "textColor": "#000000",
              "vehicle": {
                "name": {
                  "text": "Metrô"
                },
                "type": "SUBWAY",
                "iconUri": "//maps.gstatic.com/mapfiles/transit/iw2/6/subway2.png"
              }
            },
            "stopCount": 4
          }
        },
        {},
        {},
        {},
        {},
        {},
        {}
        ]
      }
    ]
  }
]
}