Определения ГБФС

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

В следующих разделах каждый заголовок имеет следующий формат: Required|Optional|Conditionally required: Feed name (System supported) . Поддерживаются следующие системы:

  • Пристыкованная система
  • Система без док-станции
  • Система с док-станцией и без док-станции

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

Обязательный заголовок для каналов Micromobility

Каналы Micromobility — это каналы, которые содержат структурированные данные Micromobility, как закрепленные, так и не закрепленные, как определено в этой статье.

Во всех каналах всегда должны быть указаны поля, включенные в следующую таблицу на верхнем уровне объекта JSON, которые вместе называются общим заголовком GBFS .

Имя поля Тип Требование Описание
last_updated Метка времени Необходимый Метка времени POSIX, которая указывает количество секунд с 1 января 1970 года 00:00:00 UTC.

Устанавливается на время последнего обновления данных в ленте.

ttl Неотрицательное целое число Необходимый Неотрицательное целое число, представляющее количество секунд, оставшихся до обновления ленты.

Если данные должны обновляться с постоянной скоростью, установите это значение равным 0 .

data JSON Необходимый JSON, содержащий поля данных для отдельного канала.

Например, агрегированный канал free_bike_status.json , который указывает общий заголовок GBFS , может выглядеть следующим образом:

{
    "ttl": 30,
    "last_updated": 1576123774,
    "data": {
        "bikes": [ ... ]  // GBFS free bike status objects.
    }
}

Обязательно: system_information.json (система с пристыкованным и непристыкованным интерфейсом)

При необходимости обратитесь к спецификации GBFS .

В этом канале представлена подробная информация об операторе системы.

Имя поля Тип Требование Описание
system_id ИДЕНТИФИКАТОР Необходимый Глобальный уникальный идентификатор системы совместного использования транспортных средств. Это значение должно оставаться неизменным на протяжении всего срока службы системы. Каждая отдельная система или географический регион, в котором эксплуатируются транспортные средства, ДОЛЖЕН иметь свой собственный идентификатор system_id. Идентификаторы систем ДОЛЖНЫ быть распознаваемыми как принадлежащие конкретной системе, а не случайные строки, например, bcycle_austin или biketown_pdx.
name Нить Необходимый Название системы, которое отображается клиентам.
rental_apps Объект Необходимый Объект JSON, содержащий информацию о приложении аренды для Android и iOS в соответствующих полях.
rental_apps.android Объект Условно требуется Содержит информацию о загрузке и обнаружении приложения для Android в полях store_uri и discovery_uri . Если у поставщика системы есть приложение для Android, предоставляющее услуги аренды, это поле обязательно для заполнения.
rental_apps.android.store_uri URI Необходимый URI, откуда можно загрузить арендуемое Android-приложение. Обычно это URI магазина приложений, например Google Play. Если URI указывает на магазин приложений, например Google Play, мы рекомендуем использовать URI, соответствующий рекомендациям Android, чтобы приложение для просмотра могло напрямую открыть URI приложения из магазина приложений, а не веб-сайта.
rental_apps.android.discovery_uri URI Необходимый URI в формате your_custom_scheme://your/path/here . Этот URI может использоваться методом PackageManager.queryIntentActivities() для определения того, установлено ли на устройстве арендованное Android-приложение.
rental_apps.ios Объект Условно требуется Содержит информацию о загрузке и обнаружении приложения для аренды на платформе iOS в полях store_uri и discovery_uri . Если у поставщика системы есть приложение для аренды iOS, это поле обязательно для заполнения.
rental_apps.ios.store_uri URI Необходимый URI, откуда можно загрузить арендованное приложение iOS. Обычно это URI магазина приложений, например Apple App Store. Если URI указывает на магазин приложений, например Apple App Store, мы рекомендуем использовать URI, соответствующий лучшим практикам iOS, чтобы приложение для просмотра могло напрямую открыть URI приложения из магазина приложений, а не веб-сайта.
rental_apps.ios.discovery_uri URI Необходимый URI в формате your_custom_scheme:// . URI может использоваться UIApplication canOpenURL: для определения того, установлено ли на устройстве приложение iOS, предлагаемое в аренду.

