Definisi GBFS

Sebelum melanjutkan bagian ini, jika Anda belum melakukannya, verifikasi sistem mobilitas mikro yang didukung yang Anda buat feed-nya.

Di bagian berikut, setiap header memiliki format berikut: Required|Optional|Conditionally required: Feed name (System supported). Sistem berikut didukung:

  • Sistem yang terpasang ke dok
  • Sistem tanpa dok
  • Sistem dengan dan tanpa stasiun

Agar berhasil terintegrasi dengan Google, berikan hanya file yang diperlukan untuk sistem yang dijelaskan feed Anda, dan tentukan kolom wajib diisi yang disertakan dalam bagian yang relevan. Untuk kolom yang wajib bersyarat, lihat deskripsi kolom untuk mendapatkan panduan. Anda juga dapat menentukan kolom opsional yang menambahkan informasi dan memberikan pengalaman pengguna yang lebih baik.

Header yang diperlukan untuk feed Micromobility

Feed mobilitas mikro adalah feed yang berisi data terstruktur Mobilitas mikro berdok atau tanpa dok seperti yang ditentukan dalam artikel ini.

Semua feed harus selalu menentukan kolom yang disertakan dalam tabel berikut di tingkat teratas objek JSON, yang secara kolektif dikenal sebagai header GBFS umum.

Nama kolom Jenis Persyaratan Deskripsi
last_updated Stempel waktu Wajib Stempel waktu POSIX, yang menentukan jumlah detik sejak 1 Januari 1970 00.00.00 UTC.

Disetel ke waktu terakhir kali data di feed diperbarui.

ttl Bilangan bulat non-negatif Wajib Bilangan bulat non-negatif yang menunjukkan jumlah detik yang tersisa hingga saatnya memperbarui feed.

Jika data harus diupdate pada kecepatan konstan, tetapkan nilai ini ke 0.

data JSON Wajib JSON yang berisi kolom data untuk setiap feed.

Misalnya, feed free_bike_status.json gabungan yang menentukan header GBFS umum, mungkin seperti berikut:

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

Wajib: system_information.json (Sistem terpasang ke dok dan tidak terpasang ke dok)

Lihat spesifikasi GBFS jika diperlukan.

Feed ini memberikan detail terkait operator sistem.

Nama kolom Jenis Persyaratan Deskripsi
system_id ID Wajib ID unik global untuk sistem berbagi kendaraan. Nilai ini dimaksudkan untuk tetap sama selama masa pakai sistem. Setiap sistem atau area geografis berbeda tempat kendaraan beroperasi HARUS memiliki system_id sendiri. ID sistem HARUS dapat dikenali sebagai milik sistem tertentu, bukan string acak - misalnya, bcycle_austin atau biketown_pdx.
name String Wajib Nama sistem, yang ditampilkan kepada pelanggan.
rental_apps Objek Wajib Objek JSON yang berisi informasi aplikasi penyewaan untuk Android dan iOS di kolom masing-masing.
rental_apps.android Objek Wajib bersyarat Berisi informasi download aplikasi rental dan penemuan aplikasi untuk platform Android di kolom store_uri dan discovery_uri. Jika penyedia sistem memiliki aplikasi rental Android, kolom ini wajib diisi.
rental_apps.android.store_uri URI Wajib URI tempat aplikasi Android sewaan dapat didownload. Ini biasanya merupakan URI ke app store seperti Google Play. Jika URI mengarah ke app store seperti Google Play, sebaiknya URI mengikuti praktik terbaik Android sehingga aplikasi penayangan dapat langsung membuka URI ke aplikasi app store native , bukan situs.
rental_apps.android.discovery_uri URI Wajib URI yang memiliki bentuk your_custom_scheme://your/path/here. URI dapat digunakan oleh PackageManager.queryIntentActivities() untuk mengetahui apakah aplikasi Android rental diinstal di perangkat.
rental_apps.ios Objek Wajib bersyarat Berisi informasi download aplikasi rental dan penemuan aplikasi untuk platform iOS di kolom store_uri dan discovery_uri. Jika penyedia sistem memiliki aplikasi sewa iOS, kolom ini wajib diisi.
rental_apps.ios.store_uri URI Wajib URI tempat aplikasi iOS rental dapat didownload. Ini biasanya berupa URI ke app store seperti Apple App Store. Jika URI mengarah ke app store seperti Apple App Store, sebaiknya URI mengikuti praktik terbaik iOS sehingga aplikasi penayangan dapat langsung membuka URI ke aplikasi app store native, bukan situs.
rental_apps.ios.discovery_uri URI Wajib URI yang memiliki bentuk your_custom_scheme://. URI dapat digunakan oleh UIApplication canOpenURL: untuk mengetahui apakah aplikasi iOS rental diinstal di perangkat.

