Définitions GBFS

Avant de passer à cette section, si vous ne l'avez pas déjà fait, vérifiez les systèmes de micromobilité compatibles pour lesquels vous créez le flux.

Dans les sections suivantes, chaque en-tête est au format suivant : Required|Optional|Conditionally required: Feed name (System supported). Les systèmes suivants sont compatibles :

  • Système ancré
  • Système sans station d'accueil
  • Système avec ou sans station d'accueil

Pour réussir l'intégration à Google, ne fournissez que les fichiers nécessaires au système décrit par votre flux et spécifiez les champs obligatoires inclus dans les sections concernées. Pour les champs obligatoires sous certaines conditions, consultez la description du champ pour obtenir des conseils. Vous pouvez également spécifier des champs facultatifs qui ajoutent des informations et améliorent l'expérience utilisateur.

En-tête requis pour les flux Micromobility

Les flux de micromobilité sont des flux qui contiennent des données structurées de micromobilité avec ou sans station, telles que définies dans cet article.

Tous les flux doivent toujours spécifier les champs inclus dans le tableau suivant au niveau supérieur de l'objet JSON, qui sont collectivement appelés en-tête GBFS commun.

Nom du champ Type Exigence Description
last_updated Horodatage Obligatoire Code temporel POSIX, qui spécifie un nombre de secondes depuis le 1er janvier 1970 à 00:00:00 UTC.

Définissez la date et l'heure de la dernière mise à jour des données du flux.

ttl Entier non négatif Obligatoire Entier non négatif représentant le nombre de secondes restantes avant la mise à jour du flux.

Si les données doivent être mises à jour à un rythme constant, définissez cette valeur sur 0.

data JSON Obligatoire JSON contenant les champs de données pour le flux individuel.

Par exemple, un flux free_bike_status.json agrégé qui spécifie l'en-tête GBFS commun peut se présenter comme suit :

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

Obligatoire : system_information.json (système avec et sans borne)

Si nécessaire, consultez la spécification GBFS.

Ce flux fournit des informations sur l'opérateur du système.

Nom du champ Type Exigence Description
system_id ID Obligatoire Identifiant global unique du système de partage de véhicules. Cette valeur est censée rester la même pendant toute la durée de vie du système. Chaque système ou zone géographique distincts dans lesquels les véhicules sont exploités DOIVENT avoir leur propre system_id. Les ID de système DOIVENT être reconnaissables comme appartenant à un système particulier plutôt qu'à des chaînes aléatoires (par exemple, bcycle_austin ou biketown_pdx).
name Chaîne Obligatoire Nom du système, visible par les clients.
rental_apps Objet Obligatoire Objet JSON contenant les informations de l'application de location pour Android et iOS dans leurs champs respectifs.
rental_apps.android Objet Obligatoire sous certaines conditions Contient des informations sur le téléchargement et la découverte d'applications de location pour la plate-forme Android dans les champs store_uri et discovery_uri. Ce champ est obligatoire si le fournisseur du système dispose d'une application de location Android.
rental_apps.android.store_uri URI Obligatoire URI depuis lequel l'application Android de location peut être téléchargée. Il s'agit généralement d'un URI vers une plate-forme de téléchargement d'applications telle que Google Play. Si l'URI pointe vers un app store tel que Google Play, nous vous recommandons de suivre les bonnes pratiques Android afin que l'application de visionnage puisse ouvrir directement l'URI vers l'application native de l'app store au lieu d'un site Web.
rental_apps.android.discovery_uri URI Obligatoire URI au format your_custom_scheme://your/path/here. L'URI peut être utilisé par PackageManager.queryIntentActivities() pour déterminer si l'application Android de location est installée sur l'appareil.
rental_apps.ios Objet Obligatoire sous certaines conditions Contient des informations sur le téléchargement et la découverte d'applications de location pour la plate-forme iOS dans les champs store_uri et discovery_uri. Ce champ est obligatoire si le fournisseur du système dispose d'une application de location iOS.
rental_apps.ios.store_uri URI Obligatoire URI depuis lequel l'application iOS de location peut être téléchargée. Il s'agit généralement d'un URI vers une plate-forme de téléchargement d'applications telle que l'App Store d'Apple. Si l'URI pointe vers un app store tel que l'App Store d'Apple, nous vous recommandons de suivre les bonnes pratiques d'iOS afin que l'application de visionnage puisse ouvrir directement l'URI vers l'application native de l'app store au lieu d'un site Web.
rental_apps.ios.discovery_uri URI Obligatoire URI au format your_custom_scheme://. L'URI peut être utilisé par UIApplication canOpenURL: pour déterminer si l'application iOS de location est installée sur l'appareil.