Обязательно: free_bike_status.json (система без док-станции)

При необходимости обратитесь к спецификации GBFS .

В этом фиде указаны местоположения и характеристики доступных отдельно стоящих автомобилей. В целях конфиденциальности автомобили, находящиеся в аренде, не должны отображаться в этом фиде.

Имя поля Тип Требование Описание
bikes Множество Необходимый Массив доступных на данный момент остановленных велосипедов, где каждый велосипед является объектом.
bikes[].bike_id ИДЕНТИФИКАТОР Необходимый Идентификатор велосипеда.

В целях защиты конфиденциальности идентификатор можно менять на случайную строку после каждой поездки.

bikes[].lat Широта Необходимый Широта велосипеда в системе координат WGS 84 в десятичных градусах.
bikes[].lon Долгота Необходимый Долгота велосипеда в системе координат WGS 84 в десятичном формате градусов.
bikes[].is_reserved Булевое значение Необходимый Зарезервирован ли велосипед в настоящее время, можно узнать следующим образом:
  • Если велосипед в данный момент зарезервирован, установите значение true .
  • Если велосипед в данный момент не зарезервирован, установите значение false .
bikes[].is_disabled Булевое значение Необходимый Если велосипед в настоящее время неисправен или сломан, выполните следующие действия:
  • Если велосипед в данный момент отключен, установите значение true .
  • Если велосипед в данный момент не отключен, установите значение false .
bikes[].rental_uris Объект Необходимый Объект JSON, содержащий URI аренды для Android, iOS и веб-сайтов в соответствующих полях.
bikes[].rental_uris.android URI Условно требуется URI, который можно передать приложению Android с намерением android.intent.action.VIEW для поддержки Android Deep Links . В качестве rental_uris должны быть указаны ссылки на приложения Android , чтобы приложению просмотра не приходилось вручную управлять перенаправлением пользователя в магазин приложений, если у пользователя не установлено приложение поставщика.

Этот URI должен представлять собой глубокую ссылку, относящуюся к конкретному велосипеду, а не общую страницу аренды, содержащую информацию о нескольких велосипедах. Глубокая ссылка должна вести пользователя непосредственно к велосипеду без каких-либо подсказок, промежуточных страниц или входа в систему. Убедитесь, что пользователи видят велосипед, даже если они никогда не открывали приложение.

URI не обязательно должны включать bike_id велосипеда, если у партнёра есть другие способы идентифицировать соответствующий велосипед. Например, приложение проката может использовать другие идентификаторы в URI для уникальной идентификации велосипеда.

Если у партнера есть приложение для аренды Android, это поле обязательно для заполнения.

Пример ссылок на приложения Android:

https://www.example.com/app?sid=1234567890&platform=android

bikes[].rental_uris.ios URI Условно требуется URI, который можно использовать в iOS для запуска приложения аренды велосипеда. Подробнее об этом см. в статье Apple о пользовательских URL-схемах iOS . Предоставляемый rental_uris должен быть универсальным URL-адресом iOS , чтобы приложению просмотра не приходилось вручную управлять перенаправлением пользователя в магазин приложений, если у него не установлено приложение поставщика.

Этот URI должен представлять собой глубокую ссылку, относящуюся к конкретному велосипеду, а не общую страницу аренды, содержащую информацию о нескольких велосипедах. Глубокая ссылка должна вести пользователя непосредственно к велосипеду без каких-либо подсказок, промежуточных страниц или входа в систему. Убедитесь, что пользователи видят велосипед, даже если они никогда не открывали приложение.

URI не обязательно должны включать идентификатор bike_id велосипеда, если у партнёра есть другие способы идентифицировать соответствующий велосипед. Например, приложение проката может использовать другие идентификаторы в URI для уникальной идентификации велосипеда.

Если у партнера есть приложение для аренды iOS, это поле обязательно для заполнения.

Пример универсальных ссылок iOS:

https://www.example.com/app?sid=1234567890&platform=ios

bikes[].rental_uris.web URL Необязательный

URL-адрес, который может использоваться веб-браузером для отображения дополнительной информации об аренде транспортного средства в этом транспортном средстве.