Wajib: free_bike_status.json (Sistem tanpa dok)

Lihat spesifikasi GBFS jika diperlukan.

Feed ini menentukan lokasi dan atribut untuk kendaraan yang tersedia dan berdiri sendiri. Untuk alasan privasi, kendaraan yang merupakan bagian dari penyewaan aktif tidak boleh muncul di feed ini.

Nama kolom Jenis Persyaratan Deskripsi
bikes Array Wajib Array sepeda yang saat ini tersedia dan dihentikan, dengan setiap sepeda adalah objek.
bikes[].bike_id ID Wajib ID sepeda.

Untuk melindungi privasi, ID dapat diubah menjadi string acak setelah setiap perjalanan.

bikes[].lat Lintang Wajib Lintang WGS 84 sepeda, dalam format derajat desimal.
bikes[].lon Bujur Wajib Bujur WGS 84 sepeda, dalam format derajat desimal.
bikes[].is_reserved Boolean Wajib Apakah sepeda saat ini dipesan, sebagai berikut:
  • Jika sepeda saat ini dipesan, setel ke true.
  • Jika sepeda saat ini tidak dipesan, setel ke false.
bikes[].is_disabled Boolean Wajib Apakah sepeda saat ini dinonaktifkan atau rusak, sebagai berikut:
  • Jika sepeda saat ini dinonaktifkan, setel ke true.
  • Jika sepeda saat ini tidak dinonaktifkan, setel ke false.
bikes[].rental_uris Objek Wajib Objek JSON yang berisi URI sewa untuk Android, iOS, dan web di kolom masing-masing.
bikes[].rental_uris.android URI Wajib bersyarat URI yang dapat diteruskan ke aplikasi Android dengan intent Android android.intent.action.VIEW untuk mendukung Deep Link Android. rental_uris yang diberikan harus berupa Link Aplikasi Android sehingga aplikasi penayangan tidak perlu mengelola pengalihan pengguna ke app store secara manual jika pengguna tidak menginstal aplikasi penyedia.

URI ini harus berupa deep link khusus untuk setiap sepeda, bukan halaman penyewaan umum yang menyertakan informasi untuk lebih dari satu sepeda. Deep link harus mengarahkan pengguna langsung ke sepeda tanpa konfirmasi, halaman interstisial, atau login. Pastikan pengguna dapat melihat sepeda, meskipun mereka belum pernah membuka aplikasi.

URI tidak harus menyertakan bike_id untuk sepeda, asalkan partner memiliki cara lain untuk mengidentifikasi sepeda yang bersangkutan. Misalnya, aplikasi penyewaan dapat menggunakan ID lain dalam URI untuk mengidentifikasi sepeda secara unik.

Jika partner memiliki aplikasi penyewaan Android, kolom ini wajib diisi.

Contoh Link Aplikasi Android:

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

bikes[].rental_uris.ios URI Wajib bersyarat URI yang dapat digunakan di iOS untuk meluncurkan aplikasi penyewaan sepeda. Untuk mengetahui informasi selengkapnya tentang hal ini, lihat artikel Apple tentang skema URL kustom iOS. rental_uris yang diberikan harus berupa Link Universal iOS sehingga aplikasi penayangan tidak perlu mengelola pengalihan pengguna ke app store secara manual jika pengguna tidak menginstal aplikasi penyedia.

URI ini harus berupa deep link khusus untuk setiap sepeda, bukan halaman penyewaan umum yang menyertakan informasi untuk lebih dari satu sepeda. Deep link harus mengarahkan pengguna langsung ke sepeda tanpa konfirmasi, halaman interstisial, atau login. Pastikan pengguna dapat melihat sepeda, meskipun mereka belum pernah membuka aplikasi.

URI tidak harus menyertakan bike_id untuk sepeda, asalkan partner memiliki cara lain untuk mengidentifikasi sepeda yang bersangkutan. Misalnya, aplikasi penyewaan dapat menggunakan ID lain dalam URI untuk mengidentifikasi sepeda secara unik.