Obligatoire : free_bike_status.json (système sans station)

Si nécessaire, consultez la spécification GBFS.

Ce flux définit les emplacements et les attributs des véhicules autonomes disponibles. Pour des raisons de confidentialité, les véhicules faisant l'objet d'une location active ne doivent pas figurer dans ce flux.

Nom du champ Type Exigence Description
bikes Tableau Obligatoire Tableau des vélos actuellement disponibles et arrêtés, où chaque vélo est un objet.
bikes[].bike_id ID Obligatoire Identifiant d'un vélo.

Pour protéger la confidentialité, l'ID peut être remplacé par une chaîne aléatoire après chaque trajet.

bikes[].lat Latitude Obligatoire Latitude WGS 84 du vélo, en degrés décimaux.
bikes[].lon Longitude Obligatoire Longitude WGS 84 du vélo, en degrés décimaux.
bikes[].is_reserved Booléen Obligatoire Indique si le vélo est actuellement réservé, comme suit :
  • Si le vélo est actuellement réservé, définissez la valeur sur true.
  • Si le vélo n'est pas réservé, définissez la valeur sur false.
bikes[].is_disabled Booléen Obligatoire Indique si le vélo est actuellement désactivé ou cassé, comme suit :
  • Si le vélo est actuellement désactivé, définissez la valeur sur true.
  • Si le vélo n'est pas actuellement désactivé, définissez la valeur sur false.
bikes[].rental_uris Objet Obligatoire Objet JSON contenant les URI de location pour Android, iOS et le Web dans leurs champs respectifs.
bikes[].rental_uris.android URI Obligatoire sous certaines conditions URI pouvant être transmis à une application Android avec un intent Android android.intent.action.VIEW pour prendre en charge les liens profonds Android. Le rental_uris fourni doit être un lien d'application Android afin que l'application de visionnage n'ait pas à gérer manuellement la redirection de l'utilisateur vers l'App Store si l'application du fournisseur n'est pas installée.

Cet URI doit être un lien profond spécifique au vélo, et non une page de location générale qui inclut des informations pour plusieurs vélos. Le lien profond doit rediriger l'utilisateur directement vers le vélo, sans aucune invite, page interstitielle ni connexion. Assurez-vous que les utilisateurs peuvent voir le vélo même s'ils n'ont jamais ouvert l'application.

Il n'est pas forcément nécessaire que les URI incluent le bike_id du vélo, à condition que le partenaire dispose d'autres moyens d'identifier le vélo concerné. Par exemple, l'application de location peut utiliser d'autres identifiants dans l'URI pour identifier le vélo de manière unique.

Ce champ est obligatoire si le partenaire dispose d'une application de location Android.

Exemple de lien vers une application Android :

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

bikes[].rental_uris.ios URI Obligatoire sous certaines conditions URI pouvant être utilisé sur iOS pour lancer l'application de location du vélo. Pour en savoir plus, consultez l'article d'Apple sur les schémas d'URL personnalisés iOS. Le rental_uris fourni doit être un lien universel iOS afin que l'application de visionnage n'ait pas à gérer manuellement la redirection de l'utilisateur vers l'App Store si l'application du fournisseur n'est pas installée.