Этот URL должен представлять собой глубокую ссылку на конкретный велосипед, а не на общую страницу аренды, содержащую информацию о нескольких велосипедах. Глубокая ссылка должна вести пользователя непосредственно к велосипеду без каких-либо подсказок, промежуточных страниц или входа в систему. Убедитесь, что пользователи видят велосипед, даже если они никогда не открывали приложение.

URL-адреса не обязательно должны включать идентификатор bike_id велосипеда или иным образом соответствовать семантическим соглашениям URL-адресов проката для Android или iOS. Приложение проката может использовать другие идентификаторы в URL-адресе, которые однозначно идентифицируют велосипед.

Если это поле не задано, это означает, что глубокие ссылки не поддерживаются веб-браузером.

Пример значения:

https://www.example.com/app?sid=1234567890

bikes[].vehicle_type_id ИДЕНТИФИКАТОР Необходимый vehicle_type_id транспортного средства, как описано в разделе vehicle_types.json .
bikes[].pricing_plan_id ИДЕНТИФИКАТОР Необходимый Идентификатор ценового плана, который применяется при аренде данного типа транспортного средства, как описано в разделе system_pricing_plans.json .
bikes[].current_range_meters Неотрицательное число с плавающей точкой Условно требуется Если определение vehicle_type , соответствующее транспортному средству, имеет двигатель, то это поле обязательно для заполнения.

Установите максимальное расстояние в метрах, которое транспортное средство может проехать без подзарядки или дозаправки, учитывая текущий уровень заряда или топлива транспортного средства.

bikes[].last_reported Метка времени Необязательный Устанавливается на момент последнего сообщения о состоянии транспортного средства в систему оператора.

Ниже приведен пример free_bike_status.json :

"bikes": [{
    "bike_id": "xyz123",
    "lat": 12.34,
    "lon": 56.78,
    "is_reserved": true,
    "is_disabled": false,
    "rental_uris":{
      "android": "https://www.example.com/app?sid=1234567890&platform=android",
      "ios": "https://www.example.com/app?sid=1234567890&platform=ios",
      "web": "https://www.example.com/app?sid=1234567890"
    },
    "vehicle_type_id": "scooter_electric",
    "pricing_plan_id": "sydneyPlan1",
    "current_range_meters": 4500,
    "last_reported": 1434054678
},
{
    "bike_id": "abc123",
    "lat": 1.34,
    "lon": 146.78,
    "is_reserved": false,
    "is_disabled": true,
    "rental_uris":{
      "android": "https://www.example.com/app?sid=1234567890&platform=android",
      "ios": "https://www.example.com/app?sid=1234567890&platform=ios",
      "web": "https://www.example.com/app?sid=1234567890"
    },
    "vehicle_type_id": "bike_manual",
    "pricing_plan_id": "sydneyPlan1",
    "last_reported": 1434054241
}
]

Обязательно: vehicle_types.json (система с док-станцией и без нее)

При необходимости обратитесь к спецификации GBFS .

Этот канал определяет подробную информацию об отдельных типах транспортных средств, как указано в разделе free_bike_status.json .

Имя поля Тип Требование Описание
vehicle_types Множество Необходимый Массив объектов, каждый из которых определяет отдельный тип транспортного средства в каталоге поставщика. Для каждого типа транспортного средства может быть только один объект.
vehicle_types[].vehicle_type_id ИДЕНТИФИКАТОР Необходимый Уникальный идентификатор для данного типа транспортного средства.
vehicle_types[].form_factor Перечисление Необходимый Перечисление, представляющее общий форм-фактор транспортного средства, из следующего списка допустимых в настоящее время значений:
  • bicycle
  • scooter
  • other
vehicle_types[].propulsion_type Перечисление Необходимый Перечисление, представляющее основной тип двигателя транспортного средства, из следующего списка допустимых в настоящее время значений:
  • human : движение педалями или ногами
  • electric_assist : Обеспечивает питание только совместно с человеческим движением
  • electric : включает в себя режим дроссельной заслонки с питанием от аккумуляторной батареи
  • combustion : включает в себя режим дроссельной заслонки с двигателем, работающим на газовом двигателе
