Définitions GBFS

Avant de poursuivre 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 a le format suivant : Required|Optional|Conditionally required: Feed name (System supported). Les systèmes suivants sont compatibles:

  • Système sur station d'accueil
  • Système sans station
  • Système sur station d'accueil

Pour une intégration réussie avec Google, fournissez uniquement 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, reportez-vous à la description des champs. Vous pouvez également spécifier des champs facultatifs qui ajoutent des informations et offrent une meilleure expérience utilisateur.

En-tête requis pour les flux de micromobilité

Les flux de micromobilité sont des flux contenant des données structurées Micromobility, 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, également appelés en-tête GBFS commun.

Field name Type Obligatoire/Facultatif Description
last_updated Code temporel Obligatoire Un horodatage POSIX, qui spécifie le nombre de secondes écoulées 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 restant avant la mise à jour du flux.

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

data JSON Obligatoire JSON contenant les champs de données du 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 ancré et sans station)

Reportez-vous à la spécification GBFS si nécessaire.

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

Field name Type Obligatoire/Facultatif Description
system_id ID Obligatoire Identifiant unique du système de partage de véhicules. Cette valeur est destinée à rester identique pendant toute la durée de vie du système. Chaque système ou zone géographique dans lesquels les véhicules sont exploités DOIT disposer de son propre identifiant système. Les ID système DOIVENT être reconnus comme appartenant à un système particulier, et non à des chaînes aléatoires (par exemple, bcycle_austin ou biketown_pdx).
name String Obligatoire Nom du système, présenté aux clients.
rental_apps Objet Obligatoire Objet JSON contenant les informations sur l'application de location pour Android et iOS dans leurs champs respectifs.
rental_apps.android Objet Conditionally required Contient des informations sur les téléchargements et la découverte d'applications pour la plate-forme Android dans les champs store_uri et discovery_uri. Si le fournisseur du système possède une application de location Android, ce champ est obligatoire.
rental_apps.android.store_uri URI Obligatoire URI à partir duquel l'application Android à louer 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 une plate-forme de téléchargement d'applications telle que Google Play, nous vous recommandons de suivre les bonnes pratiques d'Android afin que l'application de visualisation puisse directement ouvrir l'URI à l'application native de la plate-forme de téléchargement plutôt qu'à 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 savoir si l'application de location Android est installée sur l'appareil.
rental_apps.ios Objet Conditionally required Contient des informations sur le téléchargement et la découverte d'applications pour la plate-forme iOS dans les champs store_uri et discovery_uri. Ce champ est obligatoire si le fournisseur du système possède une application de location iOS.
rental_apps.ios.store_uri URI Obligatoire URI à partir duquel l'application iOS de location peut être téléchargée. Il s'agit généralement d'un URI d'une plate-forme de téléchargement d'applications, comme l'App Store d'Apple. Si l'URI pointe vers une plate-forme de téléchargement d'applications telle que l'App Store d'Apple, nous vous recommandons de suivre les bonnes pratiques iOS afin que l'application de visualisation puisse directement ouvrir l'URI à l'application native de la plate-forme de téléchargement plutôt qu'à 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 savoir si l'application de location iOS est installée sur l'appareil.

Obligatoire: free_bike_status.json (Système sans console)

Reportez-vous à la spécification GBFS si nécessaire.

Ce flux définit les établissements et les attributs des véhicules autonomes disponibles. Pour des raisons de confidentialité, les véhicules faisant partie d'une location active ne doivent pas apparaître dans ce flux.

Field name Type Obligatoire/Facultatif Description
bikes Array Obligatoire Tableau des vélos arrêtés actuellement disponibles, 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-le sur true.
  • Si le vélo n'est pas réservé actuellement, définissez-le 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-le sur true.
  • Si le vélo n'est pas désactivé, définissez-le sur false.
bikes[].rental_uris Objet Obligatoire Objet JSON contenant des URI de location pour Android, iOS et le Web dans leurs champs respectifs.
bikes[].rental_uris.android URI Conditionally required Un URI qui peut être transmis à une application Android avec un intent Android android.intent.action.VIEW pour accepter les liens profonds Android. Le rental_uris fourni doit être un lien vers l'application Android. Ainsi, l'application de visualisation n'a pas besoin de gérer manuellement la redirection de l'utilisateur vers la plate-forme de téléchargement d'applications si l'application du fournisseur n'est pas installée.