Cet URI doit être un lien profond spécifique au vélo, et non une page de location générale qui inclut des informations pour plusieurs vélos. Le lien profond doit rediriger l'utilisateur directement vers le vélo, sans aucune invite, page interstitielle ni connexion. Assurez-vous que les utilisateurs peuvent voir le vélo même s'ils n'ont jamais ouvert l'application.

Il n'est pas forcément nécessaire que les URI incluent le bike_id du vélo, à condition que le partenaire dispose d'autres moyens d'identifier le vélo concerné. Par exemple, l'application de location peut utiliser d'autres identifiants dans l'URI pour identifier le vélo de manière unique.

Ce champ est obligatoire si le partenaire dispose d'une application de location iOS.

Exemple de lien universel iOS :

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

bikes[].rental_uris.web URL Facultatif

URL qu'un navigateur Web peut utiliser pour afficher plus d'informations sur la location d'un véhicule à cet emplacement.

Cette URL doit être un lien profond spécifique au vélo individuel, et non une page de location générale qui inclut des informations pour plusieurs vélos. Le lien profond doit rediriger l'utilisateur directement vers le vélo, sans aucune invite, page interstitielle ni connexion. Assurez-vous que les utilisateurs peuvent voir le vélo même s'ils n'ont jamais ouvert l'application.

Les URL ne sont pas nécessairement tenues d'inclure bike_id pour le vélo ni de suivre les conventions sémantiques des URL de location pour Android ou iOS. L'application de location peut utiliser d'autres identifiants dans l'URL pour identifier le vélo de manière unique.

Si ce champ n'est pas défini, cela signifie que les liens profonds ne sont pas compatibles avec le navigateur Web.

Exemple de valeur :

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

bikes[].vehicle_type_id ID Obligatoire Le vehicle_type_id du véhicule, comme décrit dans la section vehicle_types.json.
bikes[].pricing_plan_id ID Obligatoire Identifiant du forfait appliqué lorsque ce type de véhicule est loué, comme décrit dans la section system_pricing_plans.json.
bikes[].current_range_meters Flottant non négatif Obligatoire sous certaines conditions Ce champ est obligatoire si la définition vehicle_type correspondant au véhicule comporte un moteur.

Définissez la distance maximale en mètres que le véhicule peut parcourir sans avoir besoin d'être rechargé ou ravitaillé, en fonction de son niveau de charge ou de carburant actuel.

bikes[].last_reported Horodatage Facultatif Défini sur la dernière heure à laquelle le véhicule a communiqué son état au backend de l'opérateur.

Voici un exemple pour 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
}
]

Obligatoire : vehicle_types.json (système avec et sans station)

Si nécessaire, consultez la spécification GBFS.

Ce flux définit les détails des différents types de véhicules, comme indiqué dans la section free_bike_status.json.

Nom du champ Type Exigence Description
vehicle_types Tableau Obligatoire Tableau d'objets, où chaque objet définit un type de véhicule distinct dans le catalogue du fournisseur. Il ne peut y avoir qu'un seul objet pour un type de véhicule donné.
vehicle_types[].vehicle_type_id ID Obligatoire Identifiant unique d'un type de véhicule donné.
vehicle_types[].form_factor Énumération Obligatoire Énumération qui représente le facteur de forme général du véhicule, à partir de la liste suivante de valeurs actuellement valides :
  • bicycle
  • scooter
  • other
vehicle_types[].propulsion_type Énumération Obligatoire Énumération qui représente le type de propulsion principal du véhicule, à partir de la liste suivante de valeurs actuellement valides :
  • human : propulsion à pédale ou à pied
  • electric_assist : fournit de l'énergie uniquement en plus de la propulsion humaine
  • electric : contient le mode d'accélérateur avec un moteur à batterie.
  • combustion : contient le mode d'accélérateur avec un moteur à essence
vehicle_types[].max_range_meters Flottant non négatif Obligatoire sous certaines conditions Si propulsion_type n'est pas défini sur human, le véhicule est équipé d'un moteur. Ce champ est donc obligatoire.