vehicle_types[].max_range_meters Неотрицательное число с плавающей точкой Условно требуется Если propulsion_type не установлен на human , то транспортное средство имеет двигатель, и поэтому это поле является обязательным.

Установите максимальное расстояние в метрах, которое транспортное средство может проехать без необходимости подзарядки или дозаправки, когда оно полностью заправлено или полностью заряжено.

Ниже приведен пример для vehicle_types.json :

"vehicle_types": [
  {
    "vehicle_type_id": "bike_manual",
    "form_factor": "bicycle",
    "propulsion_type": "human"
  },
  {
    "vehicle_type_id": "scooter_electric",
    "form_factor": "scooter",
    "propulsion_type": "electric",
    "max_range_meters": 10000
  }
]

Обязательно: system_pricing_plans.json (система без док-станции)

При необходимости обратитесь к спецификации GBFS .

Этот фид определяет тарифные планы для отдельно стоящих автомобилей. Мы требуем от поставщиков предоставлять информацию о ценах на отдельно стоящие автомобили.

Имя поля Тип Требование Описание
plans Множество Необходимый Массив объектов, где каждый объект определяет заданный ценовой план.
plans[].plan_id ИДЕНТИФИКАТОР Необходимый Строка, представляющая собой уникальный идентификатор для данного ценового плана, предлагаемого провайдером.
plans[].url URL Необязательный URL-адрес, направляющий конечных пользователей к дополнительной информации о ценовом плане.
plans[].currency Нить Необходимый Стандарт ISO 4217 для ценового плана.
plans[].price Неотрицательное число с плавающей точкой Необходимый

Ценовой план должен быть определен либо как нетарифицируемый, либо как тарифицируемый:

Тарифный план без рейтинга

Этот план представляет собой единую фиксированную стоимость.

Установите следующее поле:

  • price : фиксированная цена всей поездки.
Номинальный ценовой план

Этот план представляет собой кусочно-линейную ставку.

Установите следующее поле:

  • price : базовая цена, которая взимается только один раз за поездку.

Задайте одно или оба из следующих полей:

  • per_km_pricing : Цена поездки, указанная за километр.
  • per_min_pricing : Стоимость поездки, указанная поминутно.
plans[].per_km_pricing Множество Условно требуется

Если цена зависит от пройденного расстояния и отображается в километрах, то это поле обязательно для заполнения.

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

Чтобы определить общую стоимость данного плана, добавьте значение plans[].price price данного плана к накопленным ценам за сегменты в plans[].per_km_pricing и plans[].per_min_pricing .

Если это поле не заполнено, то переменные цены в зависимости от расстояния отсутствуют и, следовательно, не включаются в общую цену.

plans[].per_km_pricing[].start Неотрицательное целое число Необходимый Количество километров, с которого начинается тарификация сегмента. В этом поле указывается начальное значение сегмента, включая указанное. Таким образом, по достижении указанного количества километров rate взимается один раз.
plans[].per_km_pricing[].rate Плавать Необходимый Тариф, взимаемый за каждый interval , начиная с start сегмента (включительно). Если в этом поле указано отрицательное число, путешественник получает скидку.
plans[].per_km_pricing[].interval Неотрицательное целое число Необходимый

Интервал в километрах, с которым rate сегмента применяется повторно неограниченное время, если только end сегмента не установлен на любое неотрицательное целое число.

rate применяется повторно один раз в начале каждого interval , округление расстояния не учитывается.

Если end сегмента установлен на любое неотрицательное целое число, rate сегмента повторно применяется до (но не включая) end значения сегмента.

Если это поле равно 0 , rate взимается ровно один раз в start сегмента.

plans[].per_km_pricing[].end Неотрицательное целое число Необязательный

Количество километров, по достижении которого rate за сегмент перестаёт применяться. В этом поле указывается исключительное значение , которым заканчивается сегмент. Например, если end равно 40 , rate перестаёт применяться на расстоянии 40 километров.

Если это поле не задано или пусто, rate за сегмент взимается до окончания поездки, в дополнение к любым дополнительным сегментам, которые следуют за ним.

plans[].per_min_pricing Множество Условно требуется

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

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