Jika partner memiliki aplikasi rental iOS, kolom ini wajib diisi.

Contoh Link Universal iOS:

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

bikes[].rental_uris.web URL Opsional

URL yang dapat digunakan oleh browser web untuk menampilkan informasi selengkapnya tentang penyewaan kendaraan di lokasi ini.

URL ini harus berupa deep link khusus untuk setiap sepeda, bukan halaman penyewaan umum yang menyertakan informasi untuk lebih dari satu sepeda. Deep link harus mengarahkan pengguna langsung ke sepeda tanpa konfirmasi, halaman interstisial, atau login. Pastikan pengguna dapat melihat sepeda, meskipun mereka belum pernah membuka aplikasi.

URL tidak harus menyertakan bike_id untuk sepeda atau mengikuti konvensi semantik URL penyewaan untuk Android atau iOS. Aplikasi penyewaan dapat menggunakan ID lain dalam URL yang secara unik mengidentifikasi sepeda.

Jika kolom ini tidak disetel, berarti deep link tidak didukung untuk browser web.

Nilai contoh:

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

bikes[].vehicle_type_id ID Wajib vehicle_type_id kendaraan seperti yang dijelaskan di bagian vehicle_types.json.
bikes[].pricing_plan_id ID Wajib ID paket harga yang diterapkan saat jenis kendaraan ini disewa seperti yang dijelaskan di bagian system_pricing_plans.json.
bikes[].current_range_meters Bilangan mengambang non-negatif Wajib bersyarat Jika definisi vehicle_type yang sesuai dengan kendaraan memiliki motor, kolom ini wajib diisi.

Disetel ke jarak terjauh dalam meter yang dapat ditempuh kendaraan tanpa perlu mengisi ulang daya atau bahan bakar, mengingat tingkat pengisian daya atau bahan bakar kendaraan saat ini.

bikes[].last_reported Stempel waktu Opsional Disetel ke waktu terakhir kali kendaraan melaporkan statusnya ke backend operator.

Berikut adalah contoh untuk 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
}
]

Wajib: vehicle_types.json (Sistem dengan dok dan tanpa dok)

Lihat spesifikasi GBFS jika diperlukan.

Feed ini menentukan detail setiap jenis kendaraan, seperti yang dirujuk di bagian free_bike_status.json.

Nama kolom Jenis Persyaratan Deskripsi
vehicle_types Array Wajib Array objek, dengan setiap objek menentukan jenis kendaraan yang berbeda dalam katalog penyedia. Hanya boleh ada satu objek untuk jenis kendaraan tertentu.
vehicle_types[].vehicle_type_id ID Wajib ID unik untuk jenis kendaraan tertentu.
vehicle_types[].form_factor Enum Wajib Enum yang mewakili faktor bentuk umum kendaraan, dari daftar nilai yang saat ini valid berikut:
  • bicycle
  • scooter
  • other
vehicle_types[].propulsion_type Enum Wajib Enum yang merepresentasikan jenis propulsi utama kendaraan, dari daftar nilai yang saat ini valid berikut:
  • human: Penggerak pedal atau kaki
  • electric_assist: Hanya menyediakan daya bersama dengan propulsi manusia
  • electric: Berisi mode throttle dengan motor bertenaga baterai
  • combustion: Berisi mode throttle dengan motor bertenaga mesin bensin
vehicle_types[].max_range_meters Bilangan mengambang non-negatif Wajib bersyarat Jika propulsion_type tidak disetel ke human, maka kendaraan memiliki motor, sehingga kolom ini wajib diisi.

Disetel ke jarak terjauh dalam meter yang dapat ditempuh kendaraan tanpa perlu mengisi ulang daya atau bahan bakar, saat kendaraan terisi penuh daya atau bahan bakar.

Berikut adalah contoh untuk 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
  }
]

Wajib: system_pricing_plans.json (Sistem tanpa stasiun pengisian daya)

Lihat spesifikasi GBFS jika diperlukan.

Feed ini menentukan paket harga untuk kendaraan yang berdiri sendiri. Kami mewajibkan penyedia menampilkan informasi harga untuk kendaraan yang berdiri sendiri.