Définissez la distance maximale en mètres que le véhicule peut parcourir sans avoir besoin d'être rechargé ou ravitaillé, lorsqu'il est entièrement ravitaillé ou rechargé.

Voici un exemple pour 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
  }
]

Obligatoire : system_pricing_plans.json (système sans station)

Si nécessaire, consultez la spécification GBFS.

Ce flux définit les forfaits pour les véhicules autonomes. Nous exigeons des fournisseurs qu'ils affichent des informations sur les prix des véhicules autonomes.

Nom du champ Type Exigence Description
plans Tableau Obligatoire Tableau d'objets où chaque objet définit un forfait donné.
plans[].plan_id ID Obligatoire Chaîne représentant un identifiant unique pour le forfait proposé par le fournisseur.
plans[].url URL Facultatif URL qui redirige les utilisateurs finaux vers plus d'informations sur le forfait.
plans[].currency Chaîne Obligatoire Norme ISO 4217 pour l'abonnement.
plans[].price Flottant non négatif Obligatoire

Le forfait doit être défini comme un forfait non tarifé ou un forfait tarifé :

Forfait sans évaluation

Il s'agit d'un forfait unique à prix fixe.

Définissez le champ suivant :

  • price : prix fixe de l'ensemble du trajet.
Plan tarifaire avec évaluation

Il s'agit d'un tarif linéaire par paliers.

Définissez le champ suivant :

  • price : prix de base facturé exactement une fois par trajet.

Définissez un ou les deux champs suivants :

  • per_km_pricing : prix du trajet spécifié au tarif par kilomètre.
  • per_min_pricing : prix du trajet spécifié au tarif par minute.
plans[].per_km_pricing Tableau Obligatoire sous certaines conditions

Ce champ est obligatoire si le prix dépend de la distance parcourue (en kilomètres).

Tableau d'objets où chaque objet définit un segment divisé par une distance donnée. La valeur start de chaque segment doit être inférieure ou égale à la valeur start du segment suivant.

Pour déterminer le prix total du forfait donné, ajoutez la valeur plans[].price du forfait donné aux prix cumulés des segments dans plans[].per_km_pricing et plans[].per_min_pricing.

Si ce champ n'est pas défini, il n'y a pas de prix variables en fonction de la distance. Par conséquent, aucun n'est inclus dans le prix total.

plans[].per_km_pricing[].start Entier non négatif Obligatoire Nombre de kilomètres à partir duquel le tarif du segment commence à être facturé. Ce champ est défini sur la valeur inclusive qui marque le début de la plage du segment. Ainsi, une fois le nombre de kilomètres parcourus, le rate est facturé une seule fois.
plans[].per_km_pricing[].rate Float Obligatoire Taux facturé pour chaque interval, qui commence à la start inclusive du segment. Si ce champ est défini sur un nombre négatif, le voyageur bénéficie d'une remise.
plans[].per_km_pricing[].interval Entier non négatif Obligatoire

Intervalle en kilomètres auquel le rate du segment est réappliqué indéfiniment, sauf si le end du segment est défini sur un entier non négatif.

rate est réappliqué une fois au début de chaque interval, et aucune distance n'est arrondie.

Si la valeur end du segment est définie sur un entier non négatif, la valeur rate du segment est réappliquée jusqu'à la valeur end du segment, mais sans l'inclure.

Si ce champ est défini sur 0, le rate est facturé exactement une fois au start du segment.

plans[].per_km_pricing[].end Entier non négatif Facultatif

Nombre de kilomètres à partir duquel le rate du segment n'est plus appliqué. Ce champ est défini sur la valeur exclusive qui met fin à la plage du segment. Par exemple, si end est défini sur 40, la valeur rate ne s'applique plus à 40 kilomètres.

Si ce champ n'est pas défini ou est vide, le rate du segment est facturé jusqu'à la fin du trajet, en plus de tous les segments supplémentaires qui le suivent.

plans[].per_min_pricing Tableau Obligatoire sous certaines conditions

Ce champ est obligatoire si le prix dépend du temps écoulé (en minutes).