Чтобы определить общую стоимость данного плана, добавьте значение plans[].price price данного плана к накопленным ценам за сегменты в plans[].per_km_pricing и plans[].per_min_pricing .

Если это поле не заполнено, переменные цены, зависящие от времени, отсутствуют и, следовательно, не включаются в общую цену.

plans[].per_min_pricing[].start Плавать Необходимый Количество минут, с которого начинается тарификация сегмента. В этом поле указывается начальное значение сегмента (включительно ). Таким образом, по истечении заданного количества минут rate списывается один раз.
plans[].per_min_pricing[].rate Плавать Необходимый Тариф, взимаемый за каждый interval . Тариф начинается с start сегмента (включительно). Если в этом поле указано отрицательное число, путешественник получает скидку.
plans[].per_min_pricing[].interval Неотрицательное целое число Необходимый

Интервал в минутах, с которым rate сегмента применяется повторно неограниченное время, если только end сегмента не установлен на любое неотрицательное целое число.

rate применяется повторно один раз в начале каждого interval , округление времени в пути не учитывается.

Если end сегмента установлен на любое неотрицательное целое число, rate сегмента повторно применяется до (но не включая) end значения сегмента.

Если это поле равно 0 , rate взимается ровно один раз в start сегмента.

plans[].per_min_pricing[].end Неотрицательное целое число Необязательный

Количество минут, по истечении которых rate за сегмент перестает применяться. В этом поле указывается исключительное значение , которым заканчивается диапазон сегмента. Например, если end равно 20 , rate перестает применяться по истечении 20 минут.

Если это поле не задано или пусто, rate за сегмент взимается до окончания поездки, в дополнение к любым дополнительным сегментам, которые следуют за ним.

Примеры для system_pricing_plans.json

В этом разделе представлены информативные примеры кода system_pricing_plans.json . Также представлены подробные сведения и результаты для каждого примера.

Пример 1 для system_pricing_plans.json

В следующем примере кода тарифного плана показана плата, рассчитываемая на основе времени в пути для следующих интервалов:

  • [0,1): 2 доллара США
    • Если поездка занимает менее минуты, пользователь платит 2 доллара США.
    • Пример: поездка продолжительностью 59 секунд
  • [1,2): 3 доллара США
    • Если поездка длится дольше или равна одной минуте, но меньше двух минут, пользователь платит 2 доллара + 1 доллар = 3 доллара США.
    • Примеры: поездка продолжительностью 1 мин.; поездка продолжительностью 1 мин. 45 сек.
  • x количество минут, где x больше или равно 2: $3 + (($2 + $1) * ( x - 2 + 1)) USD
    • Если поездка длится дольше или равна двум минутам, пользователь платит 3 доллара за часть поездки продолжительностью менее двух минут и (1 доллар [продолжая с первой записи списка per_min_pricing ] + 2 доллара [вторая запись списка per_min_pricing ]) за каждую минуту после двух минут включительно.
    • Примеры:
      • Стоимость двухминутной поездки: 3 доллара + (2 доллара + 1 доллар) = 6 долларов США
      • Стоимость поездки продолжительностью 2 мин. 30 сек.: 3 долл. США + (2 долл. США + 1 долл. США) = 6 долл. США
      • Стоимость 3-минутной поездки: 3 доллара + ((2 доллара + 1 доллар) * 2) = 9 долларов США
      • Стоимость 10-минутной поездки: 3 доллара + ((2 доллара + 1 доллар) * 9) = 30 долларов США
{
  "plans": {
    "plan_id": "plan1",
    "currency": "USD",
    "price": 2,
    "per_min_pricing": [
      {
          "interval": 1,
          "rate": 1,
          "start": 1
      },
      {
          "interval": 1,
          "rate": 2,
          "start": 2
      }
    ],
  }
}

Пример 2 для system_pricing_plans.json