Nama kolom Jenis Persyaratan Deskripsi
plans Array Wajib Array objek yang setiap objeknya menentukan paket harga tertentu.
plans[].plan_id ID Wajib String yang merepresentasikan ID unik untuk paket harga tertentu yang ditawarkan penyedia.
plans[].url URL Opsional URL yang mengarahkan pengguna akhir ke informasi selengkapnya tentang paket harga.
plans[].currency String Wajib Standar ISO 4217 untuk paket harga.
plans[].price Bilangan mengambang non-negatif Wajib

Paket harga harus ditentukan sebagai paket harga tanpa tarif atau paket harga dengan tarif:

Paket harga tanpa rating

Paket ini adalah tarif tunggal tetap.

Tetapkan kolom berikut:

  • price: Harga tetap untuk seluruh perjalanan.
Paket harga yang dinilai

Paket ini adalah harga tarif linear sepotong demi sepotong.

Tetapkan kolom berikut:

  • price: Harga dasar, yang ditagih tepat satu kali per perjalanan.

Tetapkan salah satu atau kedua kolom berikut:

  • per_km_pricing: Harga perjalanan yang ditentukan berdasarkan tarif per kilometer.
  • per_min_pricing: Harga perjalanan yang ditentukan berdasarkan tarif per menit.
plans[].per_km_pricing Array Wajib bersyarat

Jika harga adalah fungsi dari jarak yang ditempuh, ditampilkan dalam kilometer, kolom ini wajib diisi.

Array objek yang setiap objeknya menentukan segmen yang dibagi berdasarkan jarak tertentu. Nilai start setiap segmen harus kurang dari atau sama dengan nilai start segmen berikutnya.

Untuk menentukan harga total paket yang diberikan, tambahkan nilai plans[].price paket yang diberikan ke harga yang terakumulasi untuk segmen di plans[].per_km_pricing dan plans[].per_min_pricing.

Jika kolom ini tidak ditetapkan, tidak ada harga variabel berdasarkan jarak dan oleh karena itu, tidak ada yang disertakan sebagai bagian dari total harga.

plans[].per_km_pricing[].start Bilangan bulat non-negatif Wajib Jumlah kilometer saat tarif segmen mulai ditagih. Kolom ini ditetapkan ke nilai inklusif yang memulai rentang segmen. Jadi, setelah jumlah kilometer ditempuh, rate ditagih satu kali.
plans[].per_km_pricing[].rate Float Wajib Tarif yang dikenakan untuk setiap interval, yang dimulai pada start inklusif segmen. Jika kolom ini ditetapkan ke angka negatif, pelancong akan menerima diskon.
plans[].per_km_pricing[].interval Bilangan bulat non-negatif Wajib

Interval dalam kilometer saat rate segmen diterapkan kembali tanpa batas kecuali jika end segmen disetel ke bilangan bulat non-negatif.

rate diterapkan kembali sekali di awal setiap interval dan tidak ada pembulatan jarak yang dipertimbangkan.

Jika end segmen ditetapkan ke bilangan bulat non-negatif, rate segmen akan diterapkan kembali hingga, tetapi tidak termasuk, nilai end segmen.

Jika kolom ini ditetapkan ke 0, rate akan ditagih tepat satu kali pada start segmen.

plans[].per_km_pricing[].end Bilangan bulat non-negatif Opsional

Jumlah kilometer saat rate untuk segmen tidak lagi diterapkan. Kolom ini ditetapkan ke nilai eksklusif yang mengakhiri rentang segmen. Misalnya, jika end disetel ke 40, rate tidak lagi berlaku pada 40 kilometer.

Jika kolom ini tidak disetel atau kosong, rate untuk segmen akan ditagih hingga perjalanan berakhir, selain segmen tambahan yang mengikutinya.

plans[].per_min_pricing Array Wajib bersyarat

Jika harga adalah fungsi dari waktu yang berlalu, ditampilkan dalam menit, maka kolom ini wajib diisi.

Array objek yang setiap objeknya menentukan segmen yang dibagi menurut waktu tertentu. Nilai start setiap segmen harus kurang dari atau sama dengan nilai start segmen berikutnya.

Untuk menentukan harga total paket yang diberikan, tambahkan nilai plans[].price paket yang diberikan ke harga yang terakumulasi untuk segmen di plans[].per_km_pricing dan plans[].per_min_pricing.