Tableau d'objets où chaque objet définit un segment divisé par période. La valeur start de chaque segment doit être inférieure ou égale à la valeur start du segment suivant.

Pour déterminer le prix total du forfait donné, ajoutez la valeur plans[].price du forfait donné aux prix cumulés des segments dans plans[].per_km_pricing et plans[].per_min_pricing.

Si ce champ n'est pas défini, il n'y a pas de prix variables en fonction du temps. Par conséquent, aucun n'est inclus dans le prix total.

plans[].per_min_pricing[].start Float Obligatoire Nombre de minutes à partir duquel le tarif du segment commence à être facturé. Ce champ est défini sur la valeur inclusive qui marque le début de la plage du segment. Ainsi, une fois le nombre de minutes défini écoulé, le rate est facturé une fois.
plans[].per_min_pricing[].rate Float Obligatoire Taux facturé pour chaque interval. Le taux commence à l'start inclusif du segment. Si ce champ est défini sur un nombre négatif, le voyageur bénéficie d'une remise.
plans[].per_min_pricing[].interval Entier non négatif Obligatoire

Intervalle en minutes auquel le rate du segment est réappliqué indéfiniment, sauf si le end du segment est défini sur un nombre entier non négatif.

Le rate est réappliqué une fois au début de chaque interval, et aucun arrondi du temps de trajet n'est pris en compte.

Si la valeur end du segment est définie sur un entier non négatif, la valeur rate du segment est réappliquée jusqu'à la valeur end du segment, mais sans l'inclure.

Si ce champ est défini sur 0, le rate est facturé exactement une fois au start du segment.

plans[].per_min_pricing[].end Entier non négatif Facultatif

Nombre de minutes au-delà duquel le rate du segment n'est plus appliqué. Ce champ est défini sur la valeur exclusive qui met fin à la plage du segment. Par exemple, si end est défini sur 20, le rate ne s'applique plus au bout de 20 minutes.

Si ce champ n'est pas défini ou est vide, le rate du segment est facturé jusqu'à la fin du trajet, en plus de tous les segments supplémentaires qui le suivent.

Exemples pour system_pricing_plans.json

Cette section fournit des exemples de code system_pricing_plans.json informatifs. Les détails et les résultats pertinents de chaque exemple sont également fournis.

Exemple 1 pour system_pricing_plans.json

L'exemple de code de forfait suivant indique les frais en fonction de la durée du trajet pour les intervalles suivants :

  • [0,1) : 2 USD
    • Si le trajet dure moins d'une minute, l'utilisateur paie 2 USD.
    • Exemple : trajet de 59 secondes
  • [1,2) : 3 USD
    • Si le trajet dure une minute ou plus, mais moins de deux minutes, l'utilisateur paie 2 $+ 1 $= 3 $.
    • Exemples : trajet de 1 min ; trajet de 1 min 45 s
  • x = nombre de minutes où x est supérieur ou égal à 2 : 3 $ + ((2 $ + 1 $) * (x - 2 + 1)) USD
    • Si le trajet dure au moins deux minutes, l'utilisateur paie 3 $pour la partie du trajet inférieure à deux minutes, puis 1 $ (en continuant à partir de la première entrée de la liste per_min_pricing) + 2 $ (la deuxième entrée de la liste per_min_pricing) pour chaque minute supplémentaire à partir de deux minutes incluses.
    • Exemples :
      • Un trajet de deux minutes coûte 3 $+ (2 $ + 1 $) = 6 $.
      • Un trajet de 2 min 30 s coûte 3 $+ (2 $ + 1 $) = 6 $
      • Course de 3 minutes : 3 $+ ((2 $ + 1 $) x 2) = 9 $
      • Un trajet de 10 minutes coûte 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
      }
    ],
  }
}

Exemple 2 pour system_pricing_plans.json