В этом примере мы показываем пример кода для тарифного плана, который тарифицируется как поминутно, так и по километрам:

  • В частности, с конечного пользователя взимается плата в размере 0,25 канадских долларов за км, а также 0,50 канадских долларов за минуту.
  • Оба эти показателя происходят одновременно и не зависят друг от друга.
  • Таким образом, поездка длиной в один километр продолжительностью 10 минут стоит 9 канадских долларов. Стоимость распределяется следующим образом:
    • 3 доллара, базовая цена
    • 0,25 $ * 2, взимается один раз в начале поездки и один раз на отметке 1 км.
    • 0,5 доллара США * 11, взимается один раз в начале каждой минуты. Тарификация начинается с 0 секунд, последний интервал — 10 минут.
{
  "plans": {
    "plan_id": "plan2",
    "currency": "CAD",
    "price": 3,
    "per_km_pricing": [{
      "start": 0,
      "rate": 0.25,
      "interval": 1
    }],
    "per_min_pricing": [{
      "start": 0,
      "rate": 0.50,
      "interval": 1
    }]
  }
}

Условно требуется: geofencing_zones.json (система с док-станцией и без нее)

При необходимости обратитесь к спецификации GBFS .

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

Мы используем эти данные, чтобы при поиске пользователем заданного маршрута, если конечная точка поездки находится за пределами определённых геозон, результат поиска Micrimobility отфильтровывался. Если геозоны не указаны, Google рассматривает сервис как не имеющий ограничений по границам.

Имя поля Тип Требование Описание
geofencing_zones Объект Необходимый Объект FeatureCollection , описанный в IETF RFC 7946, — это объект с полем features . Значение поля features представляет собой массив JSON. Каждый элемент массива JSON является объектом Feature .

Каждая геозона, связанные с ней правила и атрибуты, а также определения FeatureCollection указаны здесь как часть определений фида geofencing_zones.json .

geofencing_zones.type Нить Необходимый Установите значение FeatureCollection , как описано в IETF RFC 7946 .
geofencing_zones.features Множество Необходимый Массив JSON, где каждый элемент массива JSON является объектом Feature .
geofencing_zones.features[].type Нить Необходимый Установите значение Feature , как описано в IETF RFC 7946 .
geofencing_zones.features[].geometry GeoJSON Мультиполигон Необходимый Мультиполигон GeoJSON, описывающий места, где не могут начинаться, заканчиваться и проходить аттракционы, а также другие ограничения. Расположение точек по часовой стрелке определяет область, ограниченную полигоном, а расположение против часовой стрелки — область за пределами полигона. Подробнее об этом см. в правиле правой руки .
geofencing_zones.features[].properties Объект Необходимый Объект, определяющий командировочные расходы и ограничения.
geofencing_zones.features[].properties.rules Множество Необязательный Массив объектов, где каждый объект определяет одно и только одно правило. Если два или более правил пересекаются, конфликтуют или иным образом конфликтуют, приоритет имеет правило, заданное первым в порядке следования в JSON-файле.
geofencing_zones.features[].properties.rules[].vehicle_type_id Множество Необязательный Массив идентификаторов типов транспортных средств, где каждый элемент — это vehicle_type_id , к которому должны быть применены ограничения. Если vehicle_type_id не указан, то ограничения применяются ко всем типам транспортных средств.
geofencing_zones.features[].properties.rules[].ride_allowed Булевое значение Необходимый Может ли велопробег с самостоятельным «неприпаркованным» велосипедом начинаться и заканчиваться в зоне следующим образом:
  • Если поездка на неприпаркованном велосипеде может начинаться и заканчиваться в зоне, установите значение true .
  • Если поездка на непристыкованном велосипеде не может начинаться и заканчиваться в зоне, установите значение false .

Ниже приведен пример geofencing_zones.json :

"geofencing_zones":{
  "type":"FeatureCollection",
  "features":[{
    "type":"Feature",
    "properties":{
      "rules":[{
        "vehicle_type_id":"scooter",
        "ride_allowed": false
      }]
    },
    "geometry":{
      "type":"MultiPolygon",
      "coordinates":[[[
        [-122.66780376434326, 45.49896266763551],
        [-122.66810417175292, 45.49824825558575],
        [-122.66830801963805, 45.49632305799116],
        [-122.66780376434326, 45.49896266763551]
      ]]]
    }
  }]
}

Обязательно: station_information.json (система с пристыковкой)

При необходимости обратитесь к спецификации GBFS .

В этом канале содержится общая информация об общественных станциях проката велосипедов.