Jika kolom ini tidak ditetapkan, tidak ada harga variabel berdasarkan waktu dan oleh karena itu, tidak ada harga yang disertakan sebagai bagian dari total harga.

plans[].per_min_pricing[].start Float Wajib Jumlah menit saat tarif segmen mulai ditagih. Kolom ini ditetapkan ke nilai inklusif yang memulai rentang segmen. Oleh karena itu, setelah jumlah menit yang ditetapkan berlalu, rate akan ditagih satu kali.
plans[].per_min_pricing[].rate Float Wajib Tarif yang dikenakan untuk setiap interval. Tarif dimulai pada start inklusif segmen. Jika kolom ini ditetapkan ke angka negatif, pelancong akan menerima diskon.
plans[].per_min_pricing[].interval Bilangan bulat non-negatif Wajib

Interval dalam menit saat rate segmen diterapkan kembali tanpa batas, kecuali jika end segmen ditetapkan ke bilangan bulat non-negatif.

rate diterapkan kembali satu kali di awal setiap interval dan tidak ada pembulatan waktu perjalanan yang dipertimbangkan.

Jika end segmen ditetapkan ke bilangan bulat non-negatif, rate segmen akan diterapkan kembali hingga, tetapi tidak termasuk, nilai end segmen.

Jika kolom ini ditetapkan ke 0, rate akan ditagih tepat satu kali pada start segmen.

plans[].per_min_pricing[].end Bilangan bulat non-negatif Opsional

Jumlah menit saat rate untuk segmen tidak lagi diterapkan. Kolom ini ditetapkan ke nilai eksklusif yang mengakhiri rentang segmen. Misalnya, jika end disetel ke 20, rate tidak lagi berlaku pada 20 menit.

Jika kolom ini tidak disetel atau kosong, rate untuk segmen akan ditagih hingga perjalanan berakhir, selain segmen tambahan yang mengikutinya.

Contoh untuk system_pricing_plans.json

Bagian ini memberikan contoh kode system_pricing_plans.json yang informatif. Detail dan hasil yang relevan dari setiap contoh juga diberikan.

Contoh 1 untuk system_pricing_plans.json

Contoh kode paket harga berikut menunjukkan biaya berdasarkan waktu perjalanan untuk interval berikut:

  • [0,1): $2 USD
    • Jika durasi perjalanan kurang dari satu menit, pengguna membayar $2 USD.
    • Contoh: Perjalanan 59 detik
  • [1,2): $3 USD
    • Jika durasi perjalanan sama dengan atau lebih dari satu menit, tetapi kurang dari dua menit, pengguna membayar $2 + $1 = $3 USD.
    • Contoh: perjalanan 1 menit; perjalanan 1 menit 45 detik
  • x jumlah menit dengan x lebih besar dari atau sama dengan 2: $3 + (($2 + $1) * (x - 2 + 1)) USD
    • Jika durasi perjalanan lebih lama atau sama dengan dua menit, pengguna membayar $3 untuk bagian perjalanan yang kurang dari dua menit dan ($1 [melanjutkan dari entri pertama daftarper_min_pricing] + $2 [entri kedua daftar per_min_pricing]) untuk setiap menit setelah dan termasuk dua menit.
    • Contoh:
      • Biaya perjalanan 2 menit adalah $3 + ($2 + $1) = $6 USD
      • Biaya perjalanan 2 menit 30 detik adalah $3 + ($2 + $1) = $6 USD
      • Perjalanan 3 menit dikenai biaya Rp30.000 + (($20.000 + Rp10.000) * 2) = Rp90.000
      • Perjalanan 10 menit dikenai biaya Rp30.000 + (($20.000 + Rp10.000) * 9) = Rp300.000
{
  "plans": {
    "plan_id": "plan1",
    "currency": "USD",
    "price": 2,
    "per_min_pricing": [
      {
          "interval": 1,
          "rate": 1,
          "start": 1
      },
      {
          "interval": 1,
          "rate": 2,
          "start": 2
      }
    ],
  }
}

Contoh 2 untuk system_pricing_plans.json