Cet URI doit être un lien profond spécifique à un vélo, et non une page de location générale incluant des informations sur plusieurs vélos. Le lien profond doit rediriger l'utilisateur directement vers le vélo sans 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 URI ne sont pas nécessairement obligatoires pour inclure le bike_id du vélo, à condition que le partenaire ait 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 propose une application de location Android.

Exemple de liens vers une application Android:

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

bikes[].rental_uris.ios URI Conditionally required URI qui peut être utilisé sur iOS pour lancer l'application de location du vélo. Pour en savoir plus à ce sujet, consultez l'article d'Apple sur les schémas d'URL personnalisés iOS. Le rental_uris fourni doit être un lien universel iOS. Ainsi, l'application de visualisation n'a pas besoin de gérer manuellement la redirection de l'utilisateur vers la plate-forme de téléchargement d'applications si l'application du fournisseur n'est pas installée.

Cet URI doit être un lien profond spécifique à un vélo, et non une page de location générale incluant des informations sur plusieurs vélos. Le lien profond doit rediriger l'utilisateur directement vers le vélo sans 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 URI ne sont pas nécessairement obligatoires pour inclure l'identifiant "bike_id" du vélo, à condition que le partenaire dispose d'autres moyens d'identifier le vélo. 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 propose une application de location iOS.

Exemple de liens universels iOS:

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

bikes[].rental_uris.web URL Facultative

URL permettant à un navigateur Web d'afficher plus d'informations sur la location d'un véhicule dans ce véhicule.

Cette URL doit être un lien profond spécifique au vélo en question, et non une page de location générale incluant des informations sur plusieurs vélos. Le lien profond doit rediriger l'utilisateur directement vers le vélo sans 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 doivent pas nécessairement inclure le bike_id pour le vélo ni 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 qui identifient le vélo de manière unique.

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

Exemple de valeur :

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

bikes[].vehicle_type_id ID Obligatoire 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é lors de la location de ce type de véhicule, comme décrit dans la section system_pricing_plans.json.
bikes[].current_range_meters Flottant non négatif Conditionally required Si la définition vehicle_type correspondant au véhicule dispose d'un moteur, ce champ est obligatoire.

Distance la plus éloignée (en mètres) que le véhicule peut parcourir sans nécessiter de recharge ni de carburant, en fonction du niveau de charge ou du carburant actuel du véhicule.

bikes[].last_reported Code temporel Facultative Défini sur la dernière fois que le véhicule a signalé 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 ancré et sans station)

Reportez-vous à la spécification GBFS si nécessaire.

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

Field name Type Obligatoire/Facultatif Description
vehicle_types Array Obligatoire Tableau d'objets, dans lequel chaque objet définit un type de véhicule distinct dans le catalogue du fournisseur. Il ne peut y avoir qu'un seul objet par type de véhicule.
vehicle_types[].vehicle_type_id ID Obligatoire Identifiant unique pour un type de véhicule donné.
vehicle_types[].form_factor Enum Obligatoire Énumération représentant le facteur de forme générale du véhicule à partir de la liste suivante de valeurs actuellement valides :
  • bicycle
  • scooter
  • other
vehicle_types[].propulsion_type Enum Obligatoire Énumération représentant le type de propulsion principal du véhicule, à partir de la liste suivante de valeurs actuellement valides :
  • human: pédale ou propulsion des pieds
  • electric_assist: n'alimente que la propulsion humaine
  • electric : contient un mode de limitation avec un moteur sur batterie
  • combustion: contient le mode de limitation avec un moteur à gaz
vehicle_types[].max_range_meters Flottant non négatif Conditionally required 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 qu'il soit nécessaire de le recharger ou de le recharger, lorsqu'il est complètement alimenté ou complètement chargé.

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 console)

Reportez-vous à la spécification GBFS si nécessaire.

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

Field name Type Obligatoire/Facultatif Description
plans Array Obligatoire Tableau d'objets dans lequel 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 Facultative URL qui redirige les utilisateurs finaux vers plus d'informations sur le forfait.
plans[].currency String Obligatoire Norme ISO 4217 pour le forfait.
plans[].price Flottant non négatif Obligatoire

Le forfait doit être défini comme un forfait sans note ou un tarif préférentiel:

Forfait sans note

Ce forfait est à tarif fixe.