Имя поля Тип Требование Описание
stations Множество Необходимый Массив объектов, где каждый объект определяет одну и только одну станцию.
stations[].station_id Нить Необходимый Идентификатор станции.
stations[].name Нить Необходимый Публичное название станции на языке города, в котором она расположена. name должно соответствовать названию, используемому на вывесках на станции (если таковые имеются), или отражать местоположение станции, используя название перекрёстка или местной достопримечательности. Не используйте сокращения, например, «St.» вместо «Street», если только это не указано на вывесках. name должно быть написано с заглавными буквами, в соответствии с местными правилами написания названий населённых пунктов.
stations[].lat Широта Необходимый Широта станции в системе координат WGS 84 в десятичных градусах.
stations[].lon Долгота Необходимый Долгота станции в системе координат WGS 84 в десятичных градусах.
stations[].capacity Неотрицательное целое число Необязательный Неотрицательное целое число, представляющее общее количество стыковочных точек, установленных на станции, как доступных, так и недоступных.
stations[].rental_uris Объект Необходимый

Объект JSON, содержащий URI аренды для Android, iOS и веб-сайтов в соответствующих полях.

Если указаны эти URI, они переопределяют глубинные ссылки по умолчанию, которые были установлены при подключении поставщика.

stations[].rental_uris.android URI Условно требуется

URI, который можно передать приложению Android с намерением android.intent.action.VIEW для поддержки Android Deep Links . В качестве rental_uris должны быть указаны ссылки на приложения Android , чтобы приложению просмотра не приходилось вручную управлять перенаправлением пользователя в магазин приложений, если у пользователя не установлено приложение поставщика.

Этот URI должен представлять собой глубокую ссылку, относящуюся к конкретной станции, а не общую страницу аренды, содержащую информацию о нескольких станциях. Глубокая ссылка должна вести пользователя непосредственно на станцию без каких-либо подсказок, промежуточных страниц или входа в систему. Убедитесь, что пользователи видят станцию, даже если они никогда не открывали приложение.

URI не обязательно должны включать station_id станции, если у партнёра есть другие способы идентифицировать соответствующую станцию. Например, приложение аренды может использовать другие идентификаторы в URI для уникальной идентификации станции.

Если у партнера есть приложение для аренды Android, это поле обязательно для заполнения.

Пример ссылок на приложения Android:

https://www.example.com/app?sid=1234567890&platform=android

stations[].rental_uris.ios URI Условно требуется

URI, который можно использовать в iOS для запуска приложения аренды станции. Подробнее об этом см. в статье Apple о пользовательских URL-схемах iOS . Предоставляемый rental_uris должен быть универсальным URL-адресом iOS , чтобы приложению просмотра не приходилось вручную управлять перенаправлением пользователя в магазин приложений, если у него не установлено приложение поставщика.

Этот URI должен представлять собой глубокую ссылку, относящуюся к конкретной станции, а не общую страницу аренды, содержащую информацию о нескольких станциях. Глубокая ссылка должна вести пользователя непосредственно на станцию без каких-либо подсказок, промежуточных страниц или входа в систему. Убедитесь, что пользователи видят станцию, даже если они никогда не открывали приложение.

URI не обязательно должны включать station_id станции. Приложение аренды может использовать другие идентификаторы в URI для уникальной идентификации станции.

Если у партнера есть приложение для аренды iOS, это поле обязательно для заполнения.

Пример универсальных ссылок iOS:

https://www.example.com/app?sid=1234567890&platform=ios

stations[].rental_uris.web URL Необязательный

URL-адрес, который может использоваться веб-браузером для отображения дополнительной информации о том, как арендовать транспортное средство на этой станции.

Этот URL должен представлять собой глубокую ссылку, относящуюся к конкретной станции, а не общую страницу аренды, содержащую информацию о нескольких станциях. Глубокая ссылка должна вести пользователя непосредственно на станцию без каких-либо подсказок, промежуточных страниц или входа в систему. Убедитесь, что пользователи видят станцию, даже если они никогда не открывали приложение.

URL-адреса не обязательно должны включать station_id станции или иным образом соответствовать семантическим соглашениям URL-адресов аренды для Android или iOS. Приложение аренды может использовать другие идентификаторы в URL-адресе, которые однозначно идентифицируют станцию.