Dans cet exemple, nous présentons un exemple de code pour un forfait facturé à la fois en minutes et en kilomètres :

  • Plus précisément, l'utilisateur final est facturé 0,25 CAD par kilomètre et 0,50 CAD par minute.
  • Ces deux taux se produisent simultanément et ne dépendent pas l'un de l'autre.
  • Par conséquent, un trajet d'un kilomètre qui dure 10 minutes coûte 9 CAD. Voici le détail du coût :
    • 3 $, prix de base
    • 0,25 $ * 2, facturé une fois au début du trajet et une fois au kilomètre 1.
    • 0,5 $ * 11, facturé une fois au début de chaque minute. La facturation commence à 0 seconde, le dernier intervalle étant facturé à 10 minutes.
{
  "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
    }]
  }
}

Obligatoire sous certaines conditions : geofencing_zones.json (système avec et sans station)

Si nécessaire, consultez la spécification GBFS.

Ce flux définit les données de géorepérage pour les véhicules autonomes. Les données de géorepérage incluent les limites géographiques qui spécifient où les véhicules sont autorisés à commencer et à terminer le trajet, ainsi que la vitesse à laquelle ils peuvent rouler. Cette vitesse correspond à la vitesse maximale du véhicule ou à la limitation de vitesse de la route sur laquelle il circule, selon la valeur la plus basse. Les conducteurs doivent respecter les lois et ordonnances locales.

Nous utilisons ces données pour filtrer les résultats de micromobilité lorsqu'un utilisateur recherche un itinéraire donné et que la fin du trajet se situe en dehors des géorepères spécifiques. Si aucune zone géographique n'est fournie, Google considère que le service n'est soumis à aucune restriction de zone.

Nom du champ Type Exigence Description
geofencing_zones Objet Obligatoire Un objet FeatureCollection tel que décrit par la norme IETF RFC 7946 est un objet qui comporte un champ nommé features. La valeur de features est un tableau JSON. Chaque élément du tableau JSON est un objet Feature.

Chaque zone géorepérée, ses règles et attributs associés, ainsi que les définitions des FeatureCollection sont spécifiés ici dans les définitions du flux geofencing_zones.json.

geofencing_zones.type Chaîne Obligatoire Définissez la valeur sur FeatureCollection, comme décrit dans la norme IETF RFC 7946.
geofencing_zones.features Tableau Obligatoire Tableau JSON, où chaque élément du tableau JSON est un objet Feature.
geofencing_zones.features[].type Chaîne Obligatoire Définissez la valeur sur Feature, comme décrit dans la norme IETF RFC 7946.
geofencing_zones.features[].geometry Multipolygone GeoJSON Obligatoire Multipolygone GeoJSON qui décrit les zones où les trajets ne peuvent pas commencer, se terminer ou passer, ainsi que d'autres limites. Une disposition des points dans le sens des aiguilles d'une montre définit la zone délimitée par le polygone, tandis qu'un ordre inverse définit la zone extérieure au polygone. Pour en savoir plus, consultez la règle de la main droite.
geofencing_zones.features[].properties Objet Obligatoire Objet qui définit les indemnités de voyage et les limites.
geofencing_zones.features[].properties.rules Tableau Facultatif Tableau d'objets, où chaque objet définit une seule règle. Si au moins deux règles se chevauchent, entrent en conflit ou sont incompatibles d'une manière ou d'une autre, la règle définie en premier dans l'ordre du fichier JSON prévaut.
geofencing_zones.features[].properties.rules[].vehicle_type_id Tableau Facultatif Tableau d'ID de types de véhicules, où chaque élément est un vehicle_type_id auquel des restrictions doivent être appliquées. Si aucune valeur vehicle_type_id n'est spécifiée, les restrictions s'appliquent à tous les types de véhicules.
geofencing_zones.features[].properties.rules[].ride_allowed Booléen Obligatoire Indique si la course à vélo en libre-service peut commencer et se terminer dans la zone, comme suit :
  • Si le trajet à vélo sans station peut commencer et se terminer dans la zone, définissez la valeur sur true.
  • Si la course à vélo sans station ne peut pas commencer ni se terminer dans la zone, définissez la valeur sur false.