Dalam contoh ini, kami menunjukkan contoh kode untuk paket harga yang dikenai biaya berdasarkan tarif menit dan kilometer:

  • Secara khusus, pengguna akhir dikenai biaya $0,25 CAD per km serta $0,50 CAD per menit.
  • Kedua rasio ini terjadi secara bersamaan dan tidak saling bergantung.
  • Oleh karena itu, perjalanan satu kilometer yang berlangsung selama 10 menit akan dikenai biaya sebesar $9 CAD. Perincian biayanya adalah sebagai berikut:
    • $3, harga dasar
    • $0,25 * 2, ditagih satu kali di awal perjalanan dan satu kali di tanda 1 km.
    • $0,5 * 11, ditagih sekali di awal setiap menit. Tagihan dimulai pada 0 detik, dengan interval terakhir ditagih pada 10 menit.
{
  "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
    }]
  }
}

Wajib bersyarat: geofencing_zones.json (Sistem dengan stasiun pengisian daya dan tanpa stasiun pengisian daya)

Lihat spesifikasi GBFS jika diperlukan.

Feed ini menentukan data geofencing untuk kendaraan mandiri. Data pembatasan wilayah mencakup batas geografis yang menentukan tempat kendaraan diizinkan untuk memulai dan mengakhiri perjalanan, beserta kecepatan yang dapat ditempuh kendaraan. Kecepatan ini adalah kecepatan maksimum kendaraan atau batas kecepatan jalan yang dilalui kendaraan, mana saja yang lebih rendah. Pengemudi harus mematuhi hukum dan peraturan setempat.

Kami menggunakan data ini sehingga saat pengguna menelusuri rute tertentu, jika akhir perjalanan berada di luar geofence tertentu, hasil Mikromobilitas akan dikecualikan. Jika pembatasan wilayah tidak diberikan, Google akan memperlakukan layanan seolah-olah tidak memiliki batasan wilayah.

Nama kolom Jenis Persyaratan Deskripsi
geofencing_zones Objek Wajib Objek FeatureCollection sebagaimana dijelaskan oleh IETF RFC 7946 adalah objek yang memiliki kolom, bernama features. Nilai features adalah array JSON. Setiap elemen array JSON adalah objek Feature.

Setiap zona yang dibatasi secara geografis, aturan dan atribut terkait, serta definisi FeatureCollection ditentukan di sini sebagai bagian dari definisi feed geofencing_zones.json.

geofencing_zones.type String Wajib Tetapkan ke FeatureCollection seperti yang dijelaskan oleh IETF RFC 7946.
geofencing_zones.features Array Wajib Array JSON, dengan setiap elemen array JSON adalah objek Feature.
geofencing_zones.features[].type String Wajib Tetapkan ke Feature seperti yang dijelaskan oleh IETF RFC 7946.
geofencing_zones.features[].geometry Multipoligon GeoJSON Wajib Multipoligon GeoJSON yang menjelaskan tempat perjalanan tidak dapat dimulai, berakhir, dilalui, selain batasan lainnya. Susunan titik searah jarum jam menentukan area yang dilingkupi poligon, sedangkan urutan berlawanan arah jarum jam menentukan area di luar poligon. Untuk mengetahui informasi selengkapnya tentang hal ini, lihat aturan tangan kanan.
geofencing_zones.features[].properties Objek Wajib Objek yang menentukan tunjangan dan batasan perjalanan.
geofencing_zones.features[].properties.rules Array Opsional Array objek, di mana setiap objek menentukan satu dan hanya satu aturan. Jika dua aturan atau lebih tumpang-tindih, bertabrakan, atau bertentangan dengan cara tertentu, aturan yang ditentukan paling awal dalam urutan file JSON akan diprioritaskan.
geofencing_zones.features[].properties.rules[].vehicle_type_id Array Opsional Array ID jenis kendaraan, dengan setiap elemen adalah vehicle_type_id, yang pembatasannya harus diterapkan. Jika tidak ada vehicle_type_id yang ditentukan, maka batasan berlaku untuk semua jenis kendaraan.
geofencing_zones.features[].properties.rules[].ride_allowed Boolean Wajib Apakah perjalanan bersepeda "tanpa dok" yang berdiri bebas dapat dimulai dan diakhiri di zona, sebagai berikut:
  • Jika perjalanan sepeda tanpa dok dapat dimulai dan diakhiri di zona, setel ke true.
  • Jika perjalanan sepeda tanpa docking tidak dapat dimulai dan diakhiri di zona, setel ke false.

Berikut adalah contoh untuk 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]
      ]]]
    }
  }]
}