Définissez le champ suivant:

  • price : prix fixe du séjour complet.
Forfait tarifaire

Ce forfait correspond à un tarif linéaire par morceaux.

Définissez le champ suivant:

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

Définissez l'un des champs suivants ou les deux:

  • per_km_pricing:prix du trajet spécifié au tarif au kilomètre.
  • per_min_pricing:prix du voyage spécifié au tarif à la minute.
plans[].per_km_pricing Array Conditionally required

Si le prix est fonction de la distance parcourue, exprimé en kilomètres, ce champ est obligatoire.

Tableau d'objets dans lequel chaque objet définit un segment de distance donné. La valeur start de chaque segment doit être inférieure ou égale à la valeur start du segment suivant.

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

Si ce champ n'est pas défini, il n'y a pas de prix variable basé sur 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 auxquels le tarif du segment commence à être facturé. Ce champ est défini sur la valeur inclusive qui démarre la plage du segment. Ainsi, une fois le nombre de kilomètres écoulé, rate est facturé une fois.
plans[].per_km_pricing[].rate Nombre décimal Obligatoire Tarif facturé pour chaque interval, qui commence à la valeur start incluse du segment. Si ce champ est défini sur un nombre négatif, le voyageur reçoit une remise.
plans[].per_km_pricing[].interval Entier non négatif Obligatoire