Voici un exemple pour 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]
      ]]]
    }
  }]
}

Obligatoire : station_information.json (système avec bornes)

Si nécessaire, consultez la spécification GBFS.

Ce flux définit les informations générales sur les stations de vélos en libre-service.

Nom du champ Type Exigence Description
stations Tableau Obligatoire Tableau d'objets où chaque objet définit une seule et unique station.
stations[].station_id Chaîne Obligatoire Identifiant de la station.
stations[].name Chaîne Obligatoire Nom public de la gare dans la langue locale de la ville où elle se trouve. Le champ name doit correspondre à ce qui est indiqué sur les panneaux de signalisation de la gare, le cas échéant, ou refléter l'emplacement de la gare en utilisant une rue transversale ou un point de repère local. N'utilisez pas d'abréviations telles que "St." pour "Street", sauf si elles sont explicitement utilisées dans la signalisation. Le name doit être en casse mixte, conformément aux conventions locales d'utilisation des majuscules et des minuscules pour les noms de lieux, et non en majuscules.
stations[].lat Latitude Obligatoire Latitude WGS 84 de la station, en degrés décimaux.
stations[].lon Longitude Obligatoire Longitude WGS 84 de la station, en degrés décimaux.
stations[].capacity Entier non négatif Facultatif Entier non négatif représentant le nombre total de bornes d'accueil installées à la station, disponibles et indisponibles.
stations[].rental_uris Objet Obligatoire

Objet JSON contenant les URI de location pour Android, iOS et le Web dans leurs champs respectifs.

Si ces URI sont spécifiés, ils remplacent les liens profonds par défaut qui ont été définis lors de l'intégration du fournisseur.

stations[].rental_uris.android URI Obligatoire sous certaines conditions

URI pouvant être transmis à une application Android avec un intent Android android.intent.action.VIEW pour prendre en charge les liens profonds Android. Le rental_uris fourni doit être un lien d'application Android afin que l'application de visionnage n'ait pas à gérer manuellement la redirection de l'utilisateur vers l'App Store si l'application du fournisseur n'est pas installée.

Cet URI doit être un lien profond spécifique à la station individuelle, et non une page de location générale qui inclut des informations pour plusieurs stations. Le lien profond doit rediriger directement l'utilisateur vers la station, sans aucune invite, page interstitielle ni connexion. Assurez-vous que les utilisateurs peuvent voir la station même s'ils n'ont jamais ouvert l'application.

Il n'est pas forcément nécessaire que les URI incluent le station_id de la station, à condition que le partenaire dispose d'autres moyens d'identifier la station concernée. Par exemple, l'application de location peut utiliser d'autres identifiants dans l'URI pour identifier la station de manière unique.

Ce champ est obligatoire si le partenaire dispose d'une application de location Android.

Exemple de lien vers une application Android :

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

stations[].rental_uris.ios URI Obligatoire sous certaines conditions

URI pouvant être utilisé sur iOS pour lancer l'application de location pour la station. Pour en savoir plus, consultez l'article d'Apple sur les schémas d'URL personnalisés iOS. Le rental_uris fourni doit être un lien universel iOS afin que l'application de visionnage n'ait pas à gérer manuellement la redirection de l'utilisateur vers l'App Store si l'application du fournisseur n'est pas installée.

Cet URI doit être un lien profond spécifique à la station individuelle, et non une page de location générale qui inclut des informations pour plusieurs stations. Le lien profond doit rediriger directement l'utilisateur vers la station, sans aucune invite, page interstitielle ni connexion. Assurez-vous que les utilisateurs peuvent voir la station même s'ils n'ont jamais ouvert l'application.

Les URI ne sont pas nécessairement tenus d'inclure station_id pour la station. L'application de location peut utiliser d'autres identifiants dans l'URI pour identifier de manière unique la station.

Ce champ est obligatoire si le partenaire dispose d'une application de location iOS.

Exemple de lien universel iOS :

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

stations[].rental_uris.web URL Facultatif