Wajib: station_information.json (Sistem yang terpasang)

Lihat spesifikasi GBFS jika diperlukan.

Feed ini menentukan informasi umum tentang stasiun berbagi sepeda publik.

Nama kolom Jenis Persyaratan Deskripsi
stations Array Wajib Array objek yang setiap objeknya menentukan satu dan hanya satu stasiun.
stations[].station_id String Wajib ID stasiun.
stations[].name String Wajib Nama publik stasiun dalam bahasa lokal kota tempat stasiun berada. name harus sesuai dengan yang digunakan pada papan penunjuk di stasiun, jika tersedia, atau harus mencerminkan lokasi stasiun melalui penggunaan jalan lintas atau landmark lokal. Jangan gunakan singkatan seperti "Jl." untuk "Jalan", kecuali jika digunakan secara eksplisit dalam papan penunjuk jalan, dan name harus dalam huruf besar/kecil mengikuti ketentuan lokal terkait penggunaan kapitalisasi untuk nama tempat dan tidak dalam huruf besar semua.
stations[].lat Lintang Wajib Lintang WGS 84 stasiun, dalam format derajat desimal.
stations[].lon Bujur Wajib Bujur WGS 84 stasiun, dalam format derajat desimal.
stations[].capacity Bilangan bulat non-negatif Opsional Bilangan bulat non-negatif yang merepresentasikan jumlah total titik dok yang terpasang di stasiun, baik yang tersedia maupun tidak.
stations[].rental_uris Objek Wajib

Objek JSON yang berisi URI sewa untuk Android, iOS, dan web di kolom masing-masing.

Jika ditentukan, URI ini akan menggantikan deep link default yang ditetapkan saat penyedia diaktifkan.

stations[].rental_uris.android URI Wajib bersyarat

URI yang dapat diteruskan ke aplikasi Android dengan intent Android android.intent.action.VIEW untuk mendukung Deep Link Android. rental_uris yang diberikan harus berupa Link Aplikasi Android agar aplikasi penayangan tidak perlu mengelola pengalihan pengguna ke app store secara manual jika pengguna tidak menginstal aplikasi penyedia.

URI ini harus berupa deep link khusus untuk setiap stasiun, bukan halaman penyewaan umum yang menyertakan informasi untuk lebih dari satu stasiun. Deep link harus mengarahkan pengguna langsung ke stasiun tanpa dialog, halaman interstisial, atau login. Pastikan pengguna dapat melihat SPKLU meskipun mereka belum pernah membuka aplikasi.

URI tidak harus menyertakan station_id untuk stasiun, asalkan partner memiliki cara lain untuk mengidentifikasi stasiun masing-masing. Misalnya, aplikasi penyewaan dapat menggunakan ID lain dalam URI untuk mengidentifikasi stasiun secara unik.

Jika partner memiliki aplikasi penyewaan Android, kolom ini wajib diisi.

Contoh Link Aplikasi Android:

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

stations[].rental_uris.ios URI Wajib bersyarat

URI yang dapat digunakan di iOS untuk meluncurkan aplikasi penyewaan untuk stasiun. Untuk mengetahui informasi selengkapnya tentang hal ini, lihat artikel Apple tentang skema URL kustom iOS. rental_uris yang diberikan harus berupa Link Universal iOS sehingga aplikasi penayangan tidak perlu mengelola pengalihan pengguna ke app store secara manual jika pengguna tidak menginstal aplikasi penyedia.

URI ini harus berupa deep link khusus untuk setiap stasiun, bukan halaman penyewaan umum yang menyertakan informasi untuk lebih dari satu stasiun. Deep link harus mengarahkan pengguna langsung ke stasiun tanpa dialog, halaman interstisial, atau login. Pastikan pengguna dapat melihat SPKLU meskipun mereka belum pernah membuka aplikasi.

URI tidak harus menyertakan station_id untuk stasiun. Aplikasi penyewaan dapat menggunakan ID lain dalam URI untuk mengidentifikasi stasiun secara unik.

Jika partner memiliki aplikasi rental iOS, kolom ini wajib diisi.

Contoh Link Universal iOS:

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

stations[].rental_uris.web URL Opsional

URL yang dapat digunakan oleh browser web untuk menampilkan informasi selengkapnya tentang cara menyewa kendaraan di SPKLU ini.