Intervalle en kilomètres auquel la valeur rate du segment est réappliquée indéfiniment, sauf si le paramètre 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 aucun arrondi de la distance 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 (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 Facultative

Nombre de kilomètres auquel la valeur rate du segment n'est plus appliquée. Ce champ est défini sur la valeur exclusive qui termine 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 champ rate du segment est facturé jusqu'à la fin du trajet, en plus des segments supplémentaires qui le suivent.

plans[].per_min_pricing Array Conditionally required

Si le prix est fonction du temps écoulé, il est affiché en minutes, ce champ est obligatoire.

Tableau d'objets dans lequel chaque objet définit un segment de temps donné. La valeur start de chaque segment doit être inférieure ou égale à la valeur start du segment suivant.

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

Si ce champ n'est pas défini, aucun prix variable basé sur le temps n'est inclus dans le prix total.

plans[].per_min_pricing[].start Nombre décimal Obligatoire Nombre de minutes auxquelles le tarif du segment commence à être facturé. Ce champ est défini sur la valeur inclusive qui démarre la plage du segment. Ainsi, une fois le nombre défini de minutes écoulé, l'abonnement rate est facturé une fois.
plans[].per_min_pricing[].rate Nombre décimal Obligatoire Tarif facturé pour chaque interval. Le tarif commence à l'start inclus du segment. Si ce champ est défini sur un nombre négatif, le voyageur reçoit 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 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 (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 Facultative

Durée, en minutes, à laquelle le rate du segment n'est plus appliqué. Ce champ est défini sur la valeur exclusive qui termine la plage du segment. Par exemple, si end est défini sur 20, la valeur rate ne s'applique plus à 20 minutes.

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

Exemples pour system_pricing_plans.json

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

Exemple 1 pour system_pricing_plans.json

L'exemple de code de forfait suivant indique les frais en fonction du temps de trajet pour les intervalles suivants:

  • [0,1] : 2 €
    • Si le trajet dure moins d'une minute, l'utilisateur paie 2 USD.
    • Exemple: trajet de 59 s
  • [1,2): 3 USD
    • Si le trajet est plus long ou égal à une minute, mais moins de deux minutes, l'utilisateur paie 2 $+ 1 $= 3 $.
    • Exemples: trajet d'une minute ; trajet d'une minute de 45 secondes
  • x minutes où x est supérieur ou égal à 2 : 3 € + ((2 € + 1 €) * (x - 2 + 1) USD
    • Si le trajet dure moins de deux minutes ou est égal à deux minutes, l'utilisateur paie 3 $pour la partie du trajet moins de deux minutes et (1 $ [poursuite de la première entrée de la liste per_min_pricing] + 2 $ [deuxième entrée de la liste per_min_pricing]) pour chaque minute après et toutes les deux minutes.
    • Exemples :
      • Tarif de 2 min pour 3 $+ (2 $ + 1 $) = 6 $
      • Trajet de 3 minutes : 2 min, coût : 3 $+ (2 $ + 1 $) = 6 $
      • Tarif de 3 min pour 3 $+ ((2 $ + 1 $) * 2) = 9 $
      • Coût du trajet de 10 minutes : + 3 € ((2 € + 1 €) x 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 dont le tarif est calculé à la fois en minutes et en kilomètres:

  • Plus précisément, l'utilisateur final est facturé 0,25 CAD par km 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 de 10 minutes coûte 9 CAD. Les coûts sont répartis comme suit :
    • 3 $, prix de base
    • 0,25 € * 2, facturé une fois au début du trajet et une fois au niveau du repère de 1 km.
    • 0,5 € x 11, facturé une fois au début de chaque minute. Les frais commencent à 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 ancré et sans station)

Reportez-vous à la spécification GBFS si nécessaire.

Ce flux définit les données de géorepérage des véhicules autonomes. Les données de géorepérage incluent les limites géographiques indiquant où les véhicules sont autorisés à commencer et à terminer la course, ainsi que la vitesse à laquelle les véhicules peuvent circuler. Il s'agit soit de la vitesse maximale du véhicule, soit de la limitation de vitesse de la route sur laquelle le véhicule est situé, selon la valeur la plus basse. Les conducteurs doivent respecter les lois et règlements locaux.

Nous utilisons ces données afin que, lorsqu'un utilisateur recherche un itinéraire donné, si la fin du trajet ne se trouve pas dans les zones de géorepérage spécifiques, le résultat Micrimobility soit filtré. Si les zones de géorepérage ne sont pas fournies, Google traite ce service comme s'il n'était soumis à aucune limite.

Field name Type Obligatoire/Facultatif Description
geofencing_zones Objet Obligatoire Un objet FeatureCollection, comme décrit dans la RFC 7946 de l'IETF, est un objet doté d'un champ nommé features. La valeur de features est un tableau JSON. Chaque élément du tableau JSON est un objet Feature.

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

geofencing_zones.type String Obligatoire Définissez la valeur sur FeatureCollection, comme décrit dans la RFC 7946 de l'IETF.
geofencing_zones.features Array Obligatoire Un tableau JSON, où chaque élément du tableau JSON est un objet Feature.
geofencing_zones.features[].type String Obligatoire Définissez la valeur sur Feature, comme décrit dans la RFC 7946 de l'IETF.
geofencing_zones.features[].geometry Multipolygone GeoJSON Obligatoire Multipolygon GeoJSON qui indique où les courses ne peuvent pas commencer, se terminer et se terminer, en plus d'autres limites. La disposition des points dans le sens des aiguilles d'une montre définit la zone entourée par le polygone, tandis qu'un ordre inverse des aiguilles d'une montre définit la zone en dehors du polygone. Pour plus d'informations à ce sujet, reportez-vous à la règle de droite.
geofencing_zones.features[].properties Objet Obligatoire Objet qui définit les remises et les limites applicables aux déplacements.
geofencing_zones.features[].properties.rules Array Facultative Tableau d'objets, dans lequel chaque objet définit une seule règle. En cas de chevauchement, de conflit ou d'autres conflits d'une manière ou d'une autre, la règle définie dans l'ordre du fichier JSON est prioritaire.
geofencing_zones.features[].properties.rules[].vehicle_type_id Array Facultative Tableau des ID de types de véhicules, où chaque élément correspond à un vehicle_type_id, pour lesquels des restrictions doivent être appliquées. Si aucun vehicle_type_id n'est spécifié, les restrictions s'appliquent à tous les types de véhicules.
geofencing_zones.features[].properties.rules[].ride_allowed Booléen Obligatoire Si la sortie du vélo"détachée"peut commencer et se terminer dans la zone, comme suit :
  • Si le trajet à vélo peut commencer et se terminer dans la zone, définissez la valeur sur true.
  • Si la sortie du vélo ne peut pas commencer et 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 ancré)

Reportez-vous à la spécification GBFS si nécessaire.

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

Field name Type Obligatoire/Facultatif Description
stations Array Obligatoire Tableau d'objets dans lequel chaque objet définit une et une seule station.
stations[].station_id String Obligatoire Identifiant de la station.
stations[].name String Obligatoire Nom public de la station dans la langue locale de la ville où elle se trouve. L'élément name doit respecter les attributs utilisés sur les panneaux de la station, le cas échéant. Il doit également refléter l'emplacement de la station à l'aide d'un croisement ou d'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 les panneaux de signalisation. name doit également respecter les conventions locales d'utilisation des majuscules et des noms des lieux, et non tout 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 Facultative Entier non négatif représentant le nombre total de points d'ancrage installés à la station, à la fois disponibles et indisponibles.
stations[].rental_uris Objet Obligatoire

Objet JSON contenant des 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 définis lors de l'intégration du fournisseur.

stations[].rental_uris.android URI Conditionally required

Un URI qui peut être transmis à une application Android avec un intent Android android.intent.action.VIEW pour accepter les liens profonds Android. L'élément rental_uris fourni doit être Android App Links. Ainsi, l'application de visualisation n'a pas besoin de gérer manuellement la redirection de l'utilisateur vers la plate-forme de téléchargement 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 incluant des informations pour plusieurs stations. Le lien profond doit rediriger l'utilisateur directement vers la station sans 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 obligatoires pour inclure l'identifiant station_id de la station, à condition que le partenaire dispose d'autres moyens d'identifier la station correspondante. 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 propose une application de location Android.

Exemple de liens vers une application Android:

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

stations[].rental_uris.ios URI Conditionally required

URI qui peut être utilisé sur iOS pour lancer l'application de location pour la station. Pour en savoir plus à ce sujet, consultez l'article d'Apple sur les schémas d'URL personnalisés iOS. Le rental_uris fourni doit être un lien universel iOS. Ainsi, l'application de visualisation n'a pas besoin de gérer manuellement la redirection de l'utilisateur vers la plate-forme de téléchargement 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 incluant des informations pour plusieurs stations. Le lien profond doit rediriger l'utilisateur directement vers la station sans 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 doivent pas nécessairement inclure le station_id de la station. 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 propose une application de location iOS.

Exemple de liens universels iOS:

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

stations[].rental_uris.web URL Facultative

URL permettant à un navigateur Web d'afficher plus d'informations sur la location d'un véhicule à cette station.

Cette URL doit correspondre à un lien profond propre à la station. Il ne doit pas s'agir d'une page de location générale incluant des informations pour plusieurs stations. Le lien profond doit rediriger l'utilisateur directement vers la station sans 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 URL ne doivent pas nécessairement inclure le station_id pour la station ni 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 qui identifient la station de manière unique.

Si ce champ n'est pas défini, les liens profonds ne sont pas acceptés par 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 ancré)

Reportez-vous à la spécification GBFS si nécessaire.

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

Field name Type Obligatoire/Facultatif Description
stations Array Obligatoire Tableau d'objets, dans lequel chaque objet définit une seule station.
stations[].station_id String 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 disponibles physiquement à la station et pouvant être loués.

Pour déterminer si la station loue actuellement des vélos, vous devez inspecter le champ is_renting et rechercher une valeur booléenne réelle.

stations[].vehicle_types_available Array Facultative

Tableau d'objets qui définit le nombre total de véhicules, classés par type de véhicule 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 pour chacun de ces objets doit être égal à la valeur spécifiée dans le champ num_bikes_available.

stations[].vehicle_types_available[].vehicle_type_id ID Obligatoire

vehicle_type_id de chaque type de véhicule disponible à la station, comme décrit dans le fichier 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 le fichier vehicle_types.json.

stations[].num_docks_available Entier non négatif Conditionally required

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

Entier non négatif qui représente le nombre total de stations fonctionnelles qui se trouvent physiquement à la station et sont en mesure d'accepter les retours de véhicules.

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

stations[].is_installed Booléen Obligatoire

Booléen indiquant si la station se trouve actuellement dans la rue et qu'elle est installée.

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

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

stations[].is_renting Booléen Obligatoire

Booléen indiquant si la station loue actuellement des vélos.

Si la station loue actuellement des vélos, définissez-la sur true. Même si la station est vide, is_renting doit être défini sur true pour autoriser les locations.

Si la station ne loue pas de vélos, sélectionnez false.

stations[].is_returning Booléen Obligatoire

Booléen indiquant si la station accepte actuellement les retours de vélo.

Si la station accepte actuellement les retours à vélo, définissez la valeur sur true. Même si la station est pleine, mais qu'elle autorise un retour en cas d'échec, la valeur is_returning est définie sur true.

Si la station n'accepte pas les retours de vélo, définissez-la sur false.

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