URL qu'un navigateur Web peut utiliser pour afficher plus d'informations sur la location d'un véhicule à cette station.

Cette URL doit être un lien profond spécifique à la station, et non une page de location générale qui inclut des informations pour plusieurs stations. Le lien profond doit rediriger l'utilisateur directement vers la station, sans aucune invite, page interstitielle ni connexion. Assurez-vous que les utilisateurs peuvent voir la station même s'ils n'ont jamais ouvert l'application.

Il n'est pas nécessaire que les URL incluent station_id pour la station ni qu'elles suivent les conventions sémantiques des URL de location pour Android ou iOS. L'application de location peut utiliser d'autres identifiants dans l'URL pour identifier de manière unique la station.

Si ce champ n'est pas défini, cela signifie que les liens profonds ne sont pas compatibles avec le navigateur Web.

Exemple de valeur :

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

Voici un exemple pour 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"
    }
  },
]

Obligatoire : station_status.json (système avec borne)

Si nécessaire, consultez la spécification GBFS.

Ce flux définit l'état actuel des stations de vélos en libre-service publiques.

Nom du champ Type Exigence Description
stations Tableau Obligatoire Tableau d'objets, où chaque objet définit une seule et unique station.
stations[].station_id Chaîne Obligatoire Identifiant de la station.
stations[].num_bikes_available Entier non négatif Obligatoire

Entier non négatif représentant le nombre de vélos fonctionnels physiquement présents à la station et pouvant être proposés à la location.

Pour déterminer si la station loue actuellement des vélos, vous devez inspecter le champ is_renting de la station et trouver une valeur booléenne "true".

stations[].vehicle_types_available Tableau Facultatif

Tableau d'objets qui définit le nombre total de véhicules, classés par type de véhicule disponible dans une station. Chaque objet modélise le nombre total de véhicules pour le type de véhicule associé. Le nombre total de véhicules de chacun de ces objets doit correspondre à la valeur spécifiée dans le champ num_bikes_available.

stations[].vehicle_types_available[].vehicle_type_id ID Obligatoire

Le vehicle_type_id de chaque type de véhicule disponible à la station, tel que décrit dans vehicle_types.json.

stations[].vehicle_types_available[].count Entier non négatif Obligatoire

Nombre total de véhicules disponibles pour le vehicle_type_id correspondant à la station, tel que défini dans vehicle_types.json.

stations[].num_docks_available Entier non négatif Obligatoire sous certaines conditions

Ce champ est obligatoire, sauf si la station dispose d'une capacité d'accueil illimitée. Par exemple, les stations virtuelles ont une capacité d'accueil illimitée et le champ n'est pas obligatoire.

Entier non négatif représentant le nombre total de bornes fonctionnelles physiquement disponibles à la station et pouvant accepter le retour de véhicules.

Pour déterminer si la station accepte actuellement les retours de vélos, vous devez inspecter le champ is_returning de la station et trouver une valeur booléenne true.

stations[].is_installed Booléen Obligatoire

Valeur booléenne indiquant si la station est actuellement dans la rue et installée.

Si la station est installée dans la rue, définissez la valeur sur true.

Si la borne n'est pas installée dans la rue, définissez la valeur sur false.

stations[].is_renting Booléen Obligatoire

Valeur booléenne indiquant si la station loue actuellement des vélos.

Si la station loue actuellement des vélos, définissez la valeur sur true. Même si la station est vide, si elle est configurée pour autoriser les locations, is_renting est défini sur true.

Si la station ne propose pas de vélos à la location, définissez la valeur sur false.

stations[].is_returning Booléen Obligatoire

Valeur booléenne indiquant si la station accepte actuellement les retours de vélos.

Si la station accepte actuellement les retours de vélos, définissez la valeur sur true. Même si la station est pleine, mais qu'elle autoriserait un retour si ce n'était pas le cas, is_returning est défini sur true.

Si la station n'accepte pas actuellement les retours de vélos, définissez la valeur sur false.

Voici un exemple de 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
        },
]