Если это поле не задано, это означает, что глубокие ссылки не поддерживаются веб-браузером.

Пример значения:

https://www.example.com/app?sid=1234567890

Ниже приведен пример для station_information.json :

"stations": [
  {
    "station_id": "597",
    "name": "Silverthorne Road, Battersea",
    "lat": 51.472865,
    "lon": -0.148059,
    "capacity": 10,
    "rental_uris": {
        "android": "https://www.example.com/app?sid=1234567890&platform=android",
        "ios": "https://www.exampleexample.com/app?sid=1234567890&platform=ios",
        "web": "https://www.example.com/app?sid=1234567890&platform=web"
    }
  },
]

Обязательно: station_status.json (система с пристыковкой)

При необходимости обратитесь к спецификации GBFS .

В этом канале отображается актуальная информация о состоянии общественных станций проката велосипедов.

Имя поля Тип Требование Описание
stations Множество Необходимый Массив объектов, где каждый объект определяет одну и только одну станцию.
stations[].station_id Нить Необходимый Идентификатор станции.
stations[].num_bikes_available Неотрицательное целое число Необходимый

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

Чтобы определить, сдает ли станция в аренду велосипеды, необходимо проверить поле is_renting станции и найти истинное логическое значение.

stations[].vehicle_types_available Множество Необязательный

Массив объектов, определяющий общее количество транспортных средств, сгруппированных по типу транспортного средства, доступному на станции. Каждый объект моделирует общее количество транспортных средств соответствующего типа. Суммарное количество транспортных средств каждого из этих объектов должно соответствовать значению, указанному в поле num_bikes_available .

stations[].vehicle_types_available[].vehicle_type_id ИДЕНТИФИКАТОР Необходимый

vehicle_type_id каждого типа транспортного средства, доступного на станции, как описано в vehicle_types.json .

stations[].vehicle_types_available[].count Неотрицательное целое число Необходимый

Общее количество доступных транспортных средств для соответствующего vehicle_type_id на станции, как определено в vehicle_types.json .

stations[].num_docks_available Неотрицательное целое число Условно требуется

Поле обязательно для заполнения, если только станция не имеет неограниченного количества стыковочных мест. Например, виртуальные станции имеют неограниченное количество стыковочных мест, и это поле не является обязательным.

Неотрицательное целое число, представляющее общее количество физически имеющихся на станции функциональных доков, которые могут принять возвращаемые транспортные средства.

Чтобы определить, принимает ли станция в настоящее время возврат велосипедов, необходимо проверить поле is_returning станции и найти true логическое значение.

stations[].is_installed Булевое значение Необходимый

Логическое значение, указывающее, верно ли, что станция в данный момент находится на улице и установлена.

Если станция установлена на улице, установите значение true .

Если станция не установлена на улице, установите значение false .

stations[].is_renting Булевое значение Необходимый

Логическое значение, указывающее, верно ли, что на станции в настоящее время сдается в аренду велосипеды.

Если на станции в настоящее время можно арендовать велосипеды, установите значение true . Даже если станция пуста, если она настроена на прокат велосипедов, is_renting также устанавливается в true .

Если на станции в настоящее время не осуществляется прокат велосипедов, установите значение false .

stations[].is_returning Булевое значение Необходимый

Логический, который указывает, правда ли это, что станция в настоящее время принимает возвращение велосипедов.

Если станция в настоящее время принимает возврат велосипедов, установите на true . Даже если станция заполнена, но позволила бы вернуться, если бы она не была, is_returning установлен на true .

Если станция в настоящее время не принимает возврат велосипеда, установите на false .

Ниже приведен пример station_status.json :

"stations": [
        {
          "station_id": "2",
          "num_bikes_available": 6,
          "vehicle_types_available": [
            {
              "vehicle_type_id" : "scooter_electric",
              "count" : 2
            },
            {
              "vehicle_type_id" : "bike_manual",
              "count" : 4
            }
          ],
          "num_docks_available": 30,
          "is_installed": true,
          "is_renting": true,
          "is_returning": true,
          "last_reported": 1576119631
        },
]