URL ini harus berupa deep link khusus untuk setiap stasiun, bukan halaman penyewaan umum yang menyertakan informasi untuk lebih dari satu stasiun. Deep link harus mengarahkan pengguna langsung ke stasiun tanpa konfirmasi, halaman interstisial, atau login. Pastikan pengguna dapat melihat stasiun, meskipun mereka belum pernah membuka aplikasi.

URL tidak harus menyertakan station_id untuk stasiun atau mengikuti konvensi semantik URL sewa untuk Android atau iOS. Aplikasi penyewaan dapat menggunakan ID lain dalam URL yang secara unik mengidentifikasi stasiun.

Jika kolom ini tidak disetel, berarti deep link tidak didukung untuk browser web.

Nilai contoh:

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

Berikut adalah contoh untuk 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"
    }
  },
]

Wajib: station_status.json (Sistem yang terhubung ke dok)

Lihat spesifikasi GBFS jika diperlukan.

Feed ini menentukan status terbaru dan saat ini dari stasiun berbagi sepeda publik.

Nama kolom Jenis Persyaratan Deskripsi
stations Array Wajib Array objek, dengan setiap objek menentukan satu dan hanya satu stasiun.
stations[].station_id String Wajib ID stasiun.
stations[].num_bikes_available Bilangan bulat non-negatif Wajib

Bilangan bulat non-negatif yang merepresentasikan jumlah sepeda fungsional yang secara fisik berada di stasiun dan yang mungkin ditawarkan untuk disewa.

Untuk menentukan apakah saat ini stasiun menyewakan sepeda, Anda harus memeriksa kolom is_renting stasiun dan menemukan nilai Boolean benar.

stations[].vehicle_types_available Array Opsional

Array objek yang menentukan jumlah total kendaraan, yang dikategorikan menurut jenis kendaraan individual yang tersedia di SPKLU. Setiap objek memodelkan jumlah total kendaraan untuk jenis kendaraan terkait. Jumlah total kendaraan dari setiap objek ini harus sama dengan nilai yang ditentukan di kolom num_bikes_available.

stations[].vehicle_types_available[].vehicle_type_id ID Wajib

vehicle_type_id setiap jenis kendaraan yang tersedia di stasiun seperti yang dijelaskan dalam vehicle_types.json.

stations[].vehicle_types_available[].count Bilangan bulat non-negatif Wajib

Jumlah total kendaraan yang tersedia untuk vehicle_type_id yang sesuai di SPKLU sebagaimana ditentukan dalam vehicle_types.json.

stations[].num_docks_available Bilangan bulat non-negatif Wajib bersyarat

Kolom ini wajib diisi, kecuali jika stasiun memiliki kapasitas docking tanpa batas. Misalnya, stasiun virtual memiliki kapasitas docking tanpa batas dan kolom ini tidak wajib diisi.

Bilangan bulat non-negatif yang menunjukkan jumlah total dermaga fungsional di stasiun yang secara fisik dapat menerima pengembalian kendaraan.

Untuk menentukan apakah saat ini stasiun menerima pengembalian sepeda, Anda harus memeriksa kolom is_returning stasiun, dan menemukan nilai Boolean true.

stations[].is_installed Boolean Wajib

Boolean yang menunjukkan apakah benar bahwa stasiun saat ini berada di jalan dan terpasang.

Jika stasiun dipasang di jalan, setel ke true.

Jika stasiun tidak dipasang di jalan, setel ke false.

stations[].is_renting Boolean Wajib

Boolean yang menunjukkan apakah saat ini stasiun menyewakan sepeda.

Jika saat ini stasiun menyewakan sepeda, tetapkan ke true. Meskipun stasiun kosong, jika disetel untuk mengizinkan penyewaan is_renting disetel ke true.

Jika saat ini stasiun tidak menyewakan sepeda, tetapkan ke false.

stations[].is_returning Boolean Wajib

Boolean yang menunjukkan apakah benar bahwa saat ini stasiun menerima pengembalian sepeda.

Jika saat ini stasiun menerima pengembalian sepeda, setel ke true. Meskipun stasiun penuh, tetapi akan mengizinkan pengembalian jika tidak penuh, is_returning ditetapkan ke true.

Jika saat ini stasiun tidak menerima pengembalian sepeda, setel ke false.

Berikut adalah contoh 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
        },
]