diff --git a/models/golang/README.md b/models/golang/README.md index 4956beb0..b23a4f35 100644 --- a/models/golang/README.md +++ b/models/golang/README.md @@ -15,46 +15,7 @@ go get github.com/MobilityData/gbfs-json-schema/models/golang Currently only version 3.0 of GBFS is supported ## Example Code -Using the pre-build unmarshaller -```go -import( - "net/http" - "io" - v30systemInformation "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/system_information" -) -const url = "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/system-information"; -resp, err := http.Get(url) -defer resp.Body.Close() -body, err := io.ReadAll(resp.Body) -systemInformationData, unmarshalError := v30systemInformation.UnmarshalSystemInformation(body) -if unmarshalError != nil { - // NOTE: If any type mismatch occurs (ex: number instead of string) it will show up as an error - fmt.Println("Error unmarshelling:", err) -} -// systemInformationData is now typed as SystemInformation -``` -Or you can do it manually -```go -import( - "net/http" - "encoding/json" - "io" - v30systemInformation "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/system_information" -) -const url = "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/system-information"; -resp, errHttp := http.Get(url) -defer resp.Body.Close() -body, errRead := io.ReadAll(resp.Body) - -var systemInformationData v30systemInformation.SystemInformation -errMarshel := json.Unmarshal(body, &systemInformationData) -if errMarshel != nil { - // NOTE: If any type mismatch occurs (ex: number instead of string) it will show up as an error - fmt.Println("Error unmarshaling JSON:", err) -} - -// systemInformationData is now typed as SystemInformation -``` +See the [example code](https://github.com/MobilityData/gbfs-json-schema/models/golang/examples/unmarshal.go) ## Important to Note When unmarshalling data Golang sets defaults if the required value does not exist diff --git a/models/golang/common/enums.go b/models/golang/common/enums.go new file mode 100644 index 00000000..0d657ed7 --- /dev/null +++ b/models/golang/common/enums.go @@ -0,0 +1,1244 @@ +package common + +// Enumeration of all valid feed names as defined in the GBFS specification, each representing a specific type of feed. +const ( + Feed_FreeBikeStatus FeedName = "free_bike_status" // (added in v1.0 supported until v2.3) + Feed_GbfsVersions FeedName = "gbfs_versions" // (added in v1.1) + Feed_GeofencingZones FeedName = "geofencing_zones" // (added in v2.1) + Feed_Gbfs FeedName = "gbfs" // (added in v1.0) + Feed_StationInformation FeedName = "station_information" // (added in v1.0) + Feed_StationStatus FeedName = "station_status" // (added in v1.0) + Feed_SystemAlerts FeedName = "system_alerts" // (added in v1.0) + Feed_SystemCalendar FeedName = "system_calendar" // (added in v1.0 supported until v2.3) + Feed_SystemHours FeedName = "system_hours" // (added in v1.0 supported until v2.3) + Feed_SystemInformation FeedName = "system_information" // (added in v1.0) + Feed_SystemPricingPlans FeedName = "system_pricing_plans" // (added in v1.0) + Feed_SystemRegions FeedName = "system_regions" // (added in v1.0) + Feed_VehicleStatus FeedName = "vehicle_status" // (added in v3.0) + Feed_VehicleTypes FeedName = "vehicle_types" // (added in v2.1) + Feed_Manifest FeedName = "manifest" // (added in v3.0) +) + +// Enumeration of all valid GBFS versions as defined in the GBFS specification. +// Each version represents a specific set of features and changes in the GBFS specification. +const ( + V_3_0 Version = "3.0" + V_2_3 Version = "2.3" + V_2_2 Version = "2.2" + V_2_1 Version = "2.1" + V_2_0 Version = "2.0" + V_1_1 Version = "1.1" + V_1_0 Version = "1.0" +) + +// Enumeration of all valid rental methods as defined in the GBFS specification. +const ( + Accountnumber RentalMethod = "accountnumber" + Androidpay RentalMethod = "androidpay" + Applepay RentalMethod = "applepay" + Creditcard RentalMethod = "creditcard" + Key RentalMethod = "key" + Paypass RentalMethod = "paypass" + Phone RentalMethod = "phone" + Transitcard RentalMethod = "transitcard" +) + +// Enumeration of vehicle equipment provided by the operator in addition to the accessories already provided in the vehicle +// (field vehicle_accessories of vehicle_types.json) but subject to more frequent updates. +const ( + ChildSeatA VehicleEquipment = "child_seat_a" + ChildSeatB VehicleEquipment = "child_seat_b" + ChildSeatC VehicleEquipment = "child_seat_c" + SnowChains VehicleEquipment = "snow_chains" + WinterTires VehicleEquipment = "winter_tires" +) + +// Enumeration of all valid parking types as defined in the GBFS specification. +const ( + OtherParkingType ParkingType = "other" + ParkingLot ParkingType = "parking_lot" + SidewalkParking ParkingType = "sidewalk_parking" + StreetParking ParkingType = "street_parking" + UndergroundParking ParkingType = "underground_parking" +) + +// Enumeration of all valid types of system alerts as defined in the GBFS specification. +const ( + OtherType Type = "other" + StationClosure Type = "station_closure" + StationMove Type = "station_move" + SystemClosure Type = "system_closure" +) + +// Enumeration of all valid user types as defined in the GBFS specification. +const ( + Member UserType = "member" + NonMember UserType = "nonmember" +) + +// Enumeration of all valid days of the week as defined in the GBFS specification. +const ( + Sun Day = "sun" + Mon Day = "mon" + Tue Day = "tue" + Wed Day = "wed" + Thu Day = "thu" + Fri Day = "fri" + Sat Day = "sat" +) + +// Enumeration of all valid form factors as defined in the GBFS specification. +const ( + Bicycle FormFactor = "bicycle" + Car FormFactor = "car" + CargoBicycle FormFactor = "cargo_bicycle" + Moped FormFactor = "moped" + Other FormFactor = "other" + Scooter FormFactor = "scooter" + ScooterSeated FormFactor = "scooter_seated" + ScooterStanding FormFactor = "scooter_standing" +) + +// Enumeration of all valid return constraints as defined in the GBFS specification. +const ( + AnyStation ReturnConstraint = "any_station" + FreeFloating ReturnConstraint = "free_floating" + ReturnConstraintHybrid ReturnConstraint = "hybrid" + RoundtripStation ReturnConstraint = "roundtrip_station" +) + +// Enumeration of all valid vehicle accessories as defined in the GBFS specification. +const ( + AirConditioning VehicleAccessory = "air_conditioning" + Automatic VehicleAccessory = "automatic" + Convertible VehicleAccessory = "convertible" + CruiseControl VehicleAccessory = "cruise_control" + Doors2 VehicleAccessory = "doors_2" + Doors3 VehicleAccessory = "doors_3" + Doors4 VehicleAccessory = "doors_4" + Doors5 VehicleAccessory = "doors_5" + Manual VehicleAccessory = "manual" + Navigation VehicleAccessory = "navigation" +) + +// Enumeration of all valid propulsion types as defined in the GBFS specification. +const ( + Combustion PropulsionType = "combustion" + CombustionDiesel PropulsionType = "combustion_diesel" + Electric PropulsionType = "electric" + ElectricAssist PropulsionType = "electric_assist" + Human PropulsionType = "human" + HydrogenFuelCell PropulsionType = "hydrogen_fuel_cell" + PlugInHybrid PropulsionType = "plug_in_hybrid" + PropulsionTypeHybrid PropulsionType = "hybrid" +) + +// Enumeration of all valid license IDs as defined in the GBFS specification which references https://spdx.org/licenses/ +const ( + AAL LicenseID = "AAL" + ADSL LicenseID = "ADSL" + AGPL10Only LicenseID = "AGPL-1.0-only" + AGPL10OrLater LicenseID = "AGPL-1.0-or-later" + AGPL30Only LicenseID = "AGPL-3.0-only" + AGPL30OrLater LicenseID = "AGPL-3.0-or-later" + ANTLRPDFallback LicenseID = "ANTLR-PD-fallback" + APL10 LicenseID = "APL-1.0" + Abstyles LicenseID = "Abstyles" + AdaCoreDoc LicenseID = "AdaCore-doc" + Adobe2006 LicenseID = "Adobe-2006" + AdobeGlyph LicenseID = "Adobe-Glyph" + Afl11 LicenseID = "AFL-1.1" + Afl12 LicenseID = "AFL-1.2" + Afl20 LicenseID = "AFL-2.0" + Afl21 LicenseID = "AFL-2.1" + Afl30 LicenseID = "AFL-3.0" + Afmparse LicenseID = "Afmparse" + Aladdin LicenseID = "Aladdin" + Amdplpa LicenseID = "AMDPLPA" + Aml LicenseID = "AML" + Ampas LicenseID = "AMPAS" + AntlrPD LicenseID = "ANTLR-PD" + Apache10 LicenseID = "Apache-1.0" + Apache11 LicenseID = "Apache-1.1" + Apache20 LicenseID = "Apache-2.0" + Apafml LicenseID = "APAFML" + AppS2P LicenseID = "App-s2p" + Apsl10 LicenseID = "APSL-1.0" + Apsl11 LicenseID = "APSL-1.1" + Apsl12 LicenseID = "APSL-1.2" + Apsl20 LicenseID = "APSL-2.0" + Arphic1999 LicenseID = "Arphic-1999" + Artistic10 LicenseID = "Artistic-1.0" + Artistic10Cl8 LicenseID = "Artistic-1.0-cl8" + Artistic10PERL LicenseID = "Artistic-1.0-Perl" + Artistic20 LicenseID = "Artistic-2.0" + BSD1Clause LicenseID = "BSD-1-Clause" + BSD2Clause LicenseID = "BSD-2-Clause" + BSD2ClausePatent LicenseID = "BSD-2-Clause-Patent" + BSD2ClauseViews LicenseID = "BSD-2-Clause-Views" + BSD3Clause LicenseID = "BSD-3-Clause" + BSD3ClauseAttribution LicenseID = "BSD-3-Clause-Attribution" + BSD3ClauseClear LicenseID = "BSD-3-Clause-Clear" + BSD3ClauseLBNL LicenseID = "BSD-3-Clause-LBNL" + BSD3ClauseModification LicenseID = "BSD-3-Clause-Modification" + BSD3ClauseNoMilitaryLicense LicenseID = "BSD-3-Clause-No-Military-License" + BSD3ClauseNoNuclearLicense LicenseID = "BSD-3-Clause-No-Nuclear-License" + BSD3ClauseNoNuclearLicense2014 LicenseID = "BSD-3-Clause-No-Nuclear-License-2014" + BSD3ClauseNoNuclearWarranty LicenseID = "BSD-3-Clause-No-Nuclear-Warranty" + BSD3ClauseOpenMPI LicenseID = "BSD-3-Clause-Open-MPI" + BSD43Reno LicenseID = "BSD-4.3RENO" + BSD43Tahoe LicenseID = "BSD-4.3TAHOE" + BSD4Clause LicenseID = "BSD-4-Clause" + BSD4ClauseShortened LicenseID = "BSD-4-Clause-Shortened" + BSD4ClauseUC LicenseID = "BSD-4-Clause-UC" + BSDAdvertisingAcknowledgement LicenseID = "BSD-Advertising-Acknowledgement" + BSDAttributionHPNDDisclaimer LicenseID = "BSD-Attribution-HPND-disclaimer" + BSDProtection LicenseID = "BSD-Protection" + BSDSourceCode LicenseID = "BSD-Source-Code" + Baekmuk LicenseID = "Baekmuk" + Bahyph LicenseID = "Bahyph" + Barr LicenseID = "Barr" + Beerware LicenseID = "Beerware" + BitTorrent10 LicenseID = "BitTorrent-1.0" + BitTorrent11 LicenseID = "BitTorrent-1.1" + BitstreamCharter LicenseID = "Bitstream-Charter" + BitstreamVera LicenseID = "Bitstream-Vera" + Blessing LicenseID = "blessing" + BlueOak100 LicenseID = "BlueOak-1.0.0" + Borceux LicenseID = "Borceux" + BrianGladman3Clause LicenseID = "Brian-Gladman-3-Clause" + Bsl10 LicenseID = "BSL-1.0" + Busl11 LicenseID = "BUSL-1.1" + Bzip2106 LicenseID = "bzip2-1.0.6" + CAL10CombinedWorkException LicenseID = "CAL-1.0-Combined-Work-Exception" + CDLAPermissive10 LicenseID = "CDLA-Permissive-1.0" + CDLAPermissive20 LicenseID = "CDLA-Permissive-2.0" + CDLASharing10 LicenseID = "CDLA-Sharing-1.0" + CMUMach LicenseID = "CMU-Mach" + CNRIJython LicenseID = "CNRI-Jython" + CNRIPython LicenseID = "CNRI-Python" + CNRIPythonGPLCompatible LicenseID = "CNRI-Python-GPL-Compatible" + CUAOpl10 LicenseID = "CUA-OPL-1.0" + CUda10 LicenseID = "C-UDA-1.0" + Cal10 LicenseID = "CAL-1.0" + Caldera LicenseID = "Caldera" + Catosl11 LicenseID = "CATOSL-1.1" + Cc010 LicenseID = "CC0-1.0" + CcBy10 LicenseID = "CC-BY-1.0" + CcBy20 LicenseID = "CC-BY-2.0" + CcBy25 LicenseID = "CC-BY-2.5" + CcBy25Au LicenseID = "CC-BY-2.5-AU" + CcBy30 LicenseID = "CC-BY-3.0" + CcBy30At LicenseID = "CC-BY-3.0-AT" + CcBy30De LicenseID = "CC-BY-3.0-DE" + CcBy30Igo LicenseID = "CC-BY-3.0-IGO" + CcBy30Nl LicenseID = "CC-BY-3.0-NL" + CcBy30Us LicenseID = "CC-BY-3.0-US" + CcBy40 LicenseID = "CC-BY-4.0" + CcByNc10 LicenseID = "CC-BY-NC-1.0" + CcByNc20 LicenseID = "CC-BY-NC-2.0" + CcByNc25 LicenseID = "CC-BY-NC-2.5" + CcByNc30 LicenseID = "CC-BY-NC-3.0" + CcByNc30De LicenseID = "CC-BY-NC-3.0-DE" + CcByNc40 LicenseID = "CC-BY-NC-4.0" + CcByNcNd10 LicenseID = "CC-BY-NC-ND-1.0" + CcByNcNd20 LicenseID = "CC-BY-NC-ND-2.0" + CcByNcNd25 LicenseID = "CC-BY-NC-ND-2.5" + CcByNcNd30 LicenseID = "CC-BY-NC-ND-3.0" + CcByNcNd30De LicenseID = "CC-BY-NC-ND-3.0-DE" + CcByNcNd30Igo LicenseID = "CC-BY-NC-ND-3.0-IGO" + CcByNcNd40 LicenseID = "CC-BY-NC-ND-4.0" + CcByNcSa10 LicenseID = "CC-BY-NC-SA-1.0" + CcByNcSa20 LicenseID = "CC-BY-NC-SA-2.0" + CcByNcSa20De LicenseID = "CC-BY-NC-SA-2.0-DE" + CcByNcSa20Fr LicenseID = "CC-BY-NC-SA-2.0-FR" + CcByNcSa20Uk LicenseID = "CC-BY-NC-SA-2.0-UK" + CcByNcSa25 LicenseID = "CC-BY-NC-SA-2.5" + CcByNcSa30 LicenseID = "CC-BY-NC-SA-3.0" + CcByNcSa30De LicenseID = "CC-BY-NC-SA-3.0-DE" + CcByNcSa30Igo LicenseID = "CC-BY-NC-SA-3.0-IGO" + CcByNcSa40 LicenseID = "CC-BY-NC-SA-4.0" + CcByNd10 LicenseID = "CC-BY-ND-1.0" + CcByNd20 LicenseID = "CC-BY-ND-2.0" + CcByNd25 LicenseID = "CC-BY-ND-2.5" + CcByNd30 LicenseID = "CC-BY-ND-3.0" + CcByNd30De LicenseID = "CC-BY-ND-3.0-DE" + CcByNd40 LicenseID = "CC-BY-ND-4.0" + CcBySa10 LicenseID = "CC-BY-SA-1.0" + CcBySa20 LicenseID = "CC-BY-SA-2.0" + CcBySa20Uk LicenseID = "CC-BY-SA-2.0-UK" + CcBySa21Jp LicenseID = "CC-BY-SA-2.1-JP" + CcBySa25 LicenseID = "CC-BY-SA-2.5" + CcBySa30 LicenseID = "CC-BY-SA-3.0" + CcBySa30At LicenseID = "CC-BY-SA-3.0-AT" + CcBySa30De LicenseID = "CC-BY-SA-3.0-DE" + CcBySa40 LicenseID = "CC-BY-SA-4.0" + CcPddc LicenseID = "CC-PDDC" + Cddl10 LicenseID = "CDDL-1.0" + Cddl11 LicenseID = "CDDL-1.1" + Cdl10 LicenseID = "CDL-1.0" + Cecill10 LicenseID = "CECILL-1.0" + Cecill11 LicenseID = "CECILL-1.1" + Cecill20 LicenseID = "CECILL-2.0" + Cecill21 LicenseID = "CECILL-2.1" + CecillB LicenseID = "CECILL-B" + CecillC LicenseID = "CECILL-C" + CernOhl11 LicenseID = "CERN-OHL-1.1" + CernOhl12 LicenseID = "CERN-OHL-1.2" + CernOhlP20 LicenseID = "CERN-OHL-P-2.0" + CernOhlS20 LicenseID = "CERN-OHL-S-2.0" + CernOhlW20 LicenseID = "CERN-OHL-W-2.0" + Cfitsio LicenseID = "CFITSIO" + Checkmk LicenseID = "checkmk" + ClArtistic LicenseID = "ClArtistic" + Clips LicenseID = "Clips" + Coil10 LicenseID = "COIL-1.0" + CommunitySpec10 LicenseID = "Community-Spec-1.0" + Condor11 LicenseID = "Condor-1.1" + CopyleftNext030 LicenseID = "copyleft-next-0.3.0" + CopyleftNext031 LicenseID = "copyleft-next-0.3.1" + CornellLosslessJPEG LicenseID = "Cornell-Lossless-JPEG" + Cpal10 LicenseID = "CPAL-1.0" + Cpl10 LicenseID = "CPL-1.0" + Cpol102 LicenseID = "CPOL-1.02" + Crossword LicenseID = "Crossword" + CrystalStacker LicenseID = "CrystalStacker" + Cube LicenseID = "Cube" + Curl LicenseID = "curl" + DFsl10 LicenseID = "D-FSL-1.0" + DLDeBy20 LicenseID = "DL-DE-BY-2.0" + Diffmark LicenseID = "diffmark" + Doc LicenseID = "DOC" + Dotseqn LicenseID = "Dotseqn" + Drl10 LicenseID = "DRL-1.0" + Dsdp LicenseID = "DSDP" + Dvipdfm LicenseID = "dvipdfm" + EGenix LicenseID = "eGenix" + EUDatagrid LicenseID = "EUDatagrid" + Ecl10 LicenseID = "ECL-1.0" + Ecl20 LicenseID = "ECL-2.0" + Efl10 LicenseID = "EFL-1.0" + Efl20 LicenseID = "EFL-2.0" + Elastic20 LicenseID = "Elastic-2.0" + Entessa LicenseID = "Entessa" + Epics LicenseID = "EPICS" + Epl10 LicenseID = "EPL-1.0" + Epl20 LicenseID = "EPL-2.0" + ErlPL11 LicenseID = "ErlPL-1.1" + Etalab20 LicenseID = "etalab-2.0" + Eupl10 LicenseID = "EUPL-1.0" + Eupl11 LicenseID = "EUPL-1.1" + Eupl12 LicenseID = "EUPL-1.2" + Eurosym LicenseID = "Eurosym" + Fair LicenseID = "Fair" + FdkAAC LicenseID = "FDK-AAC" + Frameworx10 LicenseID = "Frameworx-1.0" + FreeBSDDOC LicenseID = "FreeBSD-DOC" + FreeImage LicenseID = "FreeImage" + Fsfap LicenseID = "FSFAP" + Fsful LicenseID = "FSFUL" + Fsfullr LicenseID = "FSFULLR" + Fsfullrwd LicenseID = "FSFULLRWD" + Ftl LicenseID = "FTL" + GFDL11InvariantsOnly LicenseID = "GFDL-1.1-invariants-only" + GFDL11InvariantsOrLater LicenseID = "GFDL-1.1-invariants-or-later" + GFDL11NoInvariantsOnly LicenseID = "GFDL-1.1-no-invariants-only" + GFDL11NoInvariantsOrLater LicenseID = "GFDL-1.1-no-invariants-or-later" + GFDL11Only LicenseID = "GFDL-1.1-only" + GFDL11OrLater LicenseID = "GFDL-1.1-or-later" + GFDL12InvariantsOnly LicenseID = "GFDL-1.2-invariants-only" + GFDL12InvariantsOrLater LicenseID = "GFDL-1.2-invariants-or-later" + GFDL12NoInvariantsOnly LicenseID = "GFDL-1.2-no-invariants-only" + GFDL12NoInvariantsOrLater LicenseID = "GFDL-1.2-no-invariants-or-later" + GFDL12Only LicenseID = "GFDL-1.2-only" + GFDL12OrLater LicenseID = "GFDL-1.2-or-later" + GFDL13InvariantsOnly LicenseID = "GFDL-1.3-invariants-only" + GFDL13InvariantsOrLater LicenseID = "GFDL-1.3-invariants-or-later" + GFDL13NoInvariantsOnly LicenseID = "GFDL-1.3-no-invariants-only" + GFDL13NoInvariantsOrLater LicenseID = "GFDL-1.3-no-invariants-or-later" + GFDL13Only LicenseID = "GFDL-1.3-only" + GFDL13OrLater LicenseID = "GFDL-1.3-or-later" + GPL10Only LicenseID = "GPL-1.0-only" + GPL10OrLater LicenseID = "GPL-1.0-or-later" + GPL20Only LicenseID = "GPL-2.0-only" + GPL20OrLater LicenseID = "GPL-2.0-or-later" + GPL30Only LicenseID = "GPL-3.0-only" + GPL30OrLater LicenseID = "GPL-3.0-or-later" + GSOAP13B LicenseID = "gSOAP-1.3b" + Gd LicenseID = "GD" + Giftware LicenseID = "Giftware" + Gl2PS LicenseID = "GL2PS" + Glide LicenseID = "Glide" + Glulxe LicenseID = "Glulxe" + Glwtpl LicenseID = "GLWTPL" + Gnuplot LicenseID = "gnuplot" + GraphicsGems LicenseID = "Graphics-Gems" + HP1986 LicenseID = "HP-1986" + HPNDExportUS LicenseID = "HPND-export-US" + HPNDMarkusKuhn LicenseID = "HPND-Markus-Kuhn" + HPNDSellVariant LicenseID = "HPND-sell-variant" + HPNDSellVariantMITDisclaimer LicenseID = "HPND-sell-variant-MIT-disclaimer" + HaskellReport LicenseID = "HaskellReport" + Hippocratic21 LicenseID = "Hippocratic-2.1" + Hpnd LicenseID = "HPND" + Htmltidy LicenseID = "HTMLTIDY" + IBMPibs LicenseID = "IBM-pibs" + IECCodeComponentsEULA LicenseID = "IEC-Code-Components-EULA" + IJGShort LicenseID = "IJG-short" + IMatix LicenseID = "iMatix" + IPL10 LicenseID = "IPL-1.0" + ISC LicenseID = "ISC" + Icu LicenseID = "ICU" + Ijg LicenseID = "IJG" + ImageMagick LicenseID = "ImageMagick" + Imlib2 LicenseID = "Imlib2" + InfoZIP LicenseID = "Info-ZIP" + Intel LicenseID = "Intel" + IntelACPI LicenseID = "Intel-ACPI" + Interbase10 LicenseID = "Interbase-1.0" + Ipa LicenseID = "IPA" + JPLImage LicenseID = "JPL-image" + JSON LicenseID = "JSON" + Jam LicenseID = "Jam" + JasPer20 LicenseID = "JasPer-2.0" + Jpnic LicenseID = "JPNIC" + Kazlib LicenseID = "Kazlib" + KnuthCTAN LicenseID = "Knuth-CTAN" + LGPL20Only LicenseID = "LGPL-2.0-only" + LGPL20OrLater LicenseID = "LGPL-2.0-or-later" + LGPL21Only LicenseID = "LGPL-2.1-only" + LGPL21OrLater LicenseID = "LGPL-2.1-or-later" + LGPL30Only LicenseID = "LGPL-3.0-only" + LGPL30OrLater LicenseID = "LGPL-3.0-or-later" + LPPL13A LicenseID = "LPPL-1.3a" + LPPL13C LicenseID = "LPPL-1.3c" + LZMASDK911To920 LicenseID = "LZMA-SDK-9.11-to-9.20" + Lal12 LicenseID = "LAL-1.2" + Lal13 LicenseID = "LAL-1.3" + Latex2E LicenseID = "Latex2e" + Leptonica LicenseID = "Leptonica" + Lgpllr LicenseID = "LGPLLR" + LiLiQP11 LicenseID = "LiLiQ-P-1.1" + LiLiQR11 LicenseID = "LiLiQ-R-1.1" + LiLiQRplus11 LicenseID = "LiLiQ-Rplus-1.1" + Libpng LicenseID = "Libpng" + Libpng20 LicenseID = "libpng-2.0" + Libselinux10 LicenseID = "libselinux-1.0" + Libtiff LicenseID = "libtiff" + LibutilDavidNugent LicenseID = "libutil-David-Nugent" + LinuxManPagesCopyleft LicenseID = "Linux-man-pages-copyleft" + LinuxOpenIB LicenseID = "Linux-OpenIB" + Loop LicenseID = "LOOP" + Lpl10 LicenseID = "LPL-1.0" + Lpl102 LicenseID = "LPL-1.02" + Lppl10 LicenseID = "LPPL-1.0" + Lppl11 LicenseID = "LPPL-1.1" + Lppl12 LicenseID = "LPPL-1.2" + LzmaSDK922 LicenseID = "LZMA-SDK-9.22" + MIT LicenseID = "MIT" + MIT0 LicenseID = "MIT-0" + MITAdvertising LicenseID = "MIT-advertising" + MITCmu LicenseID = "MIT-CMU" + MITEnna LicenseID = "MIT-enna" + MITFeh LicenseID = "MIT-feh" + MITModernVariant LicenseID = "MIT-Modern-Variant" + MITOpenGroup LicenseID = "MIT-open-group" + MITWu LicenseID = "MIT-Wu" + MPL10 LicenseID = "MPL-1.0" + MPL11 LicenseID = "MPL-1.1" + MPL20 LicenseID = "MPL-2.0" + MPL20NoCopyleftException LicenseID = "MPL-2.0-no-copyleft-exception" + MSLpl LicenseID = "MS-LPL" + MSPl LicenseID = "MS-PL" + MSRl LicenseID = "MS-RL" + MakeIndex LicenseID = "MakeIndex" + MartinBirgmeier LicenseID = "Martin-Birgmeier" + Minpack LicenseID = "Minpack" + MirOS LicenseID = "MirOS" + Mitnfa LicenseID = "MITNFA" + Motosoto LicenseID = "Motosoto" + MpiPermissive LicenseID = "mpi-permissive" + Mpich2 LicenseID = "mpich2" + Mplus LicenseID = "mplus" + Mtll LicenseID = "MTLL" + MulanPSL10 LicenseID = "MulanPSL-1.0" + MulanPSL20 LicenseID = "MulanPSL-2.0" + Multics LicenseID = "Multics" + Mup LicenseID = "Mup" + NCSA LicenseID = "NCSA" + NISTPD LicenseID = "NIST-PD" + NISTPDFallback LicenseID = "NIST-PD-fallback" + NPL10 LicenseID = "NPL-1.0" + NPL11 LicenseID = "NPL-1.1" + NTP LicenseID = "NTP" + NTP0 LicenseID = "NTP-0" + Naist2003 LicenseID = "NAIST-2003" + Nasa13 LicenseID = "NASA-1.3" + Naumen LicenseID = "Naumen" + Nbpl10 LicenseID = "NBPL-1.0" + NcglUk20 LicenseID = "NCGL-UK-2.0" + NetCDF LicenseID = "NetCDF" + NetSNMP LicenseID = "Net-SNMP" + Newsletr LicenseID = "Newsletr" + Ngpl LicenseID = "NGPL" + Nicta10 LicenseID = "NICTA-1.0" + Nlod10 LicenseID = "NLOD-1.0" + Nlod20 LicenseID = "NLOD-2.0" + Nlpl LicenseID = "NLPL" + Nokia LicenseID = "Nokia" + Nosl LicenseID = "NOSL" + Noweb LicenseID = "Noweb" + Nposl30 LicenseID = "NPOSL-3.0" + Nrl LicenseID = "NRL" + ODBL10 LicenseID = "ODbL-1.0" + ODCBy10 LicenseID = "ODC-By-1.0" + OFL10NoRFN LicenseID = "OFL-1.0-no-RFN" + OFL11NoRFN LicenseID = "OFL-1.1-no-RFN" + OGDLTaiwan10 LicenseID = "OGDL-Taiwan-1.0" + OGLCanada20 LicenseID = "OGL-Canada-2.0" + OUda10 LicenseID = "O-UDA-1.0" + OcctPl LicenseID = "OCCT-PL" + Oclc20 LicenseID = "OCLC-2.0" + Offis LicenseID = "OFFIS" + Ofl10 LicenseID = "OFL-1.0" + Ofl10Rfn LicenseID = "OFL-1.0-RFN" + Ofl11 LicenseID = "OFL-1.1" + Ofl11Rfn LicenseID = "OFL-1.1-RFN" + Ogc10 LicenseID = "OGC-1.0" + OglUk10 LicenseID = "OGL-UK-1.0" + OglUk20 LicenseID = "OGL-UK-2.0" + OglUk30 LicenseID = "OGL-UK-3.0" + Ogtsl LicenseID = "OGTSL" + Oldap11 LicenseID = "OLDAP-1.1" + Oldap12 LicenseID = "OLDAP-1.2" + Oldap13 LicenseID = "OLDAP-1.3" + Oldap14 LicenseID = "OLDAP-1.4" + Oldap20 LicenseID = "OLDAP-2.0" + Oldap201 LicenseID = "OLDAP-2.0.1" + Oldap21 LicenseID = "OLDAP-2.1" + Oldap22 LicenseID = "OLDAP-2.2" + Oldap221 LicenseID = "OLDAP-2.2.1" + Oldap222 LicenseID = "OLDAP-2.2.2" + Oldap23 LicenseID = "OLDAP-2.3" + Oldap24 LicenseID = "OLDAP-2.4" + Oldap25 LicenseID = "OLDAP-2.5" + Oldap26 LicenseID = "OLDAP-2.6" + Oldap27 LicenseID = "OLDAP-2.7" + Oldap28 LicenseID = "OLDAP-2.8" + Oml LicenseID = "OML" + OpenPBS23 LicenseID = "OpenPBS-2.3" + OpenSSL LicenseID = "OpenSSL" + Opl10 LicenseID = "OPL-1.0" + Opubl10 LicenseID = "OPUBL-1.0" + OsetPl21 LicenseID = "OSET-PL-2.1" + Osl10 LicenseID = "OSL-1.0" + Osl11 LicenseID = "OSL-1.1" + Osl20 LicenseID = "OSL-2.0" + Osl21 LicenseID = "OSL-2.1" + Osl30 LicenseID = "OSL-3.0" + PHP30 LicenseID = "PHP-3.0" + PHP301 LicenseID = "PHP-3.01" + Parity600 LicenseID = "Parity-6.0.0" + Parity700 LicenseID = "Parity-7.0.0" + Pddl10 LicenseID = "PDDL-1.0" + Plexus LicenseID = "Plexus" + PolyFormNoncommercial100 LicenseID = "PolyForm-Noncommercial-1.0.0" + PolyFormSmallBusiness100 LicenseID = "PolyForm-Small-Business-1.0.0" + PostgreSQL LicenseID = "PostgreSQL" + Psf20 LicenseID = "PSF-2.0" + Psfrag LicenseID = "psfrag" + Psutils LicenseID = "psutils" + Python20 LicenseID = "Python-2.0" + Python201 LicenseID = "Python-2.0.1" + Qhull LicenseID = "Qhull" + Qpl10 LicenseID = "QPL-1.0" + Qpl10Inria2004 LicenseID = "QPL-1.0-INRIA-2004" + RHeCos11 LicenseID = "RHeCos-1.1" + RSAMd LicenseID = "RSA-MD" + Rdisc LicenseID = "Rdisc" + Rpl11 LicenseID = "RPL-1.1" + Rpl15 LicenseID = "RPL-1.5" + Rpsl10 LicenseID = "RPSL-1.0" + Rscpl LicenseID = "RSCPL" + Ruby LicenseID = "Ruby" + SAXPD LicenseID = "SAX-PD" + SGIB10 LicenseID = "SGI-B-1.0" + SGIB11 LicenseID = "SGI-B-1.1" + SGIB20 LicenseID = "SGI-B-2.0" + SSHOpenSSH LicenseID = "SSH-OpenSSH" + SSHShort LicenseID = "SSH-short" + Saxpath LicenseID = "Saxpath" + Scea LicenseID = "SCEA" + SchemeReport LicenseID = "SchemeReport" + Sendmail LicenseID = "Sendmail" + Sendmail823 LicenseID = "Sendmail-8.23" + Shl05 LicenseID = "SHL-0.5" + Shl051 LicenseID = "SHL-0.51" + SimPL20 LicenseID = "SimPL-2.0" + Sissl LicenseID = "SISSL" + Sissl12 LicenseID = "SISSL-1.2" + Sleepycat LicenseID = "Sleepycat" + Smlnj LicenseID = "SMLNJ" + Smppl LicenseID = "SMPPL" + Snia LicenseID = "SNIA" + Snprintf LicenseID = "snprintf" + Spencer86 LicenseID = "Spencer-86" + Spencer94 LicenseID = "Spencer-94" + Spencer99 LicenseID = "Spencer-99" + Spl10 LicenseID = "SPL-1.0" + Sspl10 LicenseID = "SSPL-1.0" + SugarCRM113 LicenseID = "SugarCRM-1.1.3" + SunPro LicenseID = "SunPro" + Swl LicenseID = "SWL" + Symlinks LicenseID = "Symlinks" + TCPWrappers LicenseID = "TCP-wrappers" + TMate LicenseID = "TMate" + TUBerlin10 LicenseID = "TU-Berlin-1.0" + TUBerlin20 LicenseID = "TU-Berlin-2.0" + TaprOhl10 LicenseID = "TAPR-OHL-1.0" + Tcl LicenseID = "TCL" + The0BSD LicenseID = "0BSD" + Torque11 LicenseID = "TORQUE-1.1" + Tosl LicenseID = "TOSL" + Tpdl LicenseID = "TPDL" + Tpl10 LicenseID = "TPL-1.0" + Ttwl LicenseID = "TTWL" + Ucar LicenseID = "UCAR" + Ucl10 LicenseID = "UCL-1.0" + UnicodeDFS2015 LicenseID = "Unicode-DFS-2015" + UnicodeDFS2016 LicenseID = "Unicode-DFS-2016" + UnicodeTOU LicenseID = "Unicode-TOU" + Unlicense LicenseID = "Unlicense" + Upl10 LicenseID = "UPL-1.0" + Vim LicenseID = "Vim" + Vostrom LicenseID = "VOSTROM" + Vsl10 LicenseID = "VSL-1.0" + W3C LicenseID = "W3C" + W3C19980720 LicenseID = "W3C-19980720" + W3C20150513 LicenseID = "W3C-20150513" + W3M LicenseID = "w3m" + Watcom10 LicenseID = "Watcom-1.0" + Wsuipa LicenseID = "Wsuipa" + Wtfpl LicenseID = "WTFPL" + X11 LicenseID = "X11" + X11DistributeModificationsVariant LicenseID = "X11-distribute-modifications-variant" + XFree8611 LicenseID = "XFree86-1.1" + XSkat LicenseID = "XSkat" + Xerox LicenseID = "Xerox" + Xinetd LicenseID = "xinetd" + Xlock LicenseID = "xlock" + Xnet LicenseID = "Xnet" + Xpp LicenseID = "xpp" + Ypl10 LicenseID = "YPL-1.0" + Ypl11 LicenseID = "YPL-1.1" + ZPL11 LicenseID = "ZPL-1.1" + ZPL20 LicenseID = "ZPL-2.0" + ZPL21 LicenseID = "ZPL-2.1" + Zed LicenseID = "Zed" + Zend20 LicenseID = "Zend-2.0" + Zimbra13 LicenseID = "Zimbra-1.3" + Zimbra14 LicenseID = "Zimbra-1.4" + Zlib LicenseID = "Zlib" + ZlibAcknowledgement LicenseID = "zlib-acknowledgement" +) + +// Enumeration of all timezones as defined by the IANA Time Zone Database. Refer to https://en.wikipedia.org/wiki/List_of_tz_zones for a list of valid values. +const ( + AfricaAbidjan Timezone = "Africa/Abidjan" + AfricaAccra Timezone = "Africa/Accra" + AfricaAddisAbaba Timezone = "Africa/Addis_Ababa" + AfricaAlgiers Timezone = "Africa/Algiers" + AfricaAsmara Timezone = "Africa/Asmara" + AfricaAsmera Timezone = "Africa/Asmera" + AfricaBamako Timezone = "Africa/Bamako" + AfricaBangui Timezone = "Africa/Bangui" + AfricaBanjul Timezone = "Africa/Banjul" + AfricaBissau Timezone = "Africa/Bissau" + AfricaBlantyre Timezone = "Africa/Blantyre" + AfricaBrazzaville Timezone = "Africa/Brazzaville" + AfricaBujumbura Timezone = "Africa/Bujumbura" + AfricaCairo Timezone = "Africa/Cairo" + AfricaCasablanca Timezone = "Africa/Casablanca" + AfricaCeuta Timezone = "Africa/Ceuta" + AfricaConakry Timezone = "Africa/Conakry" + AfricaDakar Timezone = "Africa/Dakar" + AfricaDarEsSalaam Timezone = "Africa/Dar_es_Salaam" + AfricaDjibouti Timezone = "Africa/Djibouti" + AfricaDouala Timezone = "Africa/Douala" + AfricaElAaiun Timezone = "Africa/El_Aaiun" + AfricaFreetown Timezone = "Africa/Freetown" + AfricaGaborone Timezone = "Africa/Gaborone" + AfricaHarare Timezone = "Africa/Harare" + AfricaJohannesburg Timezone = "Africa/Johannesburg" + AfricaJuba Timezone = "Africa/Juba" + AfricaKampala Timezone = "Africa/Kampala" + AfricaKhartoum Timezone = "Africa/Khartoum" + AfricaKigali Timezone = "Africa/Kigali" + AfricaKinshasa Timezone = "Africa/Kinshasa" + AfricaLagos Timezone = "Africa/Lagos" + AfricaLibreville Timezone = "Africa/Libreville" + AfricaLome Timezone = "Africa/Lome" + AfricaLuanda Timezone = "Africa/Luanda" + AfricaLubumbashi Timezone = "Africa/Lubumbashi" + AfricaLusaka Timezone = "Africa/Lusaka" + AfricaMalabo Timezone = "Africa/Malabo" + AfricaMaputo Timezone = "Africa/Maputo" + AfricaMaseru Timezone = "Africa/Maseru" + AfricaMbabane Timezone = "Africa/Mbabane" + AfricaMogadishu Timezone = "Africa/Mogadishu" + AfricaMonrovia Timezone = "Africa/Monrovia" + AfricaNairobi Timezone = "Africa/Nairobi" + AfricaNdjamena Timezone = "Africa/Ndjamena" + AfricaNiamey Timezone = "Africa/Niamey" + AfricaNouakchott Timezone = "Africa/Nouakchott" + AfricaOuagadougou Timezone = "Africa/Ouagadougou" + AfricaPortoNovo Timezone = "Africa/Porto-Novo" + AfricaSaoTome Timezone = "Africa/Sao_Tome" + AfricaTimbuktu Timezone = "Africa/Timbuktu" + AfricaTripoli Timezone = "Africa/Tripoli" + AfricaTunis Timezone = "Africa/Tunis" + AfricaWindhoek Timezone = "Africa/Windhoek" + AmericaAdak Timezone = "America/Adak" + AmericaAnchorage Timezone = "America/Anchorage" + AmericaAnguilla Timezone = "America/Anguilla" + AmericaAntigua Timezone = "America/Antigua" + AmericaAraguaina Timezone = "America/Araguaina" + AmericaArgentinaBuenosAires Timezone = "America/Argentina/Buenos_Aires" + AmericaArgentinaCatamarca Timezone = "America/Argentina/Catamarca" + AmericaArgentinaComodRivadavia Timezone = "America/Argentina/ComodRivadavia" + AmericaArgentinaCordoba Timezone = "America/Argentina/Cordoba" + AmericaArgentinaJujuy Timezone = "America/Argentina/Jujuy" + AmericaArgentinaLaRioja Timezone = "America/Argentina/La_Rioja" + AmericaArgentinaMendoza Timezone = "America/Argentina/Mendoza" + AmericaArgentinaRioGallegos Timezone = "America/Argentina/Rio_Gallegos" + AmericaArgentinaSANJuan Timezone = "America/Argentina/San_Juan" + AmericaArgentinaSANLuis Timezone = "America/Argentina/San_Luis" + AmericaArgentinaSalta Timezone = "America/Argentina/Salta" + AmericaArgentinaTucuman Timezone = "America/Argentina/Tucuman" + AmericaArgentinaUshuaia Timezone = "America/Argentina/Ushuaia" + AmericaAruba Timezone = "America/Aruba" + AmericaAsuncion Timezone = "America/Asuncion" + AmericaAtikokan Timezone = "America/Atikokan" + AmericaAtka Timezone = "America/Atka" + AmericaBahia Timezone = "America/Bahia" + AmericaBahiaBanderas Timezone = "America/Bahia_Banderas" + AmericaBarbados Timezone = "America/Barbados" + AmericaBelem Timezone = "America/Belem" + AmericaBelize Timezone = "America/Belize" + AmericaBlancSablon Timezone = "America/Blanc-Sablon" + AmericaBoaVista Timezone = "America/Boa_Vista" + AmericaBogota Timezone = "America/Bogota" + AmericaBoise Timezone = "America/Boise" + AmericaBuenosAires Timezone = "America/Buenos_Aires" + AmericaCambridgeBay Timezone = "America/Cambridge_Bay" + AmericaCampoGrande Timezone = "America/Campo_Grande" + AmericaCancun Timezone = "America/Cancun" + AmericaCaracas Timezone = "America/Caracas" + AmericaCatamarca Timezone = "America/Catamarca" + AmericaCayenne Timezone = "America/Cayenne" + AmericaCayman Timezone = "America/Cayman" + AmericaChicago Timezone = "America/Chicago" + AmericaChihuahua Timezone = "America/Chihuahua" + AmericaCiudadJuarez Timezone = "America/Ciudad_Juarez" + AmericaCoralHarbour Timezone = "America/Coral_Harbour" + AmericaCordoba Timezone = "America/Cordoba" + AmericaCostaRica Timezone = "America/Costa_Rica" + AmericaCreston Timezone = "America/Creston" + AmericaCuiaba Timezone = "America/Cuiaba" + AmericaCuracao Timezone = "America/Curacao" + AmericaDanmarkshavn Timezone = "America/Danmarkshavn" + AmericaDawson Timezone = "America/Dawson" + AmericaDawsonCreek Timezone = "America/Dawson_Creek" + AmericaDenver Timezone = "America/Denver" + AmericaDetroit Timezone = "America/Detroit" + AmericaDominica Timezone = "America/Dominica" + AmericaEdmonton Timezone = "America/Edmonton" + AmericaEirunepe Timezone = "America/Eirunepe" + AmericaElSalvador Timezone = "America/El_Salvador" + AmericaEnsenada Timezone = "America/Ensenada" + AmericaFortNelson Timezone = "America/Fort_Nelson" + AmericaFortWayne Timezone = "America/Fort_Wayne" + AmericaFortaleza Timezone = "America/Fortaleza" + AmericaGlaceBay Timezone = "America/Glace_Bay" + AmericaGodthab Timezone = "America/Godthab" + AmericaGooseBay Timezone = "America/Goose_Bay" + AmericaGrandTurk Timezone = "America/Grand_Turk" + AmericaGrenada Timezone = "America/Grenada" + AmericaGuadeloupe Timezone = "America/Guadeloupe" + AmericaGuatemala Timezone = "America/Guatemala" + AmericaGuayaquil Timezone = "America/Guayaquil" + AmericaGuyana Timezone = "America/Guyana" + AmericaHalifax Timezone = "America/Halifax" + AmericaHavana Timezone = "America/Havana" + AmericaHermosillo Timezone = "America/Hermosillo" + AmericaIndianaIndianapolis Timezone = "America/Indiana/Indianapolis" + AmericaIndianaKnox Timezone = "America/Indiana/Knox" + AmericaIndianaMarengo Timezone = "America/Indiana/Marengo" + AmericaIndianaPetersburg Timezone = "America/Indiana/Petersburg" + AmericaIndianaTellCity Timezone = "America/Indiana/Tell_City" + AmericaIndianaVevay Timezone = "America/Indiana/Vevay" + AmericaIndianaVincennes Timezone = "America/Indiana/Vincennes" + AmericaIndianaWinamac Timezone = "America/Indiana/Winamac" + AmericaIndianapolis Timezone = "America/Indianapolis" + AmericaInuvik Timezone = "America/Inuvik" + AmericaIqaluit Timezone = "America/Iqaluit" + AmericaJamaica Timezone = "America/Jamaica" + AmericaJujuy Timezone = "America/Jujuy" + AmericaJuneau Timezone = "America/Juneau" + AmericaKentuckyLouisville Timezone = "America/Kentucky/Louisville" + AmericaKentuckyMonticello Timezone = "America/Kentucky/Monticello" + AmericaKnoxIN Timezone = "America/Knox_IN" + AmericaKralendijk Timezone = "America/Kralendijk" + AmericaLaPaz Timezone = "America/La_Paz" + AmericaLima Timezone = "America/Lima" + AmericaLosAngeles Timezone = "America/Los_Angeles" + AmericaLouisville Timezone = "America/Louisville" + AmericaLowerPrinces Timezone = "America/Lower_Princes" + AmericaMaceio Timezone = "America/Maceio" + AmericaManagua Timezone = "America/Managua" + AmericaManaus Timezone = "America/Manaus" + AmericaMarigot Timezone = "America/Marigot" + AmericaMartinique Timezone = "America/Martinique" + AmericaMatamoros Timezone = "America/Matamoros" + AmericaMazatlan Timezone = "America/Mazatlan" + AmericaMendoza Timezone = "America/Mendoza" + AmericaMenominee Timezone = "America/Menominee" + AmericaMerida Timezone = "America/Merida" + AmericaMetlakatla Timezone = "America/Metlakatla" + AmericaMexicoCity Timezone = "America/Mexico_City" + AmericaMiquelon Timezone = "America/Miquelon" + AmericaMoncton Timezone = "America/Moncton" + AmericaMonterrey Timezone = "America/Monterrey" + AmericaMontevideo Timezone = "America/Montevideo" + AmericaMontreal Timezone = "America/Montreal" + AmericaMontserrat Timezone = "America/Montserrat" + AmericaNassau Timezone = "America/Nassau" + AmericaNewYork Timezone = "America/New_York" + AmericaNipigon Timezone = "America/Nipigon" + AmericaNome Timezone = "America/Nome" + AmericaNoronha Timezone = "America/Noronha" + AmericaNorthDakotaBeulah Timezone = "America/North_Dakota/Beulah" + AmericaNorthDakotaCenter Timezone = "America/North_Dakota/Center" + AmericaNorthDakotaNewSalem Timezone = "America/North_Dakota/New_Salem" + AmericaNuuk Timezone = "America/Nuuk" + AmericaOjinaga Timezone = "America/Ojinaga" + AmericaPanama Timezone = "America/Panama" + AmericaPangnirtung Timezone = "America/Pangnirtung" + AmericaParamaribo Timezone = "America/Paramaribo" + AmericaPhoenix Timezone = "America/Phoenix" + AmericaPortAuPrince Timezone = "America/Port-au-Prince" + AmericaPortOfSpain Timezone = "America/Port_of_Spain" + AmericaPortoAcre Timezone = "America/Porto_Acre" + AmericaPortoVelho Timezone = "America/Porto_Velho" + AmericaPuertoRico Timezone = "America/Puerto_Rico" + AmericaPuntaArenas Timezone = "America/Punta_Arenas" + AmericaRainyRiver Timezone = "America/Rainy_River" + AmericaRankinInlet Timezone = "America/Rankin_Inlet" + AmericaRecife Timezone = "America/Recife" + AmericaRegina Timezone = "America/Regina" + AmericaResolute Timezone = "America/Resolute" + AmericaRioBranco Timezone = "America/Rio_Branco" + AmericaRosario Timezone = "America/Rosario" + AmericaSantaIsabel Timezone = "America/Santa_Isabel" + AmericaSantarem Timezone = "America/Santarem" + AmericaSantiago Timezone = "America/Santiago" + AmericaSantoDomingo Timezone = "America/Santo_Domingo" + AmericaSaoPaulo Timezone = "America/Sao_Paulo" + AmericaScoresbysund Timezone = "America/Scoresbysund" + AmericaShiprock Timezone = "America/Shiprock" + AmericaSitka Timezone = "America/Sitka" + AmericaStBarthelemy Timezone = "America/St_Barthelemy" + AmericaStJohns Timezone = "America/St_Johns" + AmericaStKitts Timezone = "America/St_Kitts" + AmericaStLucia Timezone = "America/St_Lucia" + AmericaStThomas Timezone = "America/St_Thomas" + AmericaStVincent Timezone = "America/St_Vincent" + AmericaSwiftCurrent Timezone = "America/Swift_Current" + AmericaTegucigalpa Timezone = "America/Tegucigalpa" + AmericaThule Timezone = "America/Thule" + AmericaThunderBay Timezone = "America/Thunder_Bay" + AmericaTijuana Timezone = "America/Tijuana" + AmericaToronto Timezone = "America/Toronto" + AmericaTortola Timezone = "America/Tortola" + AmericaVancouver Timezone = "America/Vancouver" + AmericaVirgin Timezone = "America/Virgin" + AmericaWhitehorse Timezone = "America/Whitehorse" + AmericaWinnipeg Timezone = "America/Winnipeg" + AmericaYakutat Timezone = "America/Yakutat" + AmericaYellowknife Timezone = "America/Yellowknife" + AntarcticaCasey Timezone = "Antarctica/Casey" + AntarcticaDavis Timezone = "Antarctica/Davis" + AntarcticaDumontDUrville Timezone = "Antarctica/DumontDUrville" + AntarcticaMacquarie Timezone = "Antarctica/Macquarie" + AntarcticaMawson Timezone = "Antarctica/Mawson" + AntarcticaMcMurdo Timezone = "Antarctica/McMurdo" + AntarcticaPalmer Timezone = "Antarctica/Palmer" + AntarcticaRothera Timezone = "Antarctica/Rothera" + AntarcticaSouthPole Timezone = "Antarctica/South_Pole" + AntarcticaSyowa Timezone = "Antarctica/Syowa" + AntarcticaTroll Timezone = "Antarctica/Troll" + AntarcticaVostok Timezone = "Antarctica/Vostok" + ArcticLongyearbyen Timezone = "Arctic/Longyearbyen" + AsiaAden Timezone = "Asia/Aden" + AsiaAlmaty Timezone = "Asia/Almaty" + AsiaAmman Timezone = "Asia/Amman" + AsiaAnadyr Timezone = "Asia/Anadyr" + AsiaAqtau Timezone = "Asia/Aqtau" + AsiaAqtobe Timezone = "Asia/Aqtobe" + AsiaAshgabat Timezone = "Asia/Ashgabat" + AsiaAshkhabad Timezone = "Asia/Ashkhabad" + AsiaAtyrau Timezone = "Asia/Atyrau" + AsiaBaghdad Timezone = "Asia/Baghdad" + AsiaBahrain Timezone = "Asia/Bahrain" + AsiaBaku Timezone = "Asia/Baku" + AsiaBangkok Timezone = "Asia/Bangkok" + AsiaBarnaul Timezone = "Asia/Barnaul" + AsiaBeirut Timezone = "Asia/Beirut" + AsiaBishkek Timezone = "Asia/Bishkek" + AsiaBrunei Timezone = "Asia/Brunei" + AsiaCalcutta Timezone = "Asia/Calcutta" + AsiaChita Timezone = "Asia/Chita" + AsiaChoibalsan Timezone = "Asia/Choibalsan" + AsiaChongqing Timezone = "Asia/Chongqing" + AsiaChungking Timezone = "Asia/Chungking" + AsiaColombo Timezone = "Asia/Colombo" + AsiaDacca Timezone = "Asia/Dacca" + AsiaDamascus Timezone = "Asia/Damascus" + AsiaDhaka Timezone = "Asia/Dhaka" + AsiaDili Timezone = "Asia/Dili" + AsiaDubai Timezone = "Asia/Dubai" + AsiaDushanbe Timezone = "Asia/Dushanbe" + AsiaFamagusta Timezone = "Asia/Famagusta" + AsiaGaza Timezone = "Asia/Gaza" + AsiaHarbin Timezone = "Asia/Harbin" + AsiaHebron Timezone = "Asia/Hebron" + AsiaHoChiMinh Timezone = "Asia/Ho_Chi_Minh" + AsiaHongKong Timezone = "Asia/Hong_Kong" + AsiaHovd Timezone = "Asia/Hovd" + AsiaIrkutsk Timezone = "Asia/Irkutsk" + AsiaIstanbul Timezone = "Asia/Istanbul" + AsiaJakarta Timezone = "Asia/Jakarta" + AsiaJayapura Timezone = "Asia/Jayapura" + AsiaJerusalem Timezone = "Asia/Jerusalem" + AsiaKabul Timezone = "Asia/Kabul" + AsiaKamchatka Timezone = "Asia/Kamchatka" + AsiaKarachi Timezone = "Asia/Karachi" + AsiaKashgar Timezone = "Asia/Kashgar" + AsiaKathmandu Timezone = "Asia/Kathmandu" + AsiaKatmandu Timezone = "Asia/Katmandu" + AsiaKhandyga Timezone = "Asia/Khandyga" + AsiaKolkata Timezone = "Asia/Kolkata" + AsiaKrasnoyarsk Timezone = "Asia/Krasnoyarsk" + AsiaKualaLumpur Timezone = "Asia/Kuala_Lumpur" + AsiaKuching Timezone = "Asia/Kuching" + AsiaKuwait Timezone = "Asia/Kuwait" + AsiaMacao Timezone = "Asia/Macao" + AsiaMacau Timezone = "Asia/Macau" + AsiaMagadan Timezone = "Asia/Magadan" + AsiaMakassar Timezone = "Asia/Makassar" + AsiaManila Timezone = "Asia/Manila" + AsiaMuscat Timezone = "Asia/Muscat" + AsiaNicosia Timezone = "Asia/Nicosia" + AsiaNovokuznetsk Timezone = "Asia/Novokuznetsk" + AsiaNovosibirsk Timezone = "Asia/Novosibirsk" + AsiaOmsk Timezone = "Asia/Omsk" + AsiaOral Timezone = "Asia/Oral" + AsiaPhnomPenh Timezone = "Asia/Phnom_Penh" + AsiaPontianak Timezone = "Asia/Pontianak" + AsiaPyongyang Timezone = "Asia/Pyongyang" + AsiaQatar Timezone = "Asia/Qatar" + AsiaQostanay Timezone = "Asia/Qostanay" + AsiaQyzylorda Timezone = "Asia/Qyzylorda" + AsiaRangoon Timezone = "Asia/Rangoon" + AsiaRiyadh Timezone = "Asia/Riyadh" + AsiaSaigon Timezone = "Asia/Saigon" + AsiaSakhalin Timezone = "Asia/Sakhalin" + AsiaSamarkand Timezone = "Asia/Samarkand" + AsiaSeoul Timezone = "Asia/Seoul" + AsiaShanghai Timezone = "Asia/Shanghai" + AsiaSingapore Timezone = "Asia/Singapore" + AsiaSrednekolymsk Timezone = "Asia/Srednekolymsk" + AsiaTaipei Timezone = "Asia/Taipei" + AsiaTashkent Timezone = "Asia/Tashkent" + AsiaTbilisi Timezone = "Asia/Tbilisi" + AsiaTehran Timezone = "Asia/Tehran" + AsiaTelAviv Timezone = "Asia/Tel_Aviv" + AsiaThimbu Timezone = "Asia/Thimbu" + AsiaThimphu Timezone = "Asia/Thimphu" + AsiaTokyo Timezone = "Asia/Tokyo" + AsiaTomsk Timezone = "Asia/Tomsk" + AsiaUjungPandang Timezone = "Asia/Ujung_Pandang" + AsiaUlaanbaatar Timezone = "Asia/Ulaanbaatar" + AsiaUlanBator Timezone = "Asia/Ulan_Bator" + AsiaUrumqi Timezone = "Asia/Urumqi" + AsiaUstNera Timezone = "Asia/Ust-Nera" + AsiaVientiane Timezone = "Asia/Vientiane" + AsiaVladivostok Timezone = "Asia/Vladivostok" + AsiaYakutsk Timezone = "Asia/Yakutsk" + AsiaYangon Timezone = "Asia/Yangon" + AsiaYekaterinburg Timezone = "Asia/Yekaterinburg" + AsiaYerevan Timezone = "Asia/Yerevan" + AtlanticAzores Timezone = "Atlantic/Azores" + AtlanticBermuda Timezone = "Atlantic/Bermuda" + AtlanticCanary Timezone = "Atlantic/Canary" + AtlanticCapeVerde Timezone = "Atlantic/Cape_Verde" + AtlanticFaeroe Timezone = "Atlantic/Faeroe" + AtlanticFaroe Timezone = "Atlantic/Faroe" + AtlanticJanMayen Timezone = "Atlantic/Jan_Mayen" + AtlanticMadeira Timezone = "Atlantic/Madeira" + AtlanticReykjavik Timezone = "Atlantic/Reykjavik" + AtlanticSouthGeorgia Timezone = "Atlantic/South_Georgia" + AtlanticStHelena Timezone = "Atlantic/St_Helena" + AtlanticStanley Timezone = "Atlantic/Stanley" + AustraliaACT Timezone = "Australia/ACT" + AustraliaAdelaide Timezone = "Australia/Adelaide" + AustraliaBrisbane Timezone = "Australia/Brisbane" + AustraliaBrokenHill Timezone = "Australia/Broken_Hill" + AustraliaCanberra Timezone = "Australia/Canberra" + AustraliaCurrie Timezone = "Australia/Currie" + AustraliaDarwin Timezone = "Australia/Darwin" + AustraliaEucla Timezone = "Australia/Eucla" + AustraliaHobart Timezone = "Australia/Hobart" + AustraliaLHI Timezone = "Australia/LHI" + AustraliaLindeman Timezone = "Australia/Lindeman" + AustraliaLordHowe Timezone = "Australia/Lord_Howe" + AustraliaMelbourne Timezone = "Australia/Melbourne" + AustraliaNSW Timezone = "Australia/NSW" + AustraliaNorth Timezone = "Australia/North" + AustraliaPerth Timezone = "Australia/Perth" + AustraliaQueensland Timezone = "Australia/Queensland" + AustraliaSouth Timezone = "Australia/South" + AustraliaSydney Timezone = "Australia/Sydney" + AustraliaTasmania Timezone = "Australia/Tasmania" + AustraliaVictoria Timezone = "Australia/Victoria" + AustraliaWest Timezone = "Australia/West" + AustraliaYancowinna Timezone = "Australia/Yancowinna" + BrazilAcre Timezone = "Brazil/Acre" + BrazilDeNoronha Timezone = "Brazil/DeNoronha" + BrazilEast Timezone = "Brazil/East" + BrazilWest Timezone = "Brazil/West" + CanadaAtlantic Timezone = "Canada/Atlantic" + CanadaCentral Timezone = "Canada/Central" + CanadaEastern Timezone = "Canada/Eastern" + CanadaMountain Timezone = "Canada/Mountain" + CanadaNewfoundland Timezone = "Canada/Newfoundland" + CanadaPacific Timezone = "Canada/Pacific" + CanadaSaskatchewan Timezone = "Canada/Saskatchewan" + CanadaYukon Timezone = "Canada/Yukon" + Cet Timezone = "CET" + ChileContinental Timezone = "Chile/Continental" + ChileEasterIsland Timezone = "Chile/EasterIsland" + Cst6Cdt Timezone = "CST6CDT" + Cuba Timezone = "Cuba" + Eet Timezone = "EET" + Egypt Timezone = "Egypt" + Eire Timezone = "Eire" + Est Timezone = "EST" + Est5Edt Timezone = "EST5EDT" + EtcGMT Timezone = "Etc/GMT" + EtcGMT0 Timezone = "Etc/GMT+0" + EtcGMT1 Timezone = "Etc/GMT+1" + EtcGMT10 Timezone = "Etc/GMT+10" + EtcGMT11 Timezone = "Etc/GMT+11" + EtcGMT12 Timezone = "Etc/GMT+12" + EtcGMT13 Timezone = "Etc/GMT-13" + EtcGMT14 Timezone = "Etc/GMT-14" + EtcGMT2 Timezone = "Etc/GMT+2" + EtcGMT3 Timezone = "Etc/GMT+3" + EtcGMT4 Timezone = "Etc/GMT+4" + EtcGMT5 Timezone = "Etc/GMT+5" + EtcGMT6 Timezone = "Etc/GMT+6" + EtcGMT7 Timezone = "Etc/GMT+7" + EtcGMT8 Timezone = "Etc/GMT+8" + EtcGMT9 Timezone = "Etc/GMT+9" + EtcGreenwich Timezone = "Etc/Greenwich" + EtcUCT Timezone = "Etc/UCT" + EtcUTC Timezone = "Etc/UTC" + EtcUniversal Timezone = "Etc/Universal" + EtcZulu Timezone = "Etc/Zulu" + EuropeAmsterdam Timezone = "Europe/Amsterdam" + EuropeAndorra Timezone = "Europe/Andorra" + EuropeAstrakhan Timezone = "Europe/Astrakhan" + EuropeAthens Timezone = "Europe/Athens" + EuropeBelfast Timezone = "Europe/Belfast" + EuropeBelgrade Timezone = "Europe/Belgrade" + EuropeBerlin Timezone = "Europe/Berlin" + EuropeBratislava Timezone = "Europe/Bratislava" + EuropeBrussels Timezone = "Europe/Brussels" + EuropeBucharest Timezone = "Europe/Bucharest" + EuropeBudapest Timezone = "Europe/Budapest" + EuropeBusingen Timezone = "Europe/Busingen" + EuropeChisinau Timezone = "Europe/Chisinau" + EuropeCopenhagen Timezone = "Europe/Copenhagen" + EuropeDublin Timezone = "Europe/Dublin" + EuropeGibraltar Timezone = "Europe/Gibraltar" + EuropeGuernsey Timezone = "Europe/Guernsey" + EuropeHelsinki Timezone = "Europe/Helsinki" + EuropeIsleOfMan Timezone = "Europe/Isle_of_Man" + EuropeIstanbul Timezone = "Europe/Istanbul" + EuropeJersey Timezone = "Europe/Jersey" + EuropeKaliningrad Timezone = "Europe/Kaliningrad" + EuropeKiev Timezone = "Europe/Kiev" + EuropeKirov Timezone = "Europe/Kirov" + EuropeKyiv Timezone = "Europe/Kyiv" + EuropeLisbon Timezone = "Europe/Lisbon" + EuropeLjubljana Timezone = "Europe/Ljubljana" + EuropeLondon Timezone = "Europe/London" + EuropeLuxembourg Timezone = "Europe/Luxembourg" + EuropeMadrid Timezone = "Europe/Madrid" + EuropeMalta Timezone = "Europe/Malta" + EuropeMariehamn Timezone = "Europe/Mariehamn" + EuropeMinsk Timezone = "Europe/Minsk" + EuropeMonaco Timezone = "Europe/Monaco" + EuropeMoscow Timezone = "Europe/Moscow" + EuropeNicosia Timezone = "Europe/Nicosia" + EuropeOslo Timezone = "Europe/Oslo" + EuropeParis Timezone = "Europe/Paris" + EuropePodgorica Timezone = "Europe/Podgorica" + EuropePrague Timezone = "Europe/Prague" + EuropeRiga Timezone = "Europe/Riga" + EuropeRome Timezone = "Europe/Rome" + EuropeSANMarino Timezone = "Europe/San_Marino" + EuropeSamara Timezone = "Europe/Samara" + EuropeSarajevo Timezone = "Europe/Sarajevo" + EuropeSaratov Timezone = "Europe/Saratov" + EuropeSimferopol Timezone = "Europe/Simferopol" + EuropeSkopje Timezone = "Europe/Skopje" + EuropeSofia Timezone = "Europe/Sofia" + EuropeStockholm Timezone = "Europe/Stockholm" + EuropeTallinn Timezone = "Europe/Tallinn" + EuropeTirane Timezone = "Europe/Tirane" + EuropeTiraspol Timezone = "Europe/Tiraspol" + EuropeUlyanovsk Timezone = "Europe/Ulyanovsk" + EuropeUzhgorod Timezone = "Europe/Uzhgorod" + EuropeVaduz Timezone = "Europe/Vaduz" + EuropeVatican Timezone = "Europe/Vatican" + EuropeVienna Timezone = "Europe/Vienna" + EuropeVilnius Timezone = "Europe/Vilnius" + EuropeVolgograd Timezone = "Europe/Volgograd" + EuropeWarsaw Timezone = "Europe/Warsaw" + EuropeZagreb Timezone = "Europe/Zagreb" + EuropeZaporozhye Timezone = "Europe/Zaporozhye" + EuropeZurich Timezone = "Europe/Zurich" + Factory Timezone = "Factory" + GB Timezone = "GB" + GBEire Timezone = "GB-Eire" + Gmt Timezone = "GMT" + Gmt0 Timezone = "GMT+0" + Greenwich Timezone = "Greenwich" + Hongkong Timezone = "Hongkong" + Hst Timezone = "HST" + Iceland Timezone = "Iceland" + IndianAntananarivo Timezone = "Indian/Antananarivo" + IndianChagos Timezone = "Indian/Chagos" + IndianChristmas Timezone = "Indian/Christmas" + IndianCocos Timezone = "Indian/Cocos" + IndianComoro Timezone = "Indian/Comoro" + IndianKerguelen Timezone = "Indian/Kerguelen" + IndianMahe Timezone = "Indian/Mahe" + IndianMaldives Timezone = "Indian/Maldives" + IndianMauritius Timezone = "Indian/Mauritius" + IndianMayotte Timezone = "Indian/Mayotte" + IndianReunion Timezone = "Indian/Reunion" + Iran Timezone = "Iran" + Israel Timezone = "Israel" + Jamaica Timezone = "Jamaica" + Japan Timezone = "Japan" + Kwajalein Timezone = "Kwajalein" + Libya Timezone = "Libya" + Met Timezone = "MET" + MexicoBajaNorte Timezone = "Mexico/BajaNorte" + MexicoBajaSur Timezone = "Mexico/BajaSur" + MexicoGeneral Timezone = "Mexico/General" + Mst Timezone = "MST" + Mst7Mdt Timezone = "MST7MDT" + Navajo Timezone = "Navajo" + Nz Timezone = "NZ" + NzChat Timezone = "NZ-CHAT" + PacificApia Timezone = "Pacific/Apia" + PacificAuckland Timezone = "Pacific/Auckland" + PacificBougainville Timezone = "Pacific/Bougainville" + PacificChatham Timezone = "Pacific/Chatham" + PacificChuuk Timezone = "Pacific/Chuuk" + PacificEaster Timezone = "Pacific/Easter" + PacificEfate Timezone = "Pacific/Efate" + PacificEnderbury Timezone = "Pacific/Enderbury" + PacificFakaofo Timezone = "Pacific/Fakaofo" + PacificFiji Timezone = "Pacific/Fiji" + PacificFunafuti Timezone = "Pacific/Funafuti" + PacificGalapagos Timezone = "Pacific/Galapagos" + PacificGambier Timezone = "Pacific/Gambier" + PacificGuadalcanal Timezone = "Pacific/Guadalcanal" + PacificGuam Timezone = "Pacific/Guam" + PacificHonolulu Timezone = "Pacific/Honolulu" + PacificJohnston Timezone = "Pacific/Johnston" + PacificKanton Timezone = "Pacific/Kanton" + PacificKiritimati Timezone = "Pacific/Kiritimati" + PacificKosrae Timezone = "Pacific/Kosrae" + PacificKwajalein Timezone = "Pacific/Kwajalein" + PacificMajuro Timezone = "Pacific/Majuro" + PacificMarquesas Timezone = "Pacific/Marquesas" + PacificMidway Timezone = "Pacific/Midway" + PacificNauru Timezone = "Pacific/Nauru" + PacificNiue Timezone = "Pacific/Niue" + PacificNorfolk Timezone = "Pacific/Norfolk" + PacificNoumea Timezone = "Pacific/Noumea" + PacificPagoPago Timezone = "Pacific/Pago_Pago" + PacificPalau Timezone = "Pacific/Palau" + PacificPitcairn Timezone = "Pacific/Pitcairn" + PacificPohnpei Timezone = "Pacific/Pohnpei" + PacificPonape Timezone = "Pacific/Ponape" + PacificPortMoresby Timezone = "Pacific/Port_Moresby" + PacificRarotonga Timezone = "Pacific/Rarotonga" + PacificSaipan Timezone = "Pacific/Saipan" + PacificSamoa Timezone = "Pacific/Samoa" + PacificTahiti Timezone = "Pacific/Tahiti" + PacificTarawa Timezone = "Pacific/Tarawa" + PacificTongatapu Timezone = "Pacific/Tongatapu" + PacificTruk Timezone = "Pacific/Truk" + PacificWake Timezone = "Pacific/Wake" + PacificWallis Timezone = "Pacific/Wallis" + PacificYap Timezone = "Pacific/Yap" + Poland Timezone = "Poland" + Portugal Timezone = "Portugal" + Prc Timezone = "PRC" + Pst8Pdt Timezone = "PST8PDT" + PurpleEtcGMT0 Timezone = "Etc/GMT0" + PurpleGMT0 Timezone = "GMT0" + Roc Timezone = "ROC" + Rok Timezone = "ROK" + Singapore Timezone = "Singapore" + TimezoneEtcGMT0 Timezone = "Etc/GMT-0" + TimezoneEtcGMT1 Timezone = "Etc/GMT-1" + TimezoneEtcGMT10 Timezone = "Etc/GMT-10" + TimezoneEtcGMT11 Timezone = "Etc/GMT-11" + TimezoneEtcGMT12 Timezone = "Etc/GMT-12" + TimezoneEtcGMT2 Timezone = "Etc/GMT-2" + TimezoneEtcGMT3 Timezone = "Etc/GMT-3" + TimezoneEtcGMT4 Timezone = "Etc/GMT-4" + TimezoneEtcGMT5 Timezone = "Etc/GMT-5" + TimezoneEtcGMT6 Timezone = "Etc/GMT-6" + TimezoneEtcGMT7 Timezone = "Etc/GMT-7" + TimezoneEtcGMT8 Timezone = "Etc/GMT-8" + TimezoneEtcGMT9 Timezone = "Etc/GMT-9" + TimezoneGMT0 Timezone = "GMT-0" + Turkey Timezone = "Turkey" + USAlaska Timezone = "US/Alaska" + USAleutian Timezone = "US/Aleutian" + USArizona Timezone = "US/Arizona" + USCentral Timezone = "US/Central" + USEastIndiana Timezone = "US/East-Indiana" + USEastern Timezone = "US/Eastern" + USHawaii Timezone = "US/Hawaii" + USIndianaStarke Timezone = "US/Indiana-Starke" + USMichigan Timezone = "US/Michigan" + USMountain Timezone = "US/Mountain" + USPacific Timezone = "US/Pacific" + USSamoa Timezone = "US/Samoa" + UTC Timezone = "UTC" + Uct Timezone = "UCT" + Universal Timezone = "Universal" + WSu Timezone = "W-SU" + Wet Timezone = "WET" + Zulu Timezone = "Zulu" +) diff --git a/models/golang/common/functions.go b/models/golang/common/functions.go new file mode 100644 index 00000000..2505efde --- /dev/null +++ b/models/golang/common/functions.go @@ -0,0 +1,18 @@ +package common + +import "encoding/json" + + +func IsValidFeedName(name string) bool { + switch FeedName(name) { + case Feed_FreeBikeStatus, Feed_GbfsVersions, Feed_GeofencingZones, Feed_Gbfs, Feed_StationInformation, Feed_StationStatus, Feed_SystemAlerts, Feed_SystemCalendar, Feed_SystemHours, Feed_SystemInformation, Feed_SystemPricingPlans, Feed_SystemRegions, Feed_VehicleStatus, Feed_VehicleTypes, Feed_Manifest: + return true + } + return false +} + +func UnmarshalVersion(data []byte) (VersionStruct, error) { + var r VersionStruct + err := json.Unmarshal(data, &r) + return r, err +} \ No newline at end of file diff --git a/models/golang/common/types.go b/models/golang/common/types.go new file mode 100644 index 00000000..2f83ec73 --- /dev/null +++ b/models/golang/common/types.go @@ -0,0 +1,257 @@ +package common + +// Country code following the ISO 3166-1 alpha-2 notation. +type CountryCode string + +// A date in the ISO 8601 Complete Date Extended Format: YYYY-MM-DD. Example: 2019-09-13 for September 13th, 2019. +// JSON unmarshaling in Go does not allow the ISO 8601 Complete Date Extended Format to be represented as a time.Time type directly. +// Therefore, we use a String type for this purpose to ensure compatibility with the JSON format and avoid +// introducing additional complexity in the unmarshaling process. +type Date string + +// Combination of a date and a time following ISO 8601 notation. Attributes : year, month, day, hour, minute, second, and timezone. +// Date and time fields MUST be represented as strings in the ISO 8601 format (YYYY-MM-DDThh:mm:ssZ). +// For example, 2023-10-01T12:00:00Z represents October 1st, 2023 at 12:00 PM UTC. +// The time zone is represented by the Z at the end of the string, indicating that the time is in UTC. +type DateTime string + +// An email address. Example: example@example.com +type Email string + +// ID - Should be represented as a string that identifies that particular entity. An ID: +// +// MUST be unique within like fields (for example, station_id MUST be unique among stations) +// Does not have to be globally unique, unless otherwise specified +// MUST be in the ASCII printable character range, space excluded (0x21 to 0x7E) https://en.wikipedia.org/wiki/ASCII#Printable_characters (as of v3.0) +// SHOULD be restricted to A-Z, a-z, 0-9 and .@:/_- (as of v3.0) +// MUST be persistent for a given entity (station, plan, etc.). An exception is vehicle_id, which MUST NOT be persistent for privacy reasons (see vehicle_status.json). (as of v2.0) +type ID string + +// An IETF BCP 47 language code. For an introduction to IETF BCP 47, refer to https://www.rfc-editor.org/rfc/bcp/bcp47.txt and https://www.w3.org/International/articles/language-tags/. +// Examples: en for English, en-US for American English, or de for German. +type Language string + +// WGS84 latitude in decimal degrees. The value MUST be greater than or equal to -90.0 and less than or equal to 90.0. Example: 41.890169 for the Colosseum in Rome. +type Latitude float64 + +// WGS84 longitude in decimal degrees. The value MUST be greater than or equal to -180.0 and less than or equal to 180.0. Example: 12.492269 for the Colosseum in Rome. +type Longitude float64 + +// A JSON element representing a String value that has been translated into a specific language. (as of v3.0) +// The element consists of the following name-value pairs: +type LocalizedString struct { + // The translated text. + Text string `json:"text"` + // IETF BCP 47 language code. + Language Language `json:"language"` +} + +// A JSON element representing the URL of a resource that has been translated into a specific language. (as of v3.0) +// The element consists of the following name-value pairs: +type LocalizedURL struct { + // The URL of the resource. + Text URL `json:"text"` + // IETF BCP 47 language code. + Language Language `json:"language"` +} + +// Phone number in E.164 format. The phone number MUST start with a "+". The characters following the "+" MUST be integers and MUST NOT contain any hyphens, spaces or parentheses. (as of v3.0) +// For version 2.3 the same type is used despite not being defined in https://github.com/MobilityData/gbfs/blob/v2.3/gbfs.md#field-types although it is referenced in the spec (https://github.com/MobilityData/gbfs/blob/v2.3/gbfs.md#system_informationjson and https://github.com/MobilityData/gbfs/blob/v2.3/gbfs.md#station_informationjson) +// Also the type used in the examples for system_information.json and station_information.json is a string ensuring compatibility. +// See https://github.com/MobilityData/gbfs/issues/789 for more information. +type PhoneNumber string + +// TZ timezone from the https://www.iana.org/time-zones. Timezone names never contain the space character but MAY contain an underscore. +// Refer to https://en.wikipedia.org/wiki/List_of_tz_zones for a list of valid values. Example: Asia/Tokyo, America/Los_Angeles or Africa/Cairo. +type Timezone string + +// A fully qualified URI that includes the scheme (for example, com.example.android://). Any special characters in the URI MUST be correctly escaped. +// See the following https://www.w3.org/Addressing/URL/4_URI_Recommentations.html for a description of how to create fully qualified URI values. Note that URIs MAY be URLs. +type URI string + +// A fully qualified URL that includes http:// or https://. Any special characters in the URL MUST be correctly escaped. +// See the following https://www.w3.org/Addressing/URL/4_URI_Recommentations.html for a description of how to create fully qualified URL values. +type URL string + +// Timestamp fields MUST be represented as integers in POSIX time (representing the number of seconds since January 1st 1970 00:00:00 UTC). (before v3.0) +type PosixTimestamp int64 + +// Timestamp fields MUST be represented as strings in RFC3339 format, for example 2023-07-17T13:34:13+02:00. (as of v3.0) +type Timestamp string + +// The semantic version of the feed in the form X.Y +type Version string + +// Feed is a JSON element representing a feed in the GBFS specification. +type Feed struct { + Name FeedName `json:"name"` + URL URL `json:"url"` +} + +// Key identifying the type of feed this is. The key MUST be the base file name defined in the spec for the corresponding feed type +// ( system_information for system_information.json file, station_information for station_information.json file). +type FeedName string + +type VersionStruct struct { + // GBFS version number to which the feed conforms, according to the versioning framework. (added in v1.1 -> therefore it is optional) + Version *Version `json:"version,omitempty"` +} + +type Header[T any] struct { + LastUpdated T `json:"last_updated"` + Ttl uint64 `json:"ttl"` + Version Version `json:"version"` +} + +type VersionElement struct { + // URL of the corresponding gbfs.json endpoint + URL URL `json:"url"` + // The semantic version of the feed in the form X.Y + Version Version `json:"version"` +} + +// Payment methods accepted at this station. +type RentalMethod string + +// Vehicle equipment provided by the operator in addition to the accessories already +// provided in the vehicle (field vehicle_accessories of vehicle_types.json) but subject to more frequent updates. +type VehicleEquipment string + +// Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added +// in v1.1). +type RentalUris struct { + // URI that can be passed to an Android app with an intent (added in v1.1). + Android *URI `json:"android,omitempty"` + // URI that can be used on iOS to launch the rental app for this station (added in v1.1). + Ios *URI `json:"ios,omitempty"` + // URL that can be used by a web browser to show more information about renting a vehicle at + // this station (added in v1.1). + Web *URI `json:"web,omitempty"` +} + +// This indicates that this set of rental hours applies to either members or non-members only. +type UserType string + +// Day of the week. +type Day string + +// Type of parking station. Added in v2.3 +type ParkingType string + +// Type of system alert. +type Type string + +// REQUIRED if the dataset is provided under a standard license. An identifier for a +// standard license from the SPDX License List. Provide license_id rather than license_url +// if the license is included in the SPDX License List. See the GBFS wiki for a comparison +// of a subset of standard licenses. If the license_id and license_url fields are blank or +// omitted, this indicates that the feed is provided under the Creative Commons Universal +// Public Domain Dedication. +type LicenseID string + +// Contains rental app information in the android and ios JSON objects. +type RentalApps struct { + Android *RentalApp `json:"android,omitempty"` + IOS *RentalApp `json:"ios,omitempty"` +} + +// RentalApp contains the URIs for the store and discovery of the rental app. +type RentalApp struct { + StoreUri URI `json:"store_uri"` + DiscoveryUri URI `json:"discovery_uri"` +} + + +// An object where each key defines one of the items listed below (added in v2.3-RC). +type BrandAssets struct { + // A fully qualified URL pointing to the location of a graphic file representing the brand + // for the service (added in v2.3-RC). + BrandImageURL URL `json:"brand_image_url"` + // A fully qualified URL pointing to the location of a graphic file representing the brand + // for the service for use in dark mode (added in v2.3-RC). + BrandImageURLDark *URL `json:"brand_image_url_dark,omitempty"` + // Date that indicates the last time any included brand assets were updated (added in + // v2.3-RC). + BrandLastModified Date `json:"brand_last_modified"` + // A fully qualified URL pointing to the location of a page that defines the license terms + // of brand icons, colors or other trademark information (added in v2.3-RC). + BrandTermsURL *URL `json:"brand_terms_url,omitempty"` + // Color used to represent the brand for the service (added in v2.3-RC) + Color *string `json:"color,omitempty"` +} + +// Array of segments when the price is a function of distance traveled, displayed in kilometers. +// Total cost is the addition of price and all segments in per_km_pricing and per_min_pricing. +// If this array is not provided, there are no variable costs based on distance. (added in v2.2). +type PerKMPricing struct { + // The kilometer at which the rate will no longer apply (exclusive) for example, if end is 20 the rate no longer applies at 20.00 km. + // If this field is empty, the price issued for this segment is charged until the trip ends, + // in addition to the cost of any subsequent segments. (added in v2.2). + End *uint64 `json:"end,omitempty"` + // REQUIRED if per_km_pricing is defined. Interval in kilometers at which the rate of this segment + // is either reapplied indefinitely, or if defined, up until (but not including) end kilometer. + // An interval of 0 indicates the rate is only charged once. (added in v2.2). + Interval uint64 `json:"interval"` + // REQUIRED if per_km_pricing is defined. Rate that is charged for each kilometer interval after the start. + // Can be a negative number, which indicates that the traveler will receive a discount. (added in v2.2). + Rate float64 `json:"rate"` + // REQUIRED if per_km_pricing is defined. The kilometer at which this segment rate starts being charged (inclusive). + // (added in v2.2). + Start uint64 `json:"start"` +} + +// Array of segments when the price is a function of time traveled, displayed in minutes. +// Total cost is the addition of price and all segments in per_km_pricing and per_min_pricing. +// If this array is not provided, there are no variable costs based on time. (added in v2.2).c +type PerMinPricing struct { + // The minute at which the rate will no longer apply (exclusive) for example, + // if end is 20 the rate no longer applies after 19:59. If this field is empty, + // the price issued for this segment is charged until the trip ends, + // in addition to the cost of any subsequent segments. (added in v2.2). + End *uint64 `json:"end,omitempty"` + // REQUIRED if per_min_pricing is defined. Interval in minutes at which the rate of this + // segment is either reapplied indefinitely, or up until (but not including) the end minute, + // if end is defined. An interval of 0 indicates the rate is only charged once. (added in v2.2). + Interval uint64 `json:"interval"` + // REQUIRED if per_min_pricing is defined. Rate that is charged for each minute interval after the start. + // Can be a negative number, which indicates that the traveler will receive a discount. (added in v2.2). + Rate float64 `json:"rate"` + // REQUIRED if per_min_pricing is defined. The minute at which this segment rate starts being charged (inclusive). (added in v2.2). + Start uint64 `json:"start"` +} + +// Vehicle air quality certificate. Official anti-pollution certificate, based on the information on the vehicle's +// registration certificate, attesting to its level of pollutant emissions based on a defined standard. In Europe, +// for example, it is the European emission standard. The aim of this measure is to encourage the use of the least +// polluting vehicles by allowing them to drive during pollution peaks or in low emission zones. +type EcoLabel struct { + // Country code following the ISO 3166-1 alpha-2 notation. Added in v2.3. + CountryCode *CountryCode `json:"country_code,omitempty"` + // Name of the eco label. Added in v2.3. + EcoSticker *string `json:"eco_sticker,omitempty"` +} + +// An object where each key defines one of the items listed below added in v2.3-RC. +type VehicleAssets struct { + // Date that indicates the last time any included vehicle icon images were modified or + // updated added in v2.3-RC. + IconLastModified Date `json:"icon_last_modified"` + // A fully qualified URL pointing to the location of a graphic icon file that MAY be used to + // represent this vehicle type on maps and in other applications added in v2.3-RC. + IconURL URL `json:"icon_url"` + // A fully qualified URL pointing to the location of a graphic icon file to be used to + // represent this vehicle type when in dark mode added in v2.3-RC. + IconURLDark *URL `json:"icon_url_dark,omitempty"` +} + +// The vehicle's general form factor. +type FormFactor string + +// The primary propulsion type of the vehicle. Updated in v2.3 to represent car-sharing +type PropulsionType string + +// The conditions for returning the vehicle at the end of the trip. Added in v2.3-RC as +// return_type, and updated to return_constraint in v2.3. +type ReturnConstraint string + +type VehicleAccessory string diff --git a/models/golang/examples/unmarshal.go b/models/golang/examples/unmarshal.go new file mode 100644 index 00000000..a30b4108 --- /dev/null +++ b/models/golang/examples/unmarshal.go @@ -0,0 +1,37 @@ +package main + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/gbfs" +) + +func ExampleUnmarshal() { + endpoint := "https://gbfs.api.ridedott.com/public/v2/mannheim/gbfs.json" + + fmt.Println("=== GBFS Codec Example ===") + + resp, err := http.Get(endpoint) + if err != nil { + log.Fatal("Failed to fetch GBFS:", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + log.Fatalf("Failed to fetch GBFS: %s", resp.Status) + } + + var gbfsFeed gbfs.Gbfs + if err := json.NewDecoder(resp.Body).Decode(&gbfsFeed); err != nil { + log.Fatal("Failed to unmarshal GBFS:", err) + } + + fmt.Printf("Successfully unmarshaled GBFS feed (version: %s)\n", gbfsFeed.Version) +} + +func main() { + ExampleUnmarshal() +} diff --git a/models/golang/go.mod b/models/golang/go.mod index 4d447d7a..b8e8ef7a 100644 --- a/models/golang/go.mod +++ b/models/golang/go.mod @@ -1,9 +1,15 @@ -module github.com/MobilityData/gbfs-json-schema/models/golang +module github.com/MobilityData/gbfs-json-schema/models/golang go 1.22.3 +require github.com/xeipuuv/gojsonschema v1.2.0 + require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/paulmach/orb v0.11.1 // indirect + github.com/stretchr/testify v1.6.1 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xeipuuv/gojsonschema v1.2.0 // indirect + go.mongodb.org/mongo-driver v1.11.4 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/models/golang/go.sum b/models/golang/go.sum index a892594b..4811e984 100644 --- a/models/golang/go.sum +++ b/models/golang/go.sum @@ -1,12 +1,32 @@ -github.com/Kangaroux/go-map-schema v0.6.1 h1:jXpOzi7kNFC6M8QSvJuI7xeDxObBrVHwA3D6vSrxuG4= -github.com/Kangaroux/go-map-schema v0.6.1/go.mod h1:56jN+6h/N8Pmn5D+JL9gREOvZTlVEAvXtXyLd/NRjh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= +github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= +github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -14,5 +34,49 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas= +go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/models/golang/tests/common.go b/models/golang/tests/common.go new file mode 100644 index 00000000..6d2c7fcc --- /dev/null +++ b/models/golang/tests/common.go @@ -0,0 +1,58 @@ +package tests + +import ( + "encoding/json" + "fmt" + "os" + "testing" + + "github.com/xeipuuv/gojsonschema" +) + +// Test fixture path constants for different GBFS versions +const ( + TestFixturesV23 = "./../../../testFixtures/v2.3/" + TestFixturesV30 = "./../../../testFixtures/v3.0/" + TestFixturesV31RC = "./../../../testFixtures/v3.1-RC/" + TestFixturesV31RC2 = "./../../../testFixtures/v3.1-RC2/" +) + +// loadSchemaAndFixture loads a JSON schema and test fixture file, +// returning a schema loader and the fixture data for validation testing. +func loadSchemaAndFixture(t *testing.T, schemaPath string, fixturePath string) (gojsonschema.JSONLoader, []byte) { + schemaDataBytes, err := os.ReadFile(schemaPath) + if err != nil { + t.Fatalf("Failed to read schema file %s: %v", schemaPath, err) + } + + var schemaData map[string]interface{} + if err := json.Unmarshal(schemaDataBytes, &schemaData); err != nil { + t.Fatalf("Failed to unmarshal schema file %s: %v", schemaPath, err) + } + + schemaLoader := gojsonschema.NewGoLoader(schemaData) + + jsonData, err := os.ReadFile(fixturePath) + if err != nil { + t.Fatalf("Failed to read fixture file %s: %v", fixturePath, err) + } + + return schemaLoader, jsonData +} + +// validateSchemaToUnmarshal validates that the provided GBFS data +// conforms to the given JSON schema, reporting any validation errors. +func validateSchemaToUnmarshal(t *testing.T, schemaLoader gojsonschema.JSONLoader, gbfsData interface{}) { + loader := gojsonschema.NewGoLoader(gbfsData) + result, err := gojsonschema.Validate(schemaLoader, loader) + if err != nil { + t.Fatalf("Failed to validate JSON schema: %v", err) + } + + if !result.Valid() { + t.Error("The JSON is NOT valid:") + for _, desc := range result.Errors() { + fmt.Printf("- %s\n", desc) + } + } +} diff --git a/models/golang/tests/gbfsv23_test.go b/models/golang/tests/gbfsv23_test.go new file mode 100644 index 00000000..acf803a2 --- /dev/null +++ b/models/golang/tests/gbfsv23_test.go @@ -0,0 +1,197 @@ +package tests + +import ( + "encoding/json" + "testing" + + freebikestatus "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/free_bike_status" + gbfs "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/gbfs" + gbfsversions "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/gbfs_versions" + geofencingzones "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/geofencing_zones" + stationinformation "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/station_information" + stationstatus "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/station_status" + systemalerts "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/system_alerts" + systemcalendar "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/system_calendar" + systemhours "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/system_hours" + systeminformation "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/system_information" + systempricingplans "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/system_pricing_plans" + systemregions "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/system_regions" + vehicle_types "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/vehicle_types" +) + + +func TestGbfs23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/gbfs.json", TestFixturesV23+"gbfs.json") + var gbfsData gbfs.Gbfs + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestGbfsVersions23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/gbfs_versions.json", TestFixturesV23+"gbfs_versions.json") + var gbfsData gbfsversions.GbfsVersions + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestGeofencingZones23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/geofencing_zones.json", TestFixturesV23+"geofencing_zones.json") + var gbfsData geofencingzones.GeofencingZones + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestStationInformationPhysical23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/station_information.json", TestFixturesV23+"station_information_physical_station.json") + var gbfsData stationinformation.StationInformation + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestStationInformationVirtual23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/station_information.json", TestFixturesV23+"station_information_virtual_station.json") + var gbfsData stationinformation.StationInformation + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestStationStatus23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/station_status.json", TestFixturesV23+"station_status.json") + var gbfsData stationstatus.StationStatus + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemAlerts23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/system_alerts.json", TestFixturesV23+"system_alerts.json") + var gbfsData systemalerts.SystemAlerts + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemInformation23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/system_information.json", TestFixturesV23+"system_information.json") + var gbfsData systeminformation.SystemInformation + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemPricingPlanA23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/system_pricing_plans.json", TestFixturesV23+"system_pricing_plans_a.json") + var gbfsData systempricingplans.SystemPricingPlans + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemPricingPlanB23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/system_pricing_plans.json", TestFixturesV23+"system_pricing_plans_b.json") + var gbfsData systempricingplans.SystemPricingPlans + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemRegions23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/system_regions.json", TestFixturesV23+"system_regions.json") + var gbfsData systemregions.SystemRegions + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemCalendar23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/system_calendar.json", TestFixturesV23+"system_calendar.json") + var gbfsData systemcalendar.SystemCalendar + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemOperatingHours23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/system_hours.json", TestFixturesV23+"system_hours.json") + var gbfsData systemhours.SystemHours + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestFreeBikeStatusCarsharing23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/free_bike_status.json", TestFixturesV23+"free_bike_status_carsharing.json") + var gbfsData freebikestatus.FreeBikeStatus + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestFreeBikeStatusMicromobility23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/free_bike_status.json", TestFixturesV23+"free_bike_status_micromobility.json") + var gbfsData freebikestatus.FreeBikeStatus + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestVehicleTypes23(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v2.3/vehicle_types.json", TestFixturesV23+"vehicle_types.json") + var gbfsData vehicle_types.VehicleTypes + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} \ No newline at end of file diff --git a/models/golang/tests/gbfsv30_test.go b/models/golang/tests/gbfsv30_test.go index 46b0bf38..b5cbee7a 100644 --- a/models/golang/tests/gbfsv30_test.go +++ b/models/golang/tests/gbfsv30_test.go @@ -2,8 +2,6 @@ package tests import ( "encoding/json" - "fmt" - "os" "testing" gbfs "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/gbfs" @@ -18,167 +16,169 @@ import ( systemregions "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/system_regions" vehiclestatus "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/vehicle_status" vehicletypes "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/vehicle_types" - - "github.com/xeipuuv/gojsonschema" ) -const pathToTestFixtures = "./../../../testFixtures/v3.0/" - -func LoadSchemaAndFixture(t *testing.T, fileName string) (gojsonschema.JSONLoader, []byte) { - - pathToSchema := "./../../../v3.0/" - schemaDataBytes, schemaErr := os.ReadFile(pathToSchema + fileName) - if schemaErr != nil { - t.Error("Error opening JSON file:", schemaErr) - return nil, nil - } - var schemaData map[string]interface{} - schemaErr = json.Unmarshal(schemaDataBytes, &schemaData) - if schemaErr != nil { - t.Error("Error opening JSON file:", schemaErr) - return nil, nil - } - schemaLoader := gojsonschema.NewGoLoader(schemaData) - jsonData, err2 := os.ReadFile(pathToTestFixtures + fileName) - if err2 != nil { - t.Error("Error opening JSON file:", err2) - return nil, nil +func TestGbfs30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/gbfs.json", TestFixturesV30+"gbfs.json") + var gbfsData gbfs.Gbfs + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return } - return schemaLoader, jsonData + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func ValidateSchemaToUnmarshal(t *testing.T, schemaLoader gojsonschema.JSONLoader, gbfsData interface{}) { - loader := gojsonschema.NewGoLoader(gbfsData) - result, err3 := gojsonschema.Validate(schemaLoader, loader) - if err3 != nil { - t.Error("Error validating JSON file:", err3) +func TestGbfsVersions30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/gbfs_versions.json", TestFixturesV30+"gbfs_versions.json") + var gbfsData gbfsversions.GbfsVersions + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) return } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} - if !result.Valid() { - t.Error("The JSON is NOT valid:") - for _, desc := range result.Errors() { - fmt.Printf("- %s\n", desc) - } +func TestGeofencingZones30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/geofencing_zones.json", TestFixturesV30+"geofencing_zones.json") + var gbfsData geofencingzones.GeofencingZones + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestGbfs(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "gbfs.json") - gbfsData, err := gbfs.UnmarshalGbfs(jsonData) +func TestManifest30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/manifest.json", TestFixturesV30+"manifest.json") + var gbfsData manifest.Manifest + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { - t.Error("Error With Unmarshal:", err) + t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestGbfsVersions(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "gbfs_versions.json") - gbfsData, err := gbfsversions.UnmarshalGbfsVersions(jsonData) +func TestStationInformationPhysicalLimitedHoursOfOperation30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/station_information.json", TestFixturesV30+"station_information_physical_station_limited_hours_of_operation.json") + var gbfsData stationinformation.StationInformation + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestGeofencingZones(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "geofencing_zones.json") - gbfsData, err := geofencingzones.UnmarshalGeofencingZones(jsonData) +func TestStationInformationVirtual30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/station_information.json", TestFixturesV30+"station_information_virtual_station.json") + var gbfsData stationinformation.StationInformation + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestManifest(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "manifest.json") - gbfsData, err := manifest.UnmarshalManifest(jsonData) +func TestStationStatus30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/station_status.json", TestFixturesV30+"station_status.json") + var gbfsData stationstatus.StationStatus + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestStationInformation(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "station_information.json") - gbfsData, err := stationinformation.UnmarshalStationInformation(jsonData) +func TestSystemAlerts30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/system_alerts.json", TestFixturesV30+"system_alerts.json") + var gbfsData systemalerts.SystemAlerts + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestStationStatus(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "station_status.json") - gbfsData, err := stationstatus.UnmarshalStationStatus(jsonData) +func TestSystemInformation30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/system_information.json", TestFixturesV30+"system_information.json") + var gbfsData systeminformation.SystemInformation + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestSystemAlerts(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "system_alerts.json") - gbfsData, err := systemalerts.UnmarshalSystemAlerts(jsonData) +func TestSystemPricingPlanA30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/system_pricing_plans.json", TestFixturesV30+"system_pricing_plans_a.json") + var gbfsData systempricingplans.SystemPricingPlans + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestSystemInformation(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "system_information.json") - gbfsData, err := systeminformation.UnmarshalSystemInformation(jsonData) +func TestSystemPricingPlan30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/system_pricing_plans.json", TestFixturesV30+"system_pricing_plans_b.json") + var gbfsData systempricingplans.SystemPricingPlans + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestSystemPricingPlan(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "system_pricing_plans.json") - gbfsData, err := systempricingplans.UnmarshalSystemPricingPlans(jsonData) +func TestSystemRegions30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/system_regions.json", TestFixturesV30+"system_regions.json") + var gbfsData systemregions.SystemRegions + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestSystemRegions(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "system_regions.json") - gbfsData, err := systemregions.UnmarshalSystemRegions(jsonData) +func TestVehicleStatusCarsharing30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/vehicle_status.json", TestFixturesV30+"vehicle_status_carsharing.json") + var gbfsData vehiclestatus.VehicleStatus + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestVehicleStatus(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "vehicle_status.json") - gbfsData, err := vehiclestatus.UnmarshalVehicleStatus(jsonData) +func TestVehicleStatusMicromobility30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/vehicle_status.json", TestFixturesV30+"vehicle_status_micromobility.json") + var gbfsData vehiclestatus.VehicleStatus + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } -func TestVehicleTypes(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixture(t, "vehicle_types.json") - gbfsData, err := vehicletypes.UnmarshalVehicleTypes(jsonData) +func TestVehicleTypes30(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.0/vehicle_types.json", TestFixturesV30+"vehicle_types.json") + var gbfsData vehicletypes.VehicleTypes + err := json.Unmarshal(jsonData, &gbfsData) if err != nil { t.Error("Error UnmarshalGbfs:", err) return } - ValidateSchemaToUnmarshal(t, schemaLoader, gbfsData) + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) } diff --git a/models/golang/tests/gbfsv31-RC2_test.go b/models/golang/tests/gbfsv31-RC2_test.go new file mode 100644 index 00000000..8ad99c98 --- /dev/null +++ b/models/golang/tests/gbfsv31-RC2_test.go @@ -0,0 +1,196 @@ +package tests + +import ( + "encoding/json" + "testing" + + gbfs "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/gbfs" + gbfsversions "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/gbfs_versions" + geofencingzones "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/geofencing_zones" + manifest "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/manifest" + stationinformation "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/station_information" + stationstatus "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/station_status" + systemalerts "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/system_alerts" + systeminformation "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/system_information" + systempricingplans "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/system_pricing_plans" + systemregions "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/system_regions" + vehicleavailability "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/vehicle_availability" + vehiclestatus "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/vehicle_status" + vehicletypes "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/vehicle_types" +) + +func TestGbfs31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/gbfs.json", TestFixturesV31RC2+"gbfs.json") + var gbfsData gbfs.Gbfs + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestGbfsVersions31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/gbfs_versions.json", TestFixturesV31RC2+"gbfs_versions.json") + var gbfsData gbfsversions.GbfsVersions + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestGeofencingZones31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/geofencing_zones.json", TestFixturesV31RC2+"geofencing_zones.json") + var gbfsData geofencingzones.GeofencingZones + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestManifest31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/manifest.json", TestFixturesV31RC2+"manifest.json") + var gbfsData manifest.Manifest + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestStationInformationPhysicalLimitedHoursOfOperation31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/station_information.json", TestFixturesV31RC2+"station_information_physical_station_limited_hours_of_operation.json") + var gbfsData stationinformation.StationInformation + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestStationInformationVirtual31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/station_information.json", TestFixturesV31RC2+"station_information_virtual_station.json") + var gbfsData stationinformation.StationInformation + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestStationStatus31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/station_status.json", TestFixturesV31RC2+"station_status.json") + var gbfsData stationstatus.StationStatus + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemAlerts31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/system_alerts.json", TestFixturesV31RC2+"system_alerts.json") + var gbfsData systemalerts.SystemAlerts + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemInformation31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/system_information.json", TestFixturesV31RC2+"system_information.json") + var gbfsData systeminformation.SystemInformation + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemPricingPlanA31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/system_pricing_plans.json", TestFixturesV31RC2+"system_pricing_plans_a.json") + var gbfsData systempricingplans.SystemPricingPlans + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemPricingPlan31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/system_pricing_plans.json", TestFixturesV31RC2+"system_pricing_plans_b.json") + var gbfsData systempricingplans.SystemPricingPlans + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestSystemRegions31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/system_regions.json", TestFixturesV31RC2+"system_regions.json") + var gbfsData systemregions.SystemRegions + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestVehicleStatusCarsharing31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/vehicle_status.json", TestFixturesV31RC2+"vehicle_status_carsharing.json") + var gbfsData vehiclestatus.VehicleStatus + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestVehicleStatusMicromobility31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/vehicle_status.json", TestFixturesV31RC2+"vehicle_status_micromobility.json") + var gbfsData vehiclestatus.VehicleStatus + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestVehicleTypes31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/vehicle_types.json", TestFixturesV31RC2+"vehicle_types.json") + var gbfsData vehicletypes.VehicleTypes + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} + +func TestVehicleAvailability31RC2(t *testing.T) { + schemaLoader, jsonData := loadSchemaAndFixture(t, "./../../../v3.1-RC2/vehicle_availability.json", TestFixturesV31RC2+"vehicle_availability.json") + var gbfsData vehicleavailability.VehicleAvailability + err := json.Unmarshal(jsonData, &gbfsData) + if err != nil { + t.Error("Error UnmarshalGbfs:", err) + return + } + validateSchemaToUnmarshal(t, schemaLoader, gbfsData) +} diff --git a/models/golang/tests/gbfsv31-rc2_test.go b/models/golang/tests/gbfsv31-rc2_test.go deleted file mode 100644 index 3401b0fa..00000000 --- a/models/golang/tests/gbfsv31-rc2_test.go +++ /dev/null @@ -1,195 +0,0 @@ -package tests - -import ( - "encoding/json" - "fmt" - "os" - "testing" - - gbfs "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/gbfs" - gbfsversions "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/gbfs_versions" - geofencingzones "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/geofencing_zones" - manifest "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/manifest" - stationinformation "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/station_information" - stationstatus "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/station_status" - systemalerts "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/system_alerts" - systeminformation "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/system_information" - systempricingplans "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/system_pricing_plans" - systemregions "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/system_regions" - vehicleavailability "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/vehicle_availability" - vehiclestatus "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/vehicle_status" - vehicletypes "github.com/MobilityData/gbfs-json-schema/models/golang/v3.1-RC2/vehicle_types" - - "github.com/xeipuuv/gojsonschema" -) - -const pathToTestFixturesV31RC2 = "./../../../testFixtures/v3.1-RC2/" - -func LoadSchemaAndFixtureV31RC2(t *testing.T, fileName string) (gojsonschema.JSONLoader, []byte) { - - pathToSchema := "./../../../v3.1-RC2/" - schemaDataBytes, schemaErr := os.ReadFile(pathToSchema + fileName) - if schemaErr != nil { - t.Error("Error opening JSON file:", schemaErr) - return nil, nil - } - var schemaData map[string]interface{} - schemaErr = json.Unmarshal(schemaDataBytes, &schemaData) - if schemaErr != nil { - t.Error("Error opening JSON file:", schemaErr) - return nil, nil - } - schemaLoader := gojsonschema.NewGoLoader(schemaData) - jsonData, err2 := os.ReadFile(pathToTestFixturesV31RC2 + fileName) - if err2 != nil { - t.Error("Error opening JSON file:", err2) - return nil, nil - } - return schemaLoader, jsonData -} - -func ValidateSchemaToUnmarshalV31RC2(t *testing.T, schemaLoader gojsonschema.JSONLoader, gbfsData interface{}) { - loader := gojsonschema.NewGoLoader(gbfsData) - result, err3 := gojsonschema.Validate(schemaLoader, loader) - if err3 != nil { - t.Error("Error validating JSON file:", err3) - return - } - - if !result.Valid() { - t.Error("The JSON is NOT valid:") - for _, desc := range result.Errors() { - fmt.Printf("- %s\n", desc) - } - } -} - -func TestGbfsV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "gbfs.json") - gbfsData, err := gbfs.UnmarshalGbfs(jsonData) - if err != nil { - t.Error("Error With Unmarshal:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestGbfsVersionsV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "gbfs_versions.json") - gbfsData, err := gbfsversions.UnmarshalGbfsVersions(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestGeofencingZonesV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "geofencing_zones.json") - gbfsData, err := geofencingzones.UnmarshalGeofencingZones(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestManifestV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "manifest.json") - gbfsData, err := manifest.UnmarshalManifest(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestStationInformationV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "station_information.json") - gbfsData, err := stationinformation.UnmarshalStationInformation(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestStationStatusV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "station_status.json") - gbfsData, err := stationstatus.UnmarshalStationStatus(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestSystemAlertsV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "system_alerts.json") - gbfsData, err := systemalerts.UnmarshalSystemAlerts(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestSystemInformationV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "system_information.json") - gbfsData, err := systeminformation.UnmarshalSystemInformation(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestSystemPricingPlanV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "system_pricing_plans.json") - gbfsData, err := systempricingplans.UnmarshalSystemPricingPlans(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestSystemRegionsV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "system_regions.json") - gbfsData, err := systemregions.UnmarshalSystemRegions(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestVehicleStatusV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "vehicle_status.json") - gbfsData, err := vehiclestatus.UnmarshalVehicleStatus(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestVehicleTypesV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "vehicle_types.json") - gbfsData, err := vehicletypes.UnmarshalVehicleTypes(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} - -func TestVehicleAvailabilityV31RC2(t *testing.T) { - schemaLoader, jsonData := LoadSchemaAndFixtureV31RC2(t, "vehicle_availability.json") - gbfsData, err := vehicleavailability.UnmarshalVehicleAvailability(jsonData) - if err != nil { - t.Error("Error UnmarshalGbfs:", err) - return - } - ValidateSchemaToUnmarshalV31RC2(t, schemaLoader, gbfsData) -} diff --git a/models/golang/v2.3/free_bike_status/free_bike_status.go b/models/golang/v2.3/free_bike_status/free_bike_status.go new file mode 100644 index 00000000..40d1e1a3 --- /dev/null +++ b/models/golang/v2.3/free_bike_status/free_bike_status.go @@ -0,0 +1,69 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package freebikestatus + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Describes the vehicles that are available for rent (as of v2.3). +type FreeBikeStatus struct { + header.HeaderStruct + // Array that contains one object per bike as defined below. + Data Data `json:"data"` +} + +// Array that contains one object per bike as defined below. +type Data struct { + Bikes []Bike `json:"bikes"` +} + +type Bike struct { + // Rotating (as of v2.0) identifier of a vehicle. + BikeID common.ID `json:"bike_id"` + // The latitude of the vehicle. + Lat *common.Latitude `json:"lat,omitempty"` + // The longitude of the vehicle. + Lon *common.Longitude `json:"lon,omitempty"` + // Is the vehicle currently reserved? + IsReserved bool `json:"is_reserved"` + // Is the vehicle currently disabled (broken)? + IsDisabled bool `json:"is_disabled"` + // Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added in v1.1). + RentalUris *common.RentalUris `json:"rental_uris,omitempty"` + // The vehicle_type_id of this vehicle (added in v2.1-RC). + VehicleTypeID *common.ID `json:"vehicle_type_id,omitempty"` + // The last time this vehicle reported its status to the operator's backend in POSIX time (added in v2.1-RC). + // With PR #171 (https://github.com/MobilityData/gbfs-json-schema/pull/171), the type of LastReported was changed from number to integer to be consistent with the POSIX time format. + // As there is no version bump, many GBFS feeds will still have LastReported as a number. + // Therefore, the type is defined as a float64 to accommodate both cases. In the future, it is recommended to use an integer for LastReported. + // But for now, the float64 type is used to ensure compatibility with existing feeds. + LastReported *common.PosixTimestamp `json:"last_reported,omitempty"` + // The furthest distance in meters that the vehicle can travel without recharging or refueling with the vehicle's current charge or fuel (added in v2.1-RC). + CurrentRangeMeters *float64 `json:"current_range_meters,omitempty"` + // This value represents the current percentage, expressed from 0 to 1, of fuel or battery power remaining in the vehicle. Added in v2.3-RC. + CurrentFuelPercent *float64 `json:"current_fuel_percent,omitempty"` + // Identifier referencing the station_id if the vehicle is currently at a station (added in v2.1-RC2). + StationID *common.ID `json:"station_id,omitempty"` + // The station_id of the station this vehicle must be returned to (added in v2.3-RC). + HomeStationID *common.ID `json:"home_station_id,omitempty"` + // The plan_id of the pricing plan this vehicle is eligible for (added in v2.2). + PricingPlanID *common.ID `json:"pricing_plan_id,omitempty"` + // List of vehicle equipment provided by the operator in addition to the accessories already provided in the vehicle. Added in v2.3. + VehicleEquipment []common.VehicleEquipment `json:"vehicle_equipment,omitempty"` + // The date and time when any rental of the vehicle must be completed. Added in v2.3. + AvailableUntil *common.DateTime `json:"available_until,omitempty"` +} diff --git a/models/golang/v2.3/gbfs/gbfs.go b/models/golang/v2.3/gbfs/gbfs.go new file mode 100644 index 00000000..533b5ef4 --- /dev/null +++ b/models/golang/v2.3/gbfs/gbfs.go @@ -0,0 +1,35 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gbfs + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Auto-discovery file that links to all of the other files published by the system. +type Gbfs struct { + header.HeaderStruct + // Response data in the form of name:value pairs. + Data Data `json:"data"` +} + +// The language that will be used throughout the rest of the files. It MUST match the value in the system_information.json file. +type Data map[common.Language]LanguageFeeds + +type LanguageFeeds struct { + // An array of all of the feeds that are published by this auto-discovery file. Each element in the array is an object with the keys below. + Feeds []common.Feed `json:"feeds"` +} diff --git a/models/golang/v2.3/gbfs_versions/gbfs_versions.go b/models/golang/v2.3/gbfs_versions/gbfs_versions.go new file mode 100644 index 00000000..4f9f2e22 --- /dev/null +++ b/models/golang/v2.3/gbfs_versions/gbfs_versions.go @@ -0,0 +1,41 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gbfsversions + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Lists all feed endpoints published according to version sof the GBFS documentation. (added in v1.1) +type GbfsVersions struct { + header.HeaderStruct + // Response data in the form of name:value pairs. + Data Data `json:"data"` +} + +// Response data in the form of name:value pairs. +type Data struct { + // Contains one object, as defined below, for each of the available versions of a feed. The + // array must be sorted by increasing MAJOR and MINOR version number. + Versions []VersionElement `json:"versions"` +} + +type VersionElement struct { + // URL of the corresponding gbfs.json endpoint + URL string `json:"url"` + // The semantic version of the feed in the form X.Y + Version common.Version `json:"version"` +} diff --git a/models/golang/v2.3/geofencing_zones/geofencing_zones.go b/models/golang/v2.3/geofencing_zones/geofencing_zones.go new file mode 100644 index 00000000..ab000b1a --- /dev/null +++ b/models/golang/v2.3/geofencing_zones/geofencing_zones.go @@ -0,0 +1,33 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package geofencing_zones + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" + "github.com/paulmach/orb/geojson" +) + +// Describes geofencing zones and their associated rules and attributes (added in v2.1-RC). +type GeofencingZones struct { + header.HeaderStruct + // Array that contains geofencing information for the system. + Data Data `json:"data"` +} + +// Array that contains geofencing information for the system. +type Data struct { + // Each geofenced zone and its associated rules and attributes is described as an object within the array of features. + GeofencingZones *geojson.FeatureCollection `json:"geofencing_zones"` +} diff --git a/models/golang/v2.3/header/header.go b/models/golang/v2.3/header/header.go new file mode 100644 index 00000000..9244a068 --- /dev/null +++ b/models/golang/v2.3/header/header.go @@ -0,0 +1,29 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package header + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" +) + +type HeaderStruct struct { + // Last time the data in the feed was updated in POSIX time (epoch seconds). + LastUpdated common.PosixTimestamp `json:"last_updated"` + // Number of seconds before the data in the feed will be updated again (0 if the data should always be refreshed). + TTL uint64 `json:"ttl"` + // GBFS version number to which the feed conforms, according to the versioning framework + // (added in v1.1). + Version common.Version `json:"version"` +} diff --git a/models/golang/v2.3/station_information/station_information.go b/models/golang/v2.3/station_information/station_information.go new file mode 100644 index 00000000..4c8762e6 --- /dev/null +++ b/models/golang/v2.3/station_information/station_information.go @@ -0,0 +1,127 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package station_information + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// List of all stations, their capacities and locations. REQUIRED of systems utilizing docks. +type StationInformation struct { + header.HeaderStruct + // Array that contains one object per station as defined below. + Data Data `json:"data"` +} + +// Array that contains one object per station as defined below. +type Data struct { + Stations []Station `json:"stations"` +} + +type Station struct { + // Address (street number and name) where station is located. This MUST be a valid address, + // not a free-form text description. Example: 1234 Main Street + Address *string `json:"address,omitempty"` + // Number of total docking points installed at this station, both available and unavailable, regardless of what + // vehicle types are allowed at each dock. If this is a virtual station defined using the is_virtual_station field, + // this number represents the total number of vehicles of all types that can be parked at the virtual station. + // If the virtual station is defined by station_area, this is the number that can park within the station area. + // If lat/lon are defined, this is the number that can park at those coordinates. + Capacity *int64 `json:"capacity,omitempty"` + // Contact phone of the station. Added in v2.3 + ContactPhone *common.PhoneNumber `json:"contact_phone,omitempty"` + // Cross street or landmark where the station is located. + CrossStreet *string `json:"cross_street,omitempty"` + // Does the station support charging of electric vehicles? + // true - Electric vehicle charging is available at this station. + // false - Electric vehicle charging is not available at this station. (added in v2.3-RC) + IsChargingStation *bool `json:"is_charging_station,omitempty"` + // Are valet services provided at this station? + // true - Valet services are provided at this station. + // false - Valet services are not provided at this station. + // If this field is empty, it is assumed that valet services are not provided at this station. + // This field’s boolean SHOULD be set to true during the hours which valet service is provided at the station. + // Valet service is defined as providing unlimited capacity at a station. (added in v2.1-RC) + IsValetStation *bool `json:"is_valet_station,omitempty"` + // Is this station a location with or without smart dock technology? + // true - The station is a location without smart docking infrastructure. the station may be defined by a point (lat/lon) and/or station_area (below). + // false - The station consists of smart docking infrastructure (docks). + // This field SHOULD be published by mobility systems that have station locations without standard, internet connected + // physical docking infrastructure. These may be racks or geofenced areas designated for rental and/or return of vehicles. + // Locations that fit within this description SHOULD have the is_virtual_station boolean set to true. (added in v2.1-RC) + IsVirtualStation *bool `json:"is_virtual_station,omitempty"` + // The latitude of the station. + Lat common.Latitude `json:"lat"` + // The longitude fo the station. + Lon common.Longitude `json:"lon"` + // The public name of the station for display in maps, digital signage, and other text applications. Names SHOULD + // reflect the station location through the use of a cross street or local landmark. Abbreviations + // SHOULD NOT be used for names and other text (for example, "St." for "Street") unless a location is called by its + // abbreviated name (for example, “JFK Airport”). See Text Fields and Naming. + // Examples: + // Broadway and East 22nd Street + // Convention Center + // Central Park South + Name string `json:"name"` + // Are parking hoops present at this station? + // true - Parking hoops are present at this station. + // false - Parking hoops are not present at this station. + // Parking hoops are lockable devices that are used to secure a parking space to prevent parking of unauthorized vehicles. Added in v2.3 + ParkingHoop *bool `json:"parking_hoop,omitempty"` + // Type of parking station. Current valid values are: + // parking_lot (Off-street parking lot) + // street_parking (Curbside parking) + // underground_parking (Parking that is below street level, station may be non-communicating) + // sidewalk_parking (Park vehicle on sidewalk, out of the pedestrian right of way) + // other (Added in v2.3) + ParkingType *common.ParkingType `json:"parking_type,omitempty"` + // Postal code where station is located. + PostCode *string `json:"post_code,omitempty"` + // Identifier of the region where the station is located. + RegionID *common.ID `json:"region_id,omitempty"` + // Payment methods accepted at this station. + RentalMethods []common.RentalMethod `json:"rental_methods,omitempty"` + // Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added + // in v1.1). + RentalUris *common.RentalUris `json:"rental_uris,omitempty"` + // Short name or other type of identifier. + ShortName *string `json:"short_name,omitempty"` + // A GeoJSON MultiPolygon that describes the area of a virtual station. If station_area is supplied, then the record describes a virtual station. + // If lat/lon and station_area are both defined, the lat/lon is the significant coordinate of the station (for example, + // parking facility or valet drop-off and pick up point). The station_area takes precedence over any ride_allowed rules in overlapping geofencing_zones. + StationArea *StationArea `json:"station_area,omitempty"` + // Identifier of a station. + StationID common.ID `json:"station_id"` + // An object used to describe the parking capacity of virtual stations (defined using the is_virtual_station field), + // where each key is a vehicle_type_id as described in vehicle_types.json, and the value is a number representing + // the total number of vehicles of this type that can park within the virtual station. If the virtual station is + // defined by station_area, this is the number that can park within the station area. If lat/lon is defined, + // this is the number that can park at those coordinates. (added in v2.1-RC). + VehicleCapacity map[string]int64 `json:"vehicle_capacity,omitempty"` + // "An object where each key is a vehicle_type_id and the value is a number representing the total docking points installed at this station for each vehicle type (added in v2.1-RC).", + VehicleTypesCapacity map[string]int64 `json:"vehicle_types_capacity,omitempty"` +} + +type StationArea struct { + Coordinates [][][][]float64 `json:"coordinates"` + Type Type `json:"type"` +} + +type Type string + +const ( + MultiPolygon Type = "MultiPolygon" +) diff --git a/models/golang/v2.3/station_status/station_status.go b/models/golang/v2.3/station_status/station_status.go new file mode 100644 index 00000000..f7b53f45 --- /dev/null +++ b/models/golang/v2.3/station_status/station_status.go @@ -0,0 +1,102 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stationstatus + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Describes the capacity and rental availability of the station +type StationStatus struct { + header.HeaderStruct + // Array that contains one object per station as defined below. + Data Data `json:"data"` +} + +// Array that contains one object per station as defined below. +type Data struct { + Stations []Station `json:"stations"` +} + +type Station struct { + // Is the station currently on the street? + // true - Station is installed on the street. + // false - Station is not installed on the street. + // Boolean SHOULD be set to true when equipment is present on the street. In seasonal systems where + // equipment is removed during winter, boolean SHOULD be set to false during the off season. + // May also be set to false to indicate planned (future) stations which have not yet been installed. + IsInstalled bool `json:"is_installed"` + // Is the station currently renting vehicles? + // true - Station is renting vehicles. Even if the station is empty, if it would otherwise allow rentals, this value MUST be true. + // false - Station is not renting vehicles. + // If the station is temporarily taken out of service and not allowing rentals, this field MUST be set to false. + // If a station becomes inaccessible to users due to road construction or other factors this field SHOULD be set to false. + // Field SHOULD be set to false during hours or days when the system is not offering vehicles for rent. + IsRenting bool `json:"is_renting"` + // Is the station accepting vehicle returns? + // true - Station is accepting vehicle returns. Even if the station is full, if it would otherwise allow vehicle returns, this value MUST be true. + // false - Station is not accepting vehicle returns. + // If the station is temporarily taken out of service and not allowing vehicle returns, this field MUST be set to false. + // If a station becomes inaccessible to users due to road construction or other factors, this field SHOULD be set to false. + IsReturning bool `json:"is_returning"` + // The last time this station reported its status to the operator's backend in POSIX time. + LastReported common.PosixTimestamp `json:"last_reported"` + // REQUIRED except for stations that have unlimited docking capacity (for example, valet stations) (as of v2.0). + // Number of functional docks physically at the station that are able to accept vehicles for return. + // To know if the docks are accepting vehicle returns, see is_returning. + // If is_returning = true, this is the number of docks that are currently available to accept vehicle returns. + // If is_returning = false, this is the number of docks that would be available if the station were set to allow returns. + NumDocksAvailable *uint64 `json:"num_docks_available,omitempty"` + // Number of empty but disabled docks at the station. + NumDocksDisabled *uint64 `json:"num_docks_disabled,omitempty"` + // Number of functional vehicles physically at the station that may be offered for rental. To know if the vehicles are available for rental, see is_renting. + // If is_renting = true, this is the number of vehicles that are currently available for rent. + // If is_renting =false, this is the number of vehicles that would be available for rent if the station were set to allow rentals. + NumBikesAvailable int64 `json:"num_bikes_available"` + // Number of disabled vehicles of any type at the station. Vendors who do not want to publicize the number of + // disabled vehicles or docks in their system can opt to omit station capacity (in station_information.json, + // num_bikes_disabled, and num_docks_disabled (as of v2.0). If station capacity is published, then broken + // docks/vehicles can be inferred (though not specifically whether the decreased capacity is a broken vehicle or dock). + NumBikesDisabled *int64 `json:"num_bikes_disabled,omitempty"` + // Identifier of a station. + StationID common.ID `json:"station_id"` + // Object displaying available docks by vehicle type (added in v2.1-RC). + VehicleDocksAvailable []VehicleDocksAvailable `json:"vehicle_docks_available,omitempty"` + // Array of objects displaying the total number of each vehicle type at the station (added + // in v2.1-RC). + VehicleTypesAvailable []VehicleTypesAvailable `json:"vehicle_types_available,omitempty"` +} + +type VehicleDocksAvailable struct { + // REQUIRED if vehicle_docks_available is defined. An array of strings where each string represents a vehicle_type_id + // that is able to use a particular type of dock at the station. (added in v2.1) + Count uint64 `json:"count"` + // REQUIRED if vehicle_docks_available is defined. The total number of available docks at the station, + // that can accept vehicles of the corresponding vehicle_type_id, in the vehicle_type_ids array. (added in v2.1) + VehicleTypeIDS []string `json:"vehicle_type_ids"` +} + +// REQUIRED if the vehicle_types.json file has been defined. This field's value is an array of objects. +// Each of these objects is used to model the total number of each defined vehicle type available at a station. +// The total number of vehicles from each of these objects SHOULD add up to match the value specified in the num_bikes_available field. +type VehicleTypesAvailable struct { + // A number representing the total amount of this vehicle type at the station + // (added in v2.1-RC). + Count uint64 `json:"count"` + // REQUIRED if the vehicle_types_available is defined. The vehicle_type_id of each vehicle type at the station + // as described in vehicle_types.json. (added in v2.1-RC). + VehicleTypeID common.ID `json:"vehicle_type_id"` +} diff --git a/models/golang/v2.3/system_alerts/system_alerts.go b/models/golang/v2.3/system_alerts/system_alerts.go new file mode 100644 index 00000000..55b5880f --- /dev/null +++ b/models/golang/v2.3/system_alerts/system_alerts.go @@ -0,0 +1,63 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package system_alerts + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Describes ad-hoc changes to the system. +type SystemAlerts struct { + header.HeaderStruct + // Array that contains ad-hoc alerts for the system. + Data Data `json:"data"` +} + +// Array that contains ad-hoc alerts for the system. +type Data struct { + Alerts []Alert `json:"alerts"` +} + +type Alert struct { + // Identifier for this alert. + AlertID common.ID `json:"alert_id"` + // Detailed description of the alert. + Description *string `json:"description,omitempty"` + // Indicates the last time the info for the alert was updated. + LastUpdated *common.PosixTimestamp `json:"last_updated,omitempty"` + // If this system has regions, and if this alert only affects certain regions, include their ID(s). Otherwise, omit this field. + // If both station_ids and region_ids are omitted, this alert affects the entire system. + RegionIDS []common.ID `json:"region_ids,omitempty"` + // If this is an alert that affects one or more stations, include their ID(s). Otherwise omit this field. + // If both station_id and region_id are omitted, this alert affects the entire system. + StationIDS []common.ID `json:"station_ids,omitempty"` + // A short summary of this alert to be displayed to the customer. + Summary string `json:"summary"` + // Array of objects with the fields start and end indicating when the alert is in effect + // (for example, when the system or station is actually closed, or when a station is scheduled to be moved). + Times []Time `json:"times,omitempty"` + // Type of alert. + Type common.Type `json:"type"` + // URL where the customer can learn more information about this alert. + URL *common.URL `json:"url,omitempty"` +} + +type Time struct { + // End time of the alert. If there is currently no end time planned for the alert, this can be omitted. + End *common.PosixTimestamp `json:"end,omitempty"` + // REQUIRED if times array is defined. Start time of the alert. + Start *common.PosixTimestamp `json:"start,omitempty"` +} diff --git a/models/golang/v2.3/system_calendar/system_calendar.go b/models/golang/v2.3/system_calendar/system_calendar.go new file mode 100644 index 00000000..703182fb --- /dev/null +++ b/models/golang/v2.3/system_calendar/system_calendar.go @@ -0,0 +1,43 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package systemcalendar + +import "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" + +// Describes the operating calendar for a system. +type SystemCalendar struct { + header.HeaderStruct + // Array that contains operations calendar for the system. + Data Data `json:"data"` +} + +type Data struct { + Calendars []Calendar `json:"calendars"` +} + +type Calendar struct { + // Starting month for the system operations. + StartMonth uint64 `json:"start_month"` + // Starting day for the system operations. + StartDay uint64 `json:"start_day"` + // Starting year for the system operations. + StartYear *uint64 `json:"start_year,omitempty"` + // End month for the system operations. + EndMonth uint64 `json:"end_month"` + // End day for the system operations. + EndDay uint64 `json:"end_day"` + // End year for the system operations. + EndYear *uint64 `json:"end_year,omitempty"` +} diff --git a/models/golang/v2.3/system_hours/system_hours.go b/models/golang/v2.3/system_hours/system_hours.go new file mode 100644 index 00000000..f3b6daa2 --- /dev/null +++ b/models/golang/v2.3/system_hours/system_hours.go @@ -0,0 +1,42 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package systemhours + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Describes the system hours of operation. +type SystemHours struct { + header.HeaderStruct + // Array that contains system hours of operations. + Data Data `json:"data"` +} + +type Data struct { + RentalHours []RentalHour `json:"rental_hours"` +} + +type RentalHour struct { + // Array of member and nonmember value(s) indicating that this set of rental hours applies to either members or non-members only. + UserTypes []common.UserType `json:"user_types"` + // An array of abbreviations (first 3 letters) of English names of the days of the week for which this object applies. + Days []common.Day `json:"days"` + // Start time for the hours of operation of the system. + StartTime string `json:"start_time"` + // End time for the hours of operation of the system. + EndTime string `json:"end_time"` +} diff --git a/models/golang/v2.3/system_information/system_information.go b/models/golang/v2.3/system_information/system_information.go new file mode 100644 index 00000000..63137552 --- /dev/null +++ b/models/golang/v2.3/system_information/system_information.go @@ -0,0 +1,84 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package system_information + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Details including system operator, system location, year implemented, URL, contact info, +// time zone. +type SystemInformation struct { + header.HeaderStruct + // Response data in the form of name:value pairs. + Data Data `json:"data"` +} + +// Response data in the form of name:value pairs. +type Data struct { + // An object where each key defines one of the items listed below (added in v2.3-RC). + BrandAssets *common.BrandAssets `json:"brand_assets,omitempty"` + // This OPTIONAL field SHOULD contain a single contact email address actively monitored by the operator’s + // customer service department. This email address SHOULD be a direct contact point where riders can reach + // a customer service representative. + Email *common.Email `json:"email,omitempty"` + // This OPTIONAL field SHOULD contain a single contact email for feed consumers to report technical issues with the feed. + // (added in v1.1). + FeedContactEmail *common.Email `json:"feed_contact_email,omitempty"` + // The language that will be used throughout the rest of the files. It must match the value in the gbfs.json file. + Language common.Language `json:"language"` + // A fully qualified URL of a page that defines the license terms for the GBFS data for this system, + // as well as any other license terms the system would like to define (including the use of corporate trademarks, etc) + LicenseURL *common.URL `json:"license_url,omitempty"` + // Name of the system to be displayed to customers. + Name string `json:"name"` + // Hours and dates of operation for the system in OSM opening_hours format. (added in v3.0) + OpeningHours string `json:"opening_hours"` + // Name of the operator. + Operator *string `json:"operator,omitempty"` + // This OPTIONAL field SHOULD contain a single voice telephone number for the specified system’s customer service department. + // It can and SHOULD contain punctuation marks to group the digits of the number. Dialable text + // (for example, Capital Bikeshare’s "877-430-BIKE") is permitted, but the field MUST NOT contain any other descriptive text. + PhoneNumber *common.PhoneNumber `json:"phone_number,omitempty"` + // The date that the privacy policy provided at privacy_url was last updated (added in + // v2.3-RC). + PrivacyLastUpdated *string `json:"privacy_last_updated,omitempty"` + // A fully qualified URL pointing to the privacy policy for the service (added in v2.3-RC) + PrivacyURL *common.URL `json:"privacy_url,omitempty"` + // URL where a customer can purchase a membership. + PurchaseURL *common.URL `json:"purchase_url,omitempty"` + // Contains rental app information in the android and ios JSON objects (added in v1.1). + RentalApps *common.RentalApps `json:"rental_apps,omitempty"` + // Optional abbreviation for a system. + ShortName string `json:"short_name,omitempty"` + // Date that the system began operations. + StartDate *common.Date `json:"start_date,omitempty"` + // This is a globally unique identifier for the vehicle share system. It is up to the publisher of the feed + // to guarantee uniqueness and MUST be checked against existing system_id fields in systems.csv to ensure this. + // This value is intended to remain the same over the life of the system.Each distinct system or geographic area + // in which vehicles are operated SHOULD have its own system_id. System IDs SHOULD be recognizable as belonging + // to a particular system - for example, bcycle_austin or biketown_pdx - as opposed to random strings. + SystemID common.ID `json:"system_id"` + // The date that the terms of service provided at terms_url were last updated (added in + // v2.3-RC) + TermsLastUpdated *common.Date `json:"terms_last_updated,omitempty"` + // A fully qualified URL pointing to the terms of service (added in v2.3-RC) + TermsURL *common.URL `json:"terms_url,omitempty"` + // The time zone where the system is located. + Timezone common.Timezone `json:"timezone"` + // The URL of the vehicle share system. + URL *common.URL `json:"url,omitempty"` +} diff --git a/models/golang/v2.3/system_pricing_plans/system_pricing_plans.go b/models/golang/v2.3/system_pricing_plans/system_pricing_plans.go new file mode 100644 index 00000000..e1ad8417 --- /dev/null +++ b/models/golang/v2.3/system_pricing_plans/system_pricing_plans.go @@ -0,0 +1,62 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package system_pricing_plans + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Describes the pricing schemes of the system. +type SystemPricingPlans struct { + header.HeaderStruct + // Array that contains one object per plan as defined below. + Data Data `json:"data"` +} + +// Array that contains one object per plan as defined below. +type Data struct { + Plans []Plan `json:"plans"` +} + +type Plan struct { + // Currency used to pay the fare in ISO 4217 code. + Currency string `json:"currency"` + // Customer-readable description of the pricing plan. + Description string `json:"description"` + // Will additional tax be added to the base price? + IsTaxable bool `json:"is_taxable"` + // Name of this pricing plan. + Name string `json:"name"` + // Array of segments when the price is a function of distance travelled, displayed in + // kilometers (added in v2.2) + PerKMPricing []common.PerKMPricing `json:"per_km_pricing,omitempty"` + // Array of segments when the price is a function of time travelled, displayed in minutes + // (added in v2.2) + PerMinPricing []common.PerMinPricing `json:"per_min_pricing,omitempty"` + // Identifier of a pricing plan in the system. + PlanID common.ID `json:"plan_id"` + // Fare price. The specification states that it can either be a float OR a string. As this is not + // compatible with the Go language, we use a float64 type here as thios is the only allowed type + // starting from v3.0. + Price float64 `json:"price"` + // Is there currently an increase in price in response to increased demand in this pricing plan? + // If this field is empty, it means there is no surge pricing in effect. (added in v2.2) + // true - Surge pricing is in effect. + // false - Surge pricing is not in effect. + SurgePricing *bool `json:"surge_pricing,omitempty"` + // URL where the customer can learn more about this pricing plan. + URL *common.URL `json:"url,omitempty"` +} diff --git a/models/golang/v2.3/system_regions/system_regions.go b/models/golang/v2.3/system_regions/system_regions.go new file mode 100644 index 00000000..92798ed9 --- /dev/null +++ b/models/golang/v2.3/system_regions/system_regions.go @@ -0,0 +1,40 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package system_regions + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Describes regions for a system that is broken up by geographic or political region. +type SystemRegions struct { + header.HeaderStruct + // Describe regions for a system that is broken up by geographic or political region. + Data Data `json:"data"` +} + +// Describe regions for a system that is broken up by geographic or political region. +type Data struct { + // Array of regions. + Regions []Region `json:"regions"` +} + +type Region struct { + // Public name for this region. + Name string `json:"name"` + // identifier of the region. + RegionID common.ID `json:"region_id"` +} diff --git a/models/golang/v2.3/vehicle_types/vehicle_types.go b/models/golang/v2.3/vehicle_types/vehicle_types.go new file mode 100644 index 00000000..4095b6d2 --- /dev/null +++ b/models/golang/v2.3/vehicle_types/vehicle_types.go @@ -0,0 +1,91 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vehicle_types + +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v2.3/header" +) + +// Describes the types of vehicles that System operator has available for rent (added in +// v2.1-RC). +type VehicleTypes struct { + header.HeaderStruct + // Response data in the form of name:value pairs. + Data Data `json:"data"` +} + +// Response data in the form of name:value pairs. +type Data struct { + // Array that contains one object per vehicle type in the system as defined below. + VehicleTypes []VehicleType `json:"vehicle_types"` +} + +type VehicleType struct { + // The capacity of the vehicle cargo space (excluding passengers), expressed in kilograms. + CargoLoadCapacity *uint64 `json:"cargo_load_capacity,omitempty"` + // Cargo volume available in the vehicle, expressed in liters. For cars, it corresponds to the space between the boot + // floor, including the storage under the hatch, to the rear shelf in the trunk. + CargoVolumeCapacity *uint64 `json:"cargo_volume_capacity,omitempty"` + // The color of the vehicle. Added in v2.3 + Color *string `json:"color,omitempty"` + // A plan_id as defined in system_pricing_plans.json added in v2.3-RC. + DefaultPricingPlanID *common.ID `json:"default_pricing_plan_id,omitempty"` + // Maximum time in minutes that a vehicle can be reserved before a rental begins added in + // v2.3-RC. + DefaultReserveTime *uint64 `json:"default_reserve_time,omitempty"` + // Vehicle air quality certificate. added in v2.3. + EcoLabel []common.EcoLabel `json:"eco_label,omitempty"` + // The vehicle's general form factor. + FormFactor common.FormFactor `json:"form_factor"` + // Maximum quantity of CO2, in grams, emitted per kilometer, according to the WLTP. Added in + // v2.3 + GCO2KM *uint64 `json:"g_CO2_km,omitempty"` + // The name of the vehicle manufacturer. Added in v2.3 + Make *string `json:"make,omitempty"` + // The maximum speed in kilometers per hour this vehicle is permitted to reach in accordance + // with local permit and regulations. Added in v2.3 + MaxPermittedSpeed *uint64 `json:"max_permitted_speed,omitempty"` + // The furthest distance in meters that the vehicle can travel without recharging or + // refueling when it has the maximum amount of energy potential. + MaxRangeMeters *float64 `json:"max_range_meters,omitempty"` + // The name of the vehicle model. Added in v2.3 + Model *string `json:"model,omitempty"` + // The public name of this vehicle type. An array with one object per supported language + // with the following keys: + Name *string `json:"name,omitempty"` + // Array of all pricing plan IDs as defined in system_pricing_plans.json added in v2.3-RC. + PricingPlanIDS []common.ID `json:"pricing_plan_ids,omitempty"` + // The primary propulsion type of the vehicle. Updated in v2.3 to represent car-sharing + PropulsionType common.PropulsionType `json:"propulsion_type"` + // The rated power of the motor for this vehicle type in watts. Added in v2.3 + RatedPower *uint64 `json:"rated_power,omitempty"` + // The conditions for returning the vehicle at the end of the trip. Added in v2.3-RC as + // return_type, and updated to return_constraint in v2.3. + ReturnConstraint *common.ReturnConstraint `json:"return_constraint,omitempty"` + // The number of riders (driver included) the vehicle can legally accommodate + RiderCapacity *uint64 `json:"rider_capacity,omitempty"` + // Description of accessories available in the vehicle. + VehicleAccessories []common.VehicleAccessory `json:"vehicle_accessories,omitempty"` + // An object where each key defines one of the items listed below added in v2.3-RC. + VehicleAssets *common.VehicleAssets `json:"vehicle_assets,omitempty"` + // URL to an image that would assist the user in identifying the vehicle. JPEG or PNG. Added + // in v2.3 + VehicleImage *common.URL `json:"vehicle_image,omitempty"` + // Unique identifier of a vehicle type. + VehicleTypeID string `json:"vehicle_type_id"` + // Number of wheels this vehicle type has. Added in v2.3 + WheelCount *uint64 `json:"wheel_count,omitempty"` +} diff --git a/models/golang/v3.0/gbfs/gbfs.go b/models/golang/v3.0/gbfs/gbfs.go index 74f75901..a5ce930a 100644 --- a/models/golang/v3.0/gbfs/gbfs.go +++ b/models/golang/v3.0/gbfs/gbfs.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,75 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// gbfs, err := UnmarshalGbfs(bytes) -// bytes, err = gbfs.Marshal() - package gbfs - - -import "encoding/json" - -func UnmarshalGbfs(data []byte) (Gbfs, error) { - var r Gbfs - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *Gbfs) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // Auto-discovery file that links to all of the other files published by the system. type Gbfs struct { - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + header.HeaderStruct + Data Data `json:"data"` } type Data struct { - // An array of all of the feeds that are published by the auto-discovery file. Each element - // in the array is an object with the keys below. - Feeds []Feed `json:"feeds"` + Feeds []common.Feed `json:"feeds"` } - -type Feed struct { - // Key identifying the type of feed this is. The key must be the base file name defined in - // the spec for the corresponding feed type. - Name Name `json:"name"` - // URL for the feed. - URL string `json:"url"` -} - -// Key identifying the type of feed this is. The key must be the base file name defined in -// the spec for the corresponding feed type. -type Name string - -const ( - GbfsVersions Name = "gbfs_versions" - GeofencingZones Name = "geofencing_zones" - NameGbfs Name = "gbfs" - StationInformation Name = "station_information" - StationStatus Name = "station_status" - SystemAlerts Name = "system_alerts" - SystemInformation Name = "system_information" - SystemPricingPlans Name = "system_pricing_plans" - SystemRegions Name = "system_regions" - VehicleStatus Name = "vehicle_status" - VehicleTypes Name = "vehicle_types" -) - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.0/gbfs_versions/gbfs_versions.go b/models/golang/v3.0/gbfs_versions/gbfs_versions.go index 7103cb40..003812c2 100644 --- a/models/golang/v3.0/gbfs_versions/gbfs_versions.go +++ b/models/golang/v3.0/gbfs_versions/gbfs_versions.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,71 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// gbfsVersions, err := UnmarshalGbfsVersions(bytes) -// bytes, err = gbfsVersions.Marshal() - package gbfs_versions - - -import "encoding/json" - -func UnmarshalGbfsVersions(data []byte) (GbfsVersions, error) { - var r GbfsVersions - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *GbfsVersions) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // Lists all feed endpoints published according to version sof the GBFS documentation. // (added in v1.1) type GbfsVersions struct { - // Response data in the form of name:value pairs. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework. - Version GbfsVersionsVersion `json:"version"` + header.HeaderStruct + + // Response data in the form of name:value pairs. + Data Data `json:"data"` } // Response data in the form of name:value pairs. type Data struct { - // Contains one object, as defined below, for each of the available versions of a feed. The - // array must be sorted by increasing MAJOR and MINOR version number. - Versions []VersionElement `json:"versions"` -} - -type VersionElement struct { - // URL of the corresponding gbfs.json endpoint - URL string `json:"url"` - // The semantic version of the feed in the form X.Y - Version VersionVersion `json:"version"` + // Contains one object, as defined below, for each of the available versions of a feed. The + // array must be sorted by increasing MAJOR and MINOR version number. + Versions []common.VersionElement `json:"versions"` } - -// The semantic version of the feed in the form X.Y -type VersionVersion string - -const ( - Purple30 VersionVersion = "3.0" - The10 VersionVersion = "1.0" - The11 VersionVersion = "1.1" - The20 VersionVersion = "2.0" - The21 VersionVersion = "2.1" - The22 VersionVersion = "2.2" - The23 VersionVersion = "2.3" -) - -type GbfsVersionsVersion string - -const ( - Fluffy30 GbfsVersionsVersion = "3.0" -) diff --git a/models/golang/v3.0/geofencing_zones/geofencing_zones.go b/models/golang/v3.0/geofencing_zones/geofencing_zones.go index ba3120cd..9a2e6342 100644 --- a/models/golang/v3.0/geofencing_zones/geofencing_zones.go +++ b/models/golang/v3.0/geofencing_zones/geofencing_zones.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,148 +12,43 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// geofencingZones, err := UnmarshalGeofencingZones(bytes) -// bytes, err = geofencingZones.Marshal() - package geofencing_zones - - -import "encoding/json" - -func UnmarshalGeofencingZones(data []byte) (GeofencingZones, error) { - var r GeofencingZones - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *GeofencingZones) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" + geojson "github.com/paulmach/orb/geojson" +) // Describes geofencing zones and their associated rules and attributes (added in v2.1-RC). type GeofencingZones struct { - // Array that contains geofencing information for the system. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework. - Version Version `json:"version"` + header.HeaderStruct + // Array that contains geofencing information for the system. + Data Data `json:"data"` } // Array that contains geofencing information for the system. type Data struct { - // Each geofenced zone and its associated rules and attributes is described as an object - // within the array of features. - GeofencingZones GeofencingZonesClass `json:"geofencing_zones"` - // Array of Rule objects defining restrictions that apply globally in all areas as the - // default restrictions, except where overridden with an explicit geofencing zone. - GlobalRules []GlobalRule `json:"global_rules"` -} - -// Each geofenced zone and its associated rules and attributes is described as an object -// within the array of features. -type GeofencingZonesClass struct { - // Array of objects. - Features []GeoJSONFeature `json:"features"` - // FeatureCollection as per IETF RFC 7946. - Type GeofencingZonesType `json:"type"` -} - -type GeoJSONFeature struct { - // A polygon that describes where rides might not be able to start, end, go through, or have - // other limitations. Must follow the right-hand rule. - Geometry GeoJSONMultiPolygon `json:"geometry"` - // Describing travel allowances and limitations. - Properties Properties `json:"properties"` - Type FeatureType `json:"type"` -} - -// A polygon that describes where rides might not be able to start, end, go through, or have -// other limitations. Must follow the right-hand rule. -type GeoJSONMultiPolygon struct { - Coordinates [][][][]float64 `json:"coordinates"` - Type GeometryType `json:"type"` -} - -// Describing travel allowances and limitations. -type Properties struct { - // End time of the geofencing zone in RFC3339 format. - End *string `json:"end,omitempty"` - // Public name of the geofencing zone. - Name []Name `json:"name,omitempty"` - // Array of Rule objects defining restrictions that apply within the area of the polygon. - Rules []Rule `json:"rules,omitempty"` - // Start time of the geofencing zone in RFC3339 format. - Start *string `json:"start,omitempty"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Rule struct { - // What is the maximum speed allowed, in kilometers per hour? - MaximumSpeedKph *int64 `json:"maximum_speed_kph,omitempty"` - // Is the ride allowed to end in this zone? - RideEndAllowed bool `json:"ride_end_allowed"` - // Is the ride allowed to start in this zone? - RideStartAllowed bool `json:"ride_start_allowed"` - // Is the ride allowed to travel through this zone? - RideThroughAllowed bool `json:"ride_through_allowed"` - // Vehicle MUST be parked at stations defined in station_information.json within this - // geofence zone - StationParking *bool `json:"station_parking,omitempty"` - // Array of vehicle type IDs for which these restrictions apply. - VehicleTypeIDS []string `json:"vehicle_type_ids,omitempty"` + // Each geofenced zone and its associated rules and attributes is described as an object + // within the array of features. + GeofencingZones *geojson.FeatureCollection `json:"geofencing_zones"` + // Array of Rule objects defining restrictions that apply globally in all areas as the + // default restrictions, except where overridden with an explicit geofencing zone. + GlobalRules []GlobalRule `json:"global_rules"` } type GlobalRule struct { - // What is the maximum speed allowed, in kilometers per hour? - MaximumSpeedKph *int64 `json:"maximum_speed_kph,omitempty"` - // Is the ride allowed to end in this zone? - RideEndAllowed bool `json:"ride_end_allowed"` - // Is the ride allowed to start in this zone? - RideStartAllowed bool `json:"ride_start_allowed"` - // Is the ride allowed to travel through this zone? - RideThroughAllowed bool `json:"ride_through_allowed"` - // Vehicle MUST be parked at stations defined in station_information.json within this - // geofence zone - StationParking *bool `json:"station_parking,omitempty"` - // Array of vehicle type IDs for which these restrictions apply. - VehicleTypeIDS []string `json:"vehicle_type_ids,omitempty"` + // What is the maximum speed allowed, in kilometers per hour? + MaximumSpeedKph *uint64 `json:"maximum_speed_kph,omitempty"` + // Is the ride allowed to end in this zone? + RideEndAllowed bool `json:"ride_end_allowed"` + // Is the ride allowed to start in this zone? + RideStartAllowed bool `json:"ride_start_allowed"` + // Is the ride allowed to travel through this zone? + RideThroughAllowed bool `json:"ride_through_allowed"` + // Vehicle MUST be parked at stations defined in station_information.json within this + // geofence zone + StationParking *bool `json:"station_parking,omitempty"` + // Array of vehicle type IDs for which these restrictions apply. + VehicleTypeIDS []common.ID `json:"vehicle_type_ids,omitempty"` } - -type GeometryType string - -const ( - MultiPolygon GeometryType = "MultiPolygon" -) - -type FeatureType string - -const ( - Feature FeatureType = "Feature" -) - -// FeatureCollection as per IETF RFC 7946. -type GeofencingZonesType string - -const ( - FeatureCollection GeofencingZonesType = "FeatureCollection" -) - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.0/header/header.go b/models/golang/v3.0/header/header.go new file mode 100644 index 00000000..76703407 --- /dev/null +++ b/models/golang/v3.0/header/header.go @@ -0,0 +1,31 @@ +// Copyright 2025 MobilityData +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package header + +import ( + "time" + + "github.com/MobilityData/gbfs-json-schema/models/golang/common" +) + +type HeaderStruct struct { + // Last time the data in the feed was updated in POSIX time. + LastUpdated time.Time `json:"last_updated"` + // Number of seconds before the data in the feed will be updated again (0 if the data should always be refreshed). + TTL uint64 `json:"ttl"` + // GBFS version number to which the feed conforms, according to the versioning framework + // (added in v1.1). + Version common.Version `json:"version"` +} diff --git a/models/golang/v3.0/manifest/manifest.go b/models/golang/v3.0/manifest/manifest.go index db29dac1..ea88f4e7 100644 --- a/models/golang/v3.0/manifest/manifest.go +++ b/models/golang/v3.0/manifest/manifest.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,78 +12,30 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// manifest, err := UnmarshalManifest(bytes) -// bytes, err = manifest.Marshal() - package manifest - - -import "encoding/json" - -func UnmarshalManifest(data []byte) (Manifest, error) { - var r Manifest - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *Manifest) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // An index of gbfs.json URLs for each GBFS data set produced by a publisher. A single // instance of this file should be published at a single stable URL, for example: // https://example.com/gbfs/manifest.json. type Manifest struct { - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version ManifestVersion `json:"version"` + header.HeaderStruct + Data Data `json:"data"` } type Data struct { - // An array of objects, each containing the keys below. - Datasets []Dataset `json:"datasets"` + // An array of objects, each containing the keys below. + Datasets []Dataset `json:"datasets"` } type Dataset struct { - // The system_id from system_information.json for the corresponding data set(s). - SystemID string `json:"system_id"` - // Contains one object, as defined below, for each of the available versions of a feed. The - // array MUST be sorted by increasing MAJOR and MINOR version number. - Versions []VersionElement `json:"versions"` + // The system_id from system_information.json for the corresponding data set(s). + SystemID common.ID `json:"system_id"` + // Contains one object, as defined below, for each of the available versions of a feed. The + // array MUST be sorted by increasing MAJOR and MINOR version number. + Versions []common.VersionElement `json:"versions"` } - -type VersionElement struct { - // URL of the corresponding gbfs.json endpoint - URL string `json:"url"` - // The semantic version of the feed in the form X.Y - Version VersionVersion `json:"version"` -} - -// The semantic version of the feed in the form X.Y -type VersionVersion string - -const ( - Purple30 VersionVersion = "3.0" - The10 VersionVersion = "1.0" - The11 VersionVersion = "1.1" - The20 VersionVersion = "2.0" - The21 VersionVersion = "2.1" - The22 VersionVersion = "2.2" - The23 VersionVersion = "2.3" -) - -type ManifestVersion string - -const ( - Fluffy30 ManifestVersion = "3.0" -) diff --git a/models/golang/v3.0/station_information/station_information.go b/models/golang/v3.0/station_information/station_information.go index 12a621e4..f25dfb15 100644 --- a/models/golang/v3.0/station_information/station_information.go +++ b/models/golang/v3.0/station_information/station_information.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,40 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// stationInformation, err := UnmarshalStationInformation(bytes) -// bytes, err = stationInformation.Marshal() - package station_information - - -import "encoding/json" - -func UnmarshalStationInformation(data []byte) (StationInformation, error) { - var r StationInformation - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *StationInformation) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" + "github.com/paulmach/orb/geojson" +) // List of all stations, their capacities and locations. REQUIRED of systems utilizing docks. type StationInformation struct { - // Array that contains one object per station as defined below. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + header.HeaderStruct + // Array that contains one object per station as defined below. + Data Data `json:"data"` } // Array that contains one object per station as defined below. @@ -54,140 +33,72 @@ type Data struct { } type Station struct { - // Address where station is located. - Address *string `json:"address,omitempty"` - // Number of total docking points installed at this station, both available and unavailable. - Capacity *int64 `json:"capacity,omitempty"` - // Contact phone of the station. Added in v2.3 - ContactPhone *string `json:"contact_phone,omitempty"` - // Cross street or landmark where the station is located. - CrossStreet *string `json:"cross_street,omitempty"` - // Does the station support charging of electric vehicles? (added in v2.3-RC) - IsChargingStation *bool `json:"is_charging_station,omitempty"` - // Are valet services provided at this station? (added in v2.1-RC) - IsValetStation *bool `json:"is_valet_station,omitempty"` - // Is this station a location with or without physical infrastructure? (added in v2.1-RC) - IsVirtualStation *bool `json:"is_virtual_station,omitempty"` - // The latitude of the station. - Lat float64 `json:"lat"` - // The longitude fo the station. - Lon float64 `json:"lon"` - // Public name of the station. - Name []Name `json:"name"` - // Are parking hoops present at this station? Added in v2.3 - ParkingHoop *bool `json:"parking_hoop,omitempty"` - // Type of parking station. Added in v2.3 - ParkingType *ParkingType `json:"parking_type,omitempty"` - // Postal code where station is located. - PostCode *string `json:"post_code,omitempty"` - // Identifier of the region where the station is located. - RegionID *string `json:"region_id,omitempty"` - // Payment methods accepted at this station. - RentalMethods []RentalMethod `json:"rental_methods,omitempty"` - // Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added - // in v1.1). - RentalUris *RentalUris `json:"rental_uris,omitempty"` - // Short name or other type of identifier. - ShortName []ShortName `json:"short_name,omitempty"` - // A multipolygon that describes the area of a virtual station (added in v2.1-RC). - StationArea *StationArea `json:"station_area,omitempty"` - // Identifier of a station. - StationID string `json:"station_id"` - // Hours of operation for the station in OSM opening_hours format. - StationOpeningHours *string `json:"station_opening_hours,omitempty"` - // This field's value is an array of objects containing the keys vehicle_type_ids and count - // defined below. These objects are used to model the total docking capacity of a station, - // both available and unavailable, for each type of vehicle that may dock at this station. - VehicleDocksCapacity []VehicleDocksCapacity `json:"vehicle_docks_capacity,omitempty"` - // This field's value is an array of objects containing the keys vehicle_type_ids and count - // defined below. These objects are used to model the parking capacity of virtual stations - // (defined using the is_virtual_station field) for each vehicle type that can be returned - // to this station. - VehicleTypesCapacity []VehicleTypesCapacity `json:"vehicle_types_capacity,omitempty"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added -// in v1.1). -type RentalUris struct { - // URI that can be passed to an Android app with an intent (added in v1.1). - Android *string `json:"android,omitempty"` - // URI that can be used on iOS to launch the rental app for this station (added in v1.1). - Ios *string `json:"ios,omitempty"` - // URL that can be used by a web browser to show more information about renting a vehicle at - // this station (added in v1.1). - Web *string `json:"web,omitempty"` -} - -type ShortName struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// A multipolygon that describes the area of a virtual station (added in v2.1-RC). -type StationArea struct { - Coordinates [][][][]float64 `json:"coordinates"` - Type Type `json:"type"` + // Address where station is located. + Address *string `json:"address,omitempty"` + // Number of total docking points installed at this station, both available and unavailable. + Capacity *uint64 `json:"capacity,omitempty"` + // Contact phone of the station. Added in v2.3 + ContactPhone *common.PhoneNumber `json:"contact_phone,omitempty"` + // Cross street or landmark where the station is located. + CrossStreet *string `json:"cross_street,omitempty"` + // Does the station support charging of electric vehicles? (added in v2.3-RC) + IsChargingStation *bool `json:"is_charging_station,omitempty"` + // Are valet services provided at this station? (added in v2.1-RC) + IsValetStation *bool `json:"is_valet_station,omitempty"` + // Is this station a location with or without physical infrastructure? (added in v2.1-RC) + IsVirtualStation *bool `json:"is_virtual_station,omitempty"` + // The latitude of the station. + Lat common.Latitude `json:"lat"` + // The longitude fo the station. + Lon common.Longitude `json:"lon"` + // Public name of the station. + Name []common.LocalizedString `json:"name"` + // Are parking hoops present at this station? Added in v2.3 + ParkingHoop *bool `json:"parking_hoop,omitempty"` + // Type of parking station. Added in v2.3 + ParkingType *common.ParkingType `json:"parking_type,omitempty"` + // Postal code where station is located. + PostCode *string `json:"post_code,omitempty"` + // Identifier of the region where the station is located. + RegionID *common.ID `json:"region_id,omitempty"` + // Payment methods accepted at this station. + RentalMethods []common.RentalMethod `json:"rental_methods,omitempty"` + // Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added + // in v1.1). + RentalUris *common.RentalUris `json:"rental_uris,omitempty"` + // Short name or other type of identifier. + ShortName []common.LocalizedString `json:"short_name,omitempty"` + // A multipolygon that describes the area of a virtual station (added in v2.1-RC). + StationArea *geojson.MultiPolygon `json:"station_area,omitempty"` + // Identifier of a station. + StationID common.ID `json:"station_id"` + // Hours of operation for the station in OSM opening_hours format. + StationOpeningHours *string `json:"station_opening_hours,omitempty"` + // This field's value is an array of objects containing the keys vehicle_type_ids and count + // defined below. These objects are used to model the total docking capacity of a station, + // both available and unavailable, for each type of vehicle that may dock at this station. + VehicleDocksCapacity []VehicleDocksCapacity `json:"vehicle_docks_capacity,omitempty"` + // This field's value is an array of objects containing the keys vehicle_type_ids and count + // defined below. These objects are used to model the parking capacity of virtual stations + // (defined using the is_virtual_station field) for each vehicle type that can be returned + // to this station. + VehicleTypesCapacity []VehicleTypesCapacity `json:"vehicle_types_capacity,omitempty"` } type VehicleDocksCapacity struct { - // A number representing the total number of docks at the station, both available and - // unavailable, that may accept the vehicle types specified by vehicle_type_ids. - Count int64 `json:"count"` - // An array of strings where each string represents a vehicle_type_id that is able to use a - // particular type of dock at the station. - VehicleTypeIDS []string `json:"vehicle_type_ids"` + // A number representing the total number of docks at the station, both available and + // unavailable, that may accept the vehicle types specified by vehicle_type_ids. + Count uint64 `json:"count"` + // An array of strings where each string represents a vehicle_type_id that is able to use a + // particular type of dock at the station. + VehicleTypeIDs []common.ID `json:"vehicle_type_ids"` } type VehicleTypesCapacity struct { - // A number representing the total number of vehicles of the specified vehicle_type_ids that - // can park within the virtual station. - Count int64 `json:"count"` - // The vehicle_type_ids, as defined in vehicle_types.json, that may park at the virtual - // station. - VehicleTypeIDS []string `json:"vehicle_type_ids"` + // A number representing the total number of vehicles of the specified vehicle_type_ids that + // can park within the virtual station. + Count uint64 `json:"count"` + // The vehicle_type_ids, as defined in vehicle_types.json, that may park at the virtual + // station. + VehicleTypeIDs []common.ID `json:"vehicle_type_ids"` } - -// Type of parking station. Added in v2.3 -type ParkingType string - -const ( - Other ParkingType = "other" - ParkingLot ParkingType = "parking_lot" - SidewalkParking ParkingType = "sidewalk_parking" - StreetParking ParkingType = "street_parking" - UndergroundParking ParkingType = "underground_parking" -) - -type RentalMethod string - -const ( - Accountnumber RentalMethod = "accountnumber" - Androidpay RentalMethod = "androidpay" - Applepay RentalMethod = "applepay" - Creditcard RentalMethod = "creditcard" - Key RentalMethod = "key" - Paypass RentalMethod = "paypass" - Phone RentalMethod = "phone" - Transitcard RentalMethod = "transitcard" -) - -type Type string - -const ( - MultiPolygon Type = "MultiPolygon" -) - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.0/station_status/station_status.go b/models/golang/v3.0/station_status/station_status.go index a510e9e1..77e52ff3 100644 --- a/models/golang/v3.0/station_status/station_status.go +++ b/models/golang/v3.0/station_status/station_status.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,40 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// stationStatus, err := UnmarshalStationStatus(bytes) -// bytes, err = stationStatus.Marshal() - package station_status - - -import "encoding/json" - -func UnmarshalStationStatus(data []byte) (StationStatus, error) { - var r StationStatus - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *StationStatus) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // Describes the capacity and rental availability of the station type StationStatus struct { - // Array that contains one object per station as defined below. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + header.HeaderStruct + + // Array that contains one object per station as defined below. + Data Data `json:"data"` } // Array that contains one object per station as defined below. @@ -54,51 +33,45 @@ type Data struct { } type Station struct { - // Is the station currently on the street? - IsInstalled bool `json:"is_installed"` - // Is the station currently renting vehicles? - IsRenting bool `json:"is_renting"` - // Is the station accepting vehicle returns? - IsReturning bool `json:"is_returning"` - // The last time this station reported its status to the operator's backend in RFC3339 - // format. - LastReported string `json:"last_reported"` - // Number of functional docks physically at the station. - NumDocksAvailable *int64 `json:"num_docks_available,omitempty"` - // Number of empty but disabled docks at the station. - NumDocksDisabled *int64 `json:"num_docks_disabled,omitempty"` - // Number of vehicles of any type physically available for rental at the station. - NumVehiclesAvailable int64 `json:"num_vehicles_available"` - // Number of disabled vehicles of any type at the station. - NumVehiclesDisabled *int64 `json:"num_vehicles_disabled,omitempty"` - // Identifier of a station. - StationID string `json:"station_id"` - // Object displaying available docks by vehicle type (added in v2.1-RC). - VehicleDocksAvailable []VehicleDocksAvailable `json:"vehicle_docks_available,omitempty"` - // Array of objects displaying the total number of each vehicle type at the station (added - // in v2.1-RC). - VehicleTypesAvailable []VehicleTypesAvailable `json:"vehicle_types_available,omitempty"` + // Is the station currently on the street? + IsInstalled bool `json:"is_installed"` + // Is the station currently renting vehicles? + IsRenting bool `json:"is_renting"` + // Is the station accepting vehicle returns? + IsReturning bool `json:"is_returning"` + // The last time this station reported its status to the operator's backend in RFC3339 + // format. + LastReported common.Timestamp `json:"last_reported"` + // Number of functional docks physically at the station. + NumDocksAvailable *uint64 `json:"num_docks_available,omitempty"` + // Number of empty but disabled docks at the station. + NumDocksDisabled *uint64 `json:"num_docks_disabled,omitempty"` + // Number of vehicles of any type physically available for rental at the station. + NumVehiclesAvailable uint64 `json:"num_vehicles_available"` + // Number of disabled vehicles of any type at the station. + NumVehiclesDisabled *uint64 `json:"num_vehicles_disabled,omitempty"` + // Identifier of a station. + StationID common.ID `json:"station_id"` + // Object displaying available docks by vehicle type (added in v2.1-RC). + VehicleDocksAvailable []VehicleDocksAvailable `json:"vehicle_docks_available,omitempty"` + // Array of objects displaying the total number of each vehicle type at the station (added + // in v2.1-RC). + VehicleTypesAvailable []VehicleTypesAvailable `json:"vehicle_types_available,omitempty"` } type VehicleDocksAvailable struct { - // A number representing the total number of available docks for the defined vehicle type - // (added in v2.1-RC). - Count int64 `json:"count"` - // An array of strings where each string represents a vehicle_type_id that is able to use a - // particular type of dock at the station (added in v2.1-RC). - VehicleTypeIDS []string `json:"vehicle_type_ids"` + // A number representing the total number of available docks for the defined vehicle type + // (added in v2.1-RC). + Count uint64 `json:"count"` + // An array of strings where each string represents a vehicle_type_id that is able to use a + // particular type of dock at the station (added in v2.1-RC). + VehicleTypeIDs []common.ID `json:"vehicle_type_ids"` } type VehicleTypesAvailable struct { - // A number representing the total amount of this vehicle type at the station (added in - // v2.1-RC). - Count int64 `json:"count"` - // The vehicle_type_id of vehicle at the station (added in v2.1-RC). - VehicleTypeID string `json:"vehicle_type_id"` + // A number representing the total amount of this vehicle type at the station (added in + // v2.1-RC). + Count uint64 `json:"count"` + // The vehicle_type_id of vehicle at the station (added in v2.1-RC). + VehicleTypeID common.ID `json:"vehicle_type_id"` } - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.0/system_alerts/system_alerts.go b/models/golang/v3.0/system_alerts/system_alerts.go index 3e5fbc5c..2d882ee9 100644 --- a/models/golang/v3.0/system_alerts/system_alerts.go +++ b/models/golang/v3.0/system_alerts/system_alerts.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,40 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// systemAlerts, err := UnmarshalSystemAlerts(bytes) -// bytes, err = systemAlerts.Marshal() - package system_alerts - - -import "encoding/json" - -func UnmarshalSystemAlerts(data []byte) (SystemAlerts, error) { - var r SystemAlerts - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *SystemAlerts) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // Describes ad-hoc changes to the system. type SystemAlerts struct { - // Array that contains ad-hoc alerts for the system. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + header.HeaderStruct + + // Array that contains ad-hoc alerts for the system. + Data Data `json:"data"` } // Array that contains ad-hoc alerts for the system. @@ -54,66 +33,29 @@ type Data struct { } type Alert struct { - // Identifier for this alert. - AlertID string `json:"alert_id"` - // Detailed description of the alert. - Description []Description `json:"description,omitempty"` - // Indicates the last time the info for the alert was updated. - LastUpdated *string `json:"last_updated,omitempty"` - // Array of identifiers of the regions for which this alert applies. - RegionIDS []string `json:"region_ids,omitempty"` - // Array of identifiers of the stations for which this alert applies. - StationIDS []string `json:"station_ids,omitempty"` - // A short summary of this alert to be displayed to the customer. - Summary []Summary `json:"summary"` - // Array of objects indicating when the alert is in effect. - Times []Time `json:"times,omitempty"` - // Type of alert. - Type Type `json:"type"` - // URL where the customer can learn more information about this alert. - URL []URL `json:"url,omitempty"` -} - -type Description struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Summary struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` + // Identifier for this alert. + AlertID common.ID `json:"alert_id"` + // Detailed description of the alert. + Description []common.LocalizedString `json:"description,omitempty"` + // Indicates the last time the info for the alert was updated. + LastUpdated *common.Timestamp `json:"last_updated,omitempty"` + // Array of identifiers of the regions for which this alert applies. + RegionIDS []common.ID `json:"region_ids,omitempty"` + // Array of identifiers of the stations for which this alert applies. + StationIDS []common.ID `json:"station_ids,omitempty"` + // A short summary of this alert to be displayed to the customer. + Summary []common.LocalizedString `json:"summary"` + // Array of objects indicating when the alert is in effect. + Times []Time `json:"times,omitempty"` + // Type of alert. + Type common.Type `json:"type"` + // URL where the customer can learn more information about this alert. + URL []common.LocalizedURL `json:"url,omitempty"` } type Time struct { - // End time of the alert. - End *string `json:"end,omitempty"` - // Start time of the alert. - Start *string `json:"start,omitempty"` + // End time of the alert. + End *common.Timestamp `json:"end,omitempty"` + // Start time of the alert. + Start *common.Timestamp `json:"start,omitempty"` } - -type URL struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// Type of alert. -type Type string - -const ( - Other Type = "other" - StationClosure Type = "station_closure" - StationMove Type = "station_move" - SystemClosure Type = "system_closure" -) - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.0/system_information/system_information.go b/models/golang/v3.0/system_information/system_information.go index 7c54f58d..30d0bf86 100644 --- a/models/golang/v3.0/system_information/system_information.go +++ b/models/golang/v3.0/system_information/system_information.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,1328 +12,92 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// systemInformation, err := UnmarshalSystemInformation(bytes) -// bytes, err = systemInformation.Marshal() - package system_information - - -import "encoding/json" - -func UnmarshalSystemInformation(data []byte) (SystemInformation, error) { - var r SystemInformation - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *SystemInformation) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // Details including system operator, system location, year implemented, URL, contact info, // time zone. type SystemInformation struct { - // Response data in the form of name:value pairs. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + header.HeaderStruct + // Response data in the form of name:value pairs. + Data Data `json:"data"` } // Response data in the form of name:value pairs. type Data struct { - // If the feed license requires attribution, name of the organization to which attribution - // should be provided. An array with one object per supported language with the following - // keys: - AttributionOrganizationName []AttributionOrganizationName `json:"attribution_organization_name,omitempty"` - // URL of the organization to which attribution should be provided. - AttributionURL *string `json:"attribution_url,omitempty"` - // An object where each key defines one of the items listed below (added in v2.3-RC). - BrandAssets *BrandAssets `json:"brand_assets,omitempty"` - // Email address actively monitored by the operator's customer service department. - Email *string `json:"email,omitempty"` - // A single contact email address for consumers of this feed to report technical issues - // (added in v1.1). - FeedContactEmail string `json:"feed_contact_email"` - // List of languages used in translated strings. Each element in the list must be of type - // Language. - Languages []string `json:"languages"` - // REQUIRED if the dataset is provided under a standard license. An identifier for a - // standard license from the SPDX License List. Provide license_id rather than license_url - // if the license is included in the SPDX License List. See the GBFS wiki for a comparison - // of a subset of standard licenses. If the license_id and license_url fields are blank or - // omitted, this indicates that the feed is provided under the Creative Commons Universal - // Public Domain Dedication. - LicenseID *LicenseID `json:"license_id,omitempty"` - // A fully qualified URL of a page that defines the license terms for the GBFS data for this - // system. - LicenseURL *string `json:"license_url,omitempty"` - // REQUIRED if the producer publishes datasets for more than one system geography, for - // example Berlin and Paris. A fully qualified URL pointing to the manifest.json file for - // the publisher. - ManifestURL *string `json:"manifest_url,omitempty"` - // Name of the system to be displayed to customers. An array with one object per supported - // language with the following keys: - Name []Name `json:"name"` - // Hours and dates of operation for the system in OSM opening_hours format. (added in v3.0) - OpeningHours string `json:"opening_hours"` - // Name of the system operator. An array with one object per supported language with the - // following keys: - Operator []Operator `json:"operator,omitempty"` - // This OPTIONAL field SHOULD contain a single voice telephone number for the specified - // system’s customer service department. MUST be in E.164 format as defined in Field Types. - PhoneNumber *string `json:"phone_number,omitempty"` - // The date that the privacy policy provided at privacy_url was last updated (added in - // v2.3-RC). - PrivacyLastUpdated *string `json:"privacy_last_updated,omitempty"` - // A fully qualified URL pointing to the privacy policy for the service. An array with one - // object per supported language with the following keys: - PrivacyURL []PrivacyURL `json:"privacy_url,omitempty"` - // URL where a customer can purchase a membership. - PurchaseURL *string `json:"purchase_url,omitempty"` - // Contains rental app information in the android and ios JSON objects (added in v1.1). - RentalApps *RentalApps `json:"rental_apps,omitempty"` - // Abbreviation for a system. An array with one object per supported language with the - // following keys: - ShortName []ShortName `json:"short_name,omitempty"` - // Date that the system began operations. - StartDate *string `json:"start_date,omitempty"` - // Identifier for this vehicle share system. This should be globally unique (even between - // different systems). - SystemID string `json:"system_id"` - // Date after which this data source will no longer be available to consuming applications. - TerminationDate *string `json:"termination_date,omitempty"` - // The date that the terms of service provided at terms_url were last updated (added in - // v2.3-RC) - TermsLastUpdated *string `json:"terms_last_updated,omitempty"` - // A fully qualified URL pointing to the terms of service (also often called "terms of use" - // or "terms and conditions") for the service. An array with one object per supported - // language with the following keys: - TermsURL []TermsURL `json:"terms_url,omitempty"` - // The time zone where the system is located. - Timezone Timezone `json:"timezone"` - // The URL of the vehicle share system. - URL *string `json:"url,omitempty"` -} - -type AttributionOrganizationName struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// An object where each key defines one of the items listed below (added in v2.3-RC). -type BrandAssets struct { - // A fully qualified URL pointing to the location of a graphic file representing the brand - // for the service (added in v2.3-RC). - BrandImageURL string `json:"brand_image_url"` - // A fully qualified URL pointing to the location of a graphic file representing the brand - // for the service for use in dark mode (added in v2.3-RC). - BrandImageURLDark *string `json:"brand_image_url_dark,omitempty"` - // Date that indicates the last time any included brand assets were updated (added in - // v2.3-RC). - BrandLastModified string `json:"brand_last_modified"` - // A fully qualified URL pointing to the location of a page that defines the license terms - // of brand icons, colors or other trademark information (added in v2.3-RC). - BrandTermsURL *string `json:"brand_terms_url,omitempty"` - // Color used to represent the brand for the service (added in v2.3-RC) - Color *string `json:"color,omitempty"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Operator struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type PrivacyURL struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` + // If the feed license requires attribution, name of the organization to which attribution + // should be provided. An array with one object per supported language with the following + // keys: + AttributionOrganizationName []common.LocalizedString `json:"attribution_organization_name,omitempty"` + // URL of the organization to which attribution should be provided. + AttributionURL *common.URL `json:"attribution_url,omitempty"` + // An object where each key defines one of the items listed below (added in v2.3-RC). + BrandAssets *common.BrandAssets `json:"brand_assets,omitempty"` + // Email address actively monitored by the operator's customer service department. + Email *common.Email `json:"email,omitempty"` + // A single contact email address for consumers of this feed to report technical issues + // (added in v1.1). + FeedContactEmail common.Email `json:"feed_contact_email"` + // List of languages used in translated strings. Each element in the list must be of type + // Language. + Languages []common.Language `json:"languages"` + // REQUIRED if the dataset is provided under a standard license. An identifier for a + // standard license from the SPDX License List. Provide license_id rather than license_url + // if the license is included in the SPDX License List. See the GBFS wiki for a comparison + // of a subset of standard licenses. If the license_id and license_url fields are blank or + // omitted, this indicates that the feed is provided under the Creative Commons Universal + // Public Domain Dedication. + LicenseID *common.LicenseID `json:"license_id,omitempty"` + // A fully qualified URL of a page that defines the license terms for the GBFS data for this + // system. + LicenseURL *common.URL `json:"license_url,omitempty"` + // REQUIRED if the producer publishes datasets for more than one system geography, for + // example Berlin and Paris. A fully qualified URL pointing to the manifest.json file for + // the publisher. + ManifestURL *common.URL `json:"manifest_url,omitempty"` + // Name of the system to be displayed to customers. An array with one object per supported + // language with the following keys: + Name []common.LocalizedString `json:"name"` + // Hours and dates of operation for the system in OSM opening_hours format. (added in v3.0) + OpeningHours string `json:"opening_hours"` + // Name of the system operator. An array with one object per supported language with the + // following keys: + Operator []common.LocalizedString `json:"operator,omitempty"` + // This OPTIONAL field SHOULD contain a single voice telephone number for the specified + // system’s customer service department. MUST be in E.164 format as defined in Field Types. + PhoneNumber *common.PhoneNumber `json:"phone_number,omitempty"` + // The date that the privacy policy provided at privacy_url was last updated (added in + // v2.3-RC). + PrivacyLastUpdated *common.Date `json:"privacy_last_updated,omitempty"` + // A fully qualified URL pointing to the privacy policy for the service. An array with one + // object per supported language with the following keys: + PrivacyURL []common.LocalizedString `json:"privacy_url,omitempty"` + // URL where a customer can purchase a membership. + PurchaseURL *common.URL `json:"purchase_url,omitempty"` + // Contains rental app information in the android and ios JSON objects (added in v1.1). + RentalApps *common.RentalApps `json:"rental_apps,omitempty"` + // Abbreviation for a system. An array with one object per supported language with the + // following keys: + ShortName []common.LocalizedString `json:"short_name,omitempty"` + // Date that the system began operations. + StartDate *common.Date `json:"start_date,omitempty"` + // Identifier for this vehicle share system. This should be globally unique (even between + // different systems). + SystemID common.ID `json:"system_id"` + // Date after which this data source will no longer be available to consuming applications. + TerminationDate *common.Date `json:"termination_date,omitempty"` + // The date that the terms of service provided at terms_url were last updated (added in v2.3-RC) + TermsLastUpdated *common.Date `json:"terms_last_updated,omitempty"` + // A fully qualified URL pointing to the terms of service (also often called "terms of use" + // or "terms and conditions") for the service. An array with one object per supported + // language with the following keys: + TermsURL []common.LocalizedString `json:"terms_url,omitempty"` + // The time zone where the system is located. + Timezone common.Timezone `json:"timezone"` + // The URL of the vehicle share system. + URL *common.URL `json:"url,omitempty"` } - -// Contains rental app information in the android and ios JSON objects (added in v1.1). -type RentalApps struct { - // Contains rental app download and app discovery information for the Android platform. - // (added in v1.1) - Android *Android `json:"android,omitempty"` - // Contains rental information for the iOS platform (added in v1.1). - Ios *Ios `json:"ios,omitempty"` -} - -// Contains rental app download and app discovery information for the Android platform. -// (added in v1.1) -type Android struct { - // URI that can be used to discover if the rental Android app is installed on the device - // (added in v1.1). - DiscoveryURI string `json:"discovery_uri"` - // URI where the rental Android app can be downloaded from (added in v1.1). - StoreURI string `json:"store_uri"` -} - -// Contains rental information for the iOS platform (added in v1.1). -type Ios struct { - // URI that can be used to discover if the rental iOS app is installed on the device (added - // in v1.1). - DiscoveryURI string `json:"discovery_uri"` - // URI where the rental iOS app can be downloaded from (added in v1.1). - StoreURI string `json:"store_uri"` -} - -type ShortName struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type TermsURL struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// REQUIRED if the dataset is provided under a standard license. An identifier for a -// standard license from the SPDX License List. Provide license_id rather than license_url -// if the license is included in the SPDX License List. See the GBFS wiki for a comparison -// of a subset of standard licenses. If the license_id and license_url fields are blank or -// omitted, this indicates that the feed is provided under the Creative Commons Universal -// Public Domain Dedication. -type LicenseID string - -const ( - AAL LicenseID = "AAL" - ADSL LicenseID = "ADSL" - AGPL10Only LicenseID = "AGPL-1.0-only" - AGPL10OrLater LicenseID = "AGPL-1.0-or-later" - AGPL30Only LicenseID = "AGPL-3.0-only" - AGPL30OrLater LicenseID = "AGPL-3.0-or-later" - ANTLRPDFallback LicenseID = "ANTLR-PD-fallback" - APL10 LicenseID = "APL-1.0" - Abstyles LicenseID = "Abstyles" - AdaCoreDoc LicenseID = "AdaCore-doc" - Adobe2006 LicenseID = "Adobe-2006" - AdobeGlyph LicenseID = "Adobe-Glyph" - Afl11 LicenseID = "AFL-1.1" - Afl12 LicenseID = "AFL-1.2" - Afl20 LicenseID = "AFL-2.0" - Afl21 LicenseID = "AFL-2.1" - Afl30 LicenseID = "AFL-3.0" - Afmparse LicenseID = "Afmparse" - Aladdin LicenseID = "Aladdin" - Amdplpa LicenseID = "AMDPLPA" - Aml LicenseID = "AML" - Ampas LicenseID = "AMPAS" - AntlrPD LicenseID = "ANTLR-PD" - Apache10 LicenseID = "Apache-1.0" - Apache11 LicenseID = "Apache-1.1" - Apache20 LicenseID = "Apache-2.0" - Apafml LicenseID = "APAFML" - AppS2P LicenseID = "App-s2p" - Apsl10 LicenseID = "APSL-1.0" - Apsl11 LicenseID = "APSL-1.1" - Apsl12 LicenseID = "APSL-1.2" - Apsl20 LicenseID = "APSL-2.0" - Arphic1999 LicenseID = "Arphic-1999" - Artistic10 LicenseID = "Artistic-1.0" - Artistic10Cl8 LicenseID = "Artistic-1.0-cl8" - Artistic10PERL LicenseID = "Artistic-1.0-Perl" - Artistic20 LicenseID = "Artistic-2.0" - BSD1Clause LicenseID = "BSD-1-Clause" - BSD2Clause LicenseID = "BSD-2-Clause" - BSD2ClausePatent LicenseID = "BSD-2-Clause-Patent" - BSD2ClauseViews LicenseID = "BSD-2-Clause-Views" - BSD3Clause LicenseID = "BSD-3-Clause" - BSD3ClauseAttribution LicenseID = "BSD-3-Clause-Attribution" - BSD3ClauseClear LicenseID = "BSD-3-Clause-Clear" - BSD3ClauseLBNL LicenseID = "BSD-3-Clause-LBNL" - BSD3ClauseModification LicenseID = "BSD-3-Clause-Modification" - BSD3ClauseNoMilitaryLicense LicenseID = "BSD-3-Clause-No-Military-License" - BSD3ClauseNoNuclearLicense LicenseID = "BSD-3-Clause-No-Nuclear-License" - BSD3ClauseNoNuclearLicense2014 LicenseID = "BSD-3-Clause-No-Nuclear-License-2014" - BSD3ClauseNoNuclearWarranty LicenseID = "BSD-3-Clause-No-Nuclear-Warranty" - BSD3ClauseOpenMPI LicenseID = "BSD-3-Clause-Open-MPI" - BSD43Reno LicenseID = "BSD-4.3RENO" - BSD43Tahoe LicenseID = "BSD-4.3TAHOE" - BSD4Clause LicenseID = "BSD-4-Clause" - BSD4ClauseShortened LicenseID = "BSD-4-Clause-Shortened" - BSD4ClauseUC LicenseID = "BSD-4-Clause-UC" - BSDAdvertisingAcknowledgement LicenseID = "BSD-Advertising-Acknowledgement" - BSDAttributionHPNDDisclaimer LicenseID = "BSD-Attribution-HPND-disclaimer" - BSDProtection LicenseID = "BSD-Protection" - BSDSourceCode LicenseID = "BSD-Source-Code" - Baekmuk LicenseID = "Baekmuk" - Bahyph LicenseID = "Bahyph" - Barr LicenseID = "Barr" - Beerware LicenseID = "Beerware" - BitTorrent10 LicenseID = "BitTorrent-1.0" - BitTorrent11 LicenseID = "BitTorrent-1.1" - BitstreamCharter LicenseID = "Bitstream-Charter" - BitstreamVera LicenseID = "Bitstream-Vera" - Blessing LicenseID = "blessing" - BlueOak100 LicenseID = "BlueOak-1.0.0" - Borceux LicenseID = "Borceux" - BrianGladman3Clause LicenseID = "Brian-Gladman-3-Clause" - Bsl10 LicenseID = "BSL-1.0" - Busl11 LicenseID = "BUSL-1.1" - Bzip2106 LicenseID = "bzip2-1.0.6" - CAL10CombinedWorkException LicenseID = "CAL-1.0-Combined-Work-Exception" - CDLAPermissive10 LicenseID = "CDLA-Permissive-1.0" - CDLAPermissive20 LicenseID = "CDLA-Permissive-2.0" - CDLASharing10 LicenseID = "CDLA-Sharing-1.0" - CMUMach LicenseID = "CMU-Mach" - CNRIJython LicenseID = "CNRI-Jython" - CNRIPython LicenseID = "CNRI-Python" - CNRIPythonGPLCompatible LicenseID = "CNRI-Python-GPL-Compatible" - CUAOpl10 LicenseID = "CUA-OPL-1.0" - CUda10 LicenseID = "C-UDA-1.0" - Cal10 LicenseID = "CAL-1.0" - Caldera LicenseID = "Caldera" - Catosl11 LicenseID = "CATOSL-1.1" - Cc010 LicenseID = "CC0-1.0" - CcBy10 LicenseID = "CC-BY-1.0" - CcBy20 LicenseID = "CC-BY-2.0" - CcBy25 LicenseID = "CC-BY-2.5" - CcBy25Au LicenseID = "CC-BY-2.5-AU" - CcBy30 LicenseID = "CC-BY-3.0" - CcBy30At LicenseID = "CC-BY-3.0-AT" - CcBy30De LicenseID = "CC-BY-3.0-DE" - CcBy30Igo LicenseID = "CC-BY-3.0-IGO" - CcBy30Nl LicenseID = "CC-BY-3.0-NL" - CcBy30Us LicenseID = "CC-BY-3.0-US" - CcBy40 LicenseID = "CC-BY-4.0" - CcByNc10 LicenseID = "CC-BY-NC-1.0" - CcByNc20 LicenseID = "CC-BY-NC-2.0" - CcByNc25 LicenseID = "CC-BY-NC-2.5" - CcByNc30 LicenseID = "CC-BY-NC-3.0" - CcByNc30De LicenseID = "CC-BY-NC-3.0-DE" - CcByNc40 LicenseID = "CC-BY-NC-4.0" - CcByNcNd10 LicenseID = "CC-BY-NC-ND-1.0" - CcByNcNd20 LicenseID = "CC-BY-NC-ND-2.0" - CcByNcNd25 LicenseID = "CC-BY-NC-ND-2.5" - CcByNcNd30 LicenseID = "CC-BY-NC-ND-3.0" - CcByNcNd30De LicenseID = "CC-BY-NC-ND-3.0-DE" - CcByNcNd30Igo LicenseID = "CC-BY-NC-ND-3.0-IGO" - CcByNcNd40 LicenseID = "CC-BY-NC-ND-4.0" - CcByNcSa10 LicenseID = "CC-BY-NC-SA-1.0" - CcByNcSa20 LicenseID = "CC-BY-NC-SA-2.0" - CcByNcSa20De LicenseID = "CC-BY-NC-SA-2.0-DE" - CcByNcSa20Fr LicenseID = "CC-BY-NC-SA-2.0-FR" - CcByNcSa20Uk LicenseID = "CC-BY-NC-SA-2.0-UK" - CcByNcSa25 LicenseID = "CC-BY-NC-SA-2.5" - CcByNcSa30 LicenseID = "CC-BY-NC-SA-3.0" - CcByNcSa30De LicenseID = "CC-BY-NC-SA-3.0-DE" - CcByNcSa30Igo LicenseID = "CC-BY-NC-SA-3.0-IGO" - CcByNcSa40 LicenseID = "CC-BY-NC-SA-4.0" - CcByNd10 LicenseID = "CC-BY-ND-1.0" - CcByNd20 LicenseID = "CC-BY-ND-2.0" - CcByNd25 LicenseID = "CC-BY-ND-2.5" - CcByNd30 LicenseID = "CC-BY-ND-3.0" - CcByNd30De LicenseID = "CC-BY-ND-3.0-DE" - CcByNd40 LicenseID = "CC-BY-ND-4.0" - CcBySa10 LicenseID = "CC-BY-SA-1.0" - CcBySa20 LicenseID = "CC-BY-SA-2.0" - CcBySa20Uk LicenseID = "CC-BY-SA-2.0-UK" - CcBySa21Jp LicenseID = "CC-BY-SA-2.1-JP" - CcBySa25 LicenseID = "CC-BY-SA-2.5" - CcBySa30 LicenseID = "CC-BY-SA-3.0" - CcBySa30At LicenseID = "CC-BY-SA-3.0-AT" - CcBySa30De LicenseID = "CC-BY-SA-3.0-DE" - CcBySa40 LicenseID = "CC-BY-SA-4.0" - CcPddc LicenseID = "CC-PDDC" - Cddl10 LicenseID = "CDDL-1.0" - Cddl11 LicenseID = "CDDL-1.1" - Cdl10 LicenseID = "CDL-1.0" - Cecill10 LicenseID = "CECILL-1.0" - Cecill11 LicenseID = "CECILL-1.1" - Cecill20 LicenseID = "CECILL-2.0" - Cecill21 LicenseID = "CECILL-2.1" - CecillB LicenseID = "CECILL-B" - CecillC LicenseID = "CECILL-C" - CernOhl11 LicenseID = "CERN-OHL-1.1" - CernOhl12 LicenseID = "CERN-OHL-1.2" - CernOhlP20 LicenseID = "CERN-OHL-P-2.0" - CernOhlS20 LicenseID = "CERN-OHL-S-2.0" - CernOhlW20 LicenseID = "CERN-OHL-W-2.0" - Cfitsio LicenseID = "CFITSIO" - Checkmk LicenseID = "checkmk" - ClArtistic LicenseID = "ClArtistic" - Clips LicenseID = "Clips" - Coil10 LicenseID = "COIL-1.0" - CommunitySpec10 LicenseID = "Community-Spec-1.0" - Condor11 LicenseID = "Condor-1.1" - CopyleftNext030 LicenseID = "copyleft-next-0.3.0" - CopyleftNext031 LicenseID = "copyleft-next-0.3.1" - CornellLosslessJPEG LicenseID = "Cornell-Lossless-JPEG" - Cpal10 LicenseID = "CPAL-1.0" - Cpl10 LicenseID = "CPL-1.0" - Cpol102 LicenseID = "CPOL-1.02" - Crossword LicenseID = "Crossword" - CrystalStacker LicenseID = "CrystalStacker" - Cube LicenseID = "Cube" - Curl LicenseID = "curl" - DFsl10 LicenseID = "D-FSL-1.0" - DLDeBy20 LicenseID = "DL-DE-BY-2.0" - Diffmark LicenseID = "diffmark" - Doc LicenseID = "DOC" - Dotseqn LicenseID = "Dotseqn" - Drl10 LicenseID = "DRL-1.0" - Dsdp LicenseID = "DSDP" - Dvipdfm LicenseID = "dvipdfm" - EGenix LicenseID = "eGenix" - EUDatagrid LicenseID = "EUDatagrid" - Ecl10 LicenseID = "ECL-1.0" - Ecl20 LicenseID = "ECL-2.0" - Efl10 LicenseID = "EFL-1.0" - Efl20 LicenseID = "EFL-2.0" - Elastic20 LicenseID = "Elastic-2.0" - Entessa LicenseID = "Entessa" - Epics LicenseID = "EPICS" - Epl10 LicenseID = "EPL-1.0" - Epl20 LicenseID = "EPL-2.0" - ErlPL11 LicenseID = "ErlPL-1.1" - Etalab20 LicenseID = "etalab-2.0" - Eupl10 LicenseID = "EUPL-1.0" - Eupl11 LicenseID = "EUPL-1.1" - Eupl12 LicenseID = "EUPL-1.2" - Eurosym LicenseID = "Eurosym" - Fair LicenseID = "Fair" - FdkAAC LicenseID = "FDK-AAC" - Frameworx10 LicenseID = "Frameworx-1.0" - FreeBSDDOC LicenseID = "FreeBSD-DOC" - FreeImage LicenseID = "FreeImage" - Fsfap LicenseID = "FSFAP" - Fsful LicenseID = "FSFUL" - Fsfullr LicenseID = "FSFULLR" - Fsfullrwd LicenseID = "FSFULLRWD" - Ftl LicenseID = "FTL" - GFDL11InvariantsOnly LicenseID = "GFDL-1.1-invariants-only" - GFDL11InvariantsOrLater LicenseID = "GFDL-1.1-invariants-or-later" - GFDL11NoInvariantsOnly LicenseID = "GFDL-1.1-no-invariants-only" - GFDL11NoInvariantsOrLater LicenseID = "GFDL-1.1-no-invariants-or-later" - GFDL11Only LicenseID = "GFDL-1.1-only" - GFDL11OrLater LicenseID = "GFDL-1.1-or-later" - GFDL12InvariantsOnly LicenseID = "GFDL-1.2-invariants-only" - GFDL12InvariantsOrLater LicenseID = "GFDL-1.2-invariants-or-later" - GFDL12NoInvariantsOnly LicenseID = "GFDL-1.2-no-invariants-only" - GFDL12NoInvariantsOrLater LicenseID = "GFDL-1.2-no-invariants-or-later" - GFDL12Only LicenseID = "GFDL-1.2-only" - GFDL12OrLater LicenseID = "GFDL-1.2-or-later" - GFDL13InvariantsOnly LicenseID = "GFDL-1.3-invariants-only" - GFDL13InvariantsOrLater LicenseID = "GFDL-1.3-invariants-or-later" - GFDL13NoInvariantsOnly LicenseID = "GFDL-1.3-no-invariants-only" - GFDL13NoInvariantsOrLater LicenseID = "GFDL-1.3-no-invariants-or-later" - GFDL13Only LicenseID = "GFDL-1.3-only" - GFDL13OrLater LicenseID = "GFDL-1.3-or-later" - GPL10Only LicenseID = "GPL-1.0-only" - GPL10OrLater LicenseID = "GPL-1.0-or-later" - GPL20Only LicenseID = "GPL-2.0-only" - GPL20OrLater LicenseID = "GPL-2.0-or-later" - GPL30Only LicenseID = "GPL-3.0-only" - GPL30OrLater LicenseID = "GPL-3.0-or-later" - GSOAP13B LicenseID = "gSOAP-1.3b" - Gd LicenseID = "GD" - Giftware LicenseID = "Giftware" - Gl2PS LicenseID = "GL2PS" - Glide LicenseID = "Glide" - Glulxe LicenseID = "Glulxe" - Glwtpl LicenseID = "GLWTPL" - Gnuplot LicenseID = "gnuplot" - GraphicsGems LicenseID = "Graphics-Gems" - HP1986 LicenseID = "HP-1986" - HPNDExportUS LicenseID = "HPND-export-US" - HPNDMarkusKuhn LicenseID = "HPND-Markus-Kuhn" - HPNDSellVariant LicenseID = "HPND-sell-variant" - HPNDSellVariantMITDisclaimer LicenseID = "HPND-sell-variant-MIT-disclaimer" - HaskellReport LicenseID = "HaskellReport" - Hippocratic21 LicenseID = "Hippocratic-2.1" - Hpnd LicenseID = "HPND" - Htmltidy LicenseID = "HTMLTIDY" - IBMPibs LicenseID = "IBM-pibs" - IECCodeComponentsEULA LicenseID = "IEC-Code-Components-EULA" - IJGShort LicenseID = "IJG-short" - IMatix LicenseID = "iMatix" - IPL10 LicenseID = "IPL-1.0" - ISC LicenseID = "ISC" - Icu LicenseID = "ICU" - Ijg LicenseID = "IJG" - ImageMagick LicenseID = "ImageMagick" - Imlib2 LicenseID = "Imlib2" - InfoZIP LicenseID = "Info-ZIP" - Intel LicenseID = "Intel" - IntelACPI LicenseID = "Intel-ACPI" - Interbase10 LicenseID = "Interbase-1.0" - Ipa LicenseID = "IPA" - JPLImage LicenseID = "JPL-image" - JSON LicenseID = "JSON" - Jam LicenseID = "Jam" - JasPer20 LicenseID = "JasPer-2.0" - Jpnic LicenseID = "JPNIC" - Kazlib LicenseID = "Kazlib" - KnuthCTAN LicenseID = "Knuth-CTAN" - LGPL20Only LicenseID = "LGPL-2.0-only" - LGPL20OrLater LicenseID = "LGPL-2.0-or-later" - LGPL21Only LicenseID = "LGPL-2.1-only" - LGPL21OrLater LicenseID = "LGPL-2.1-or-later" - LGPL30Only LicenseID = "LGPL-3.0-only" - LGPL30OrLater LicenseID = "LGPL-3.0-or-later" - LPPL13A LicenseID = "LPPL-1.3a" - LPPL13C LicenseID = "LPPL-1.3c" - LZMASDK911To920 LicenseID = "LZMA-SDK-9.11-to-9.20" - Lal12 LicenseID = "LAL-1.2" - Lal13 LicenseID = "LAL-1.3" - Latex2E LicenseID = "Latex2e" - Leptonica LicenseID = "Leptonica" - Lgpllr LicenseID = "LGPLLR" - LiLiQP11 LicenseID = "LiLiQ-P-1.1" - LiLiQR11 LicenseID = "LiLiQ-R-1.1" - LiLiQRplus11 LicenseID = "LiLiQ-Rplus-1.1" - Libpng LicenseID = "Libpng" - Libpng20 LicenseID = "libpng-2.0" - Libselinux10 LicenseID = "libselinux-1.0" - Libtiff LicenseID = "libtiff" - LibutilDavidNugent LicenseID = "libutil-David-Nugent" - LinuxManPagesCopyleft LicenseID = "Linux-man-pages-copyleft" - LinuxOpenIB LicenseID = "Linux-OpenIB" - Loop LicenseID = "LOOP" - Lpl10 LicenseID = "LPL-1.0" - Lpl102 LicenseID = "LPL-1.02" - Lppl10 LicenseID = "LPPL-1.0" - Lppl11 LicenseID = "LPPL-1.1" - Lppl12 LicenseID = "LPPL-1.2" - LzmaSDK922 LicenseID = "LZMA-SDK-9.22" - MIT LicenseID = "MIT" - MIT0 LicenseID = "MIT-0" - MITAdvertising LicenseID = "MIT-advertising" - MITCmu LicenseID = "MIT-CMU" - MITEnna LicenseID = "MIT-enna" - MITFeh LicenseID = "MIT-feh" - MITModernVariant LicenseID = "MIT-Modern-Variant" - MITOpenGroup LicenseID = "MIT-open-group" - MITWu LicenseID = "MIT-Wu" - MPL10 LicenseID = "MPL-1.0" - MPL11 LicenseID = "MPL-1.1" - MPL20 LicenseID = "MPL-2.0" - MPL20NoCopyleftException LicenseID = "MPL-2.0-no-copyleft-exception" - MSLpl LicenseID = "MS-LPL" - MSPl LicenseID = "MS-PL" - MSRl LicenseID = "MS-RL" - MakeIndex LicenseID = "MakeIndex" - MartinBirgmeier LicenseID = "Martin-Birgmeier" - Minpack LicenseID = "Minpack" - MirOS LicenseID = "MirOS" - Mitnfa LicenseID = "MITNFA" - Motosoto LicenseID = "Motosoto" - MpiPermissive LicenseID = "mpi-permissive" - Mpich2 LicenseID = "mpich2" - Mplus LicenseID = "mplus" - Mtll LicenseID = "MTLL" - MulanPSL10 LicenseID = "MulanPSL-1.0" - MulanPSL20 LicenseID = "MulanPSL-2.0" - Multics LicenseID = "Multics" - Mup LicenseID = "Mup" - NCSA LicenseID = "NCSA" - NISTPD LicenseID = "NIST-PD" - NISTPDFallback LicenseID = "NIST-PD-fallback" - NPL10 LicenseID = "NPL-1.0" - NPL11 LicenseID = "NPL-1.1" - NTP LicenseID = "NTP" - NTP0 LicenseID = "NTP-0" - Naist2003 LicenseID = "NAIST-2003" - Nasa13 LicenseID = "NASA-1.3" - Naumen LicenseID = "Naumen" - Nbpl10 LicenseID = "NBPL-1.0" - NcglUk20 LicenseID = "NCGL-UK-2.0" - NetCDF LicenseID = "NetCDF" - NetSNMP LicenseID = "Net-SNMP" - Newsletr LicenseID = "Newsletr" - Ngpl LicenseID = "NGPL" - Nicta10 LicenseID = "NICTA-1.0" - Nlod10 LicenseID = "NLOD-1.0" - Nlod20 LicenseID = "NLOD-2.0" - Nlpl LicenseID = "NLPL" - Nokia LicenseID = "Nokia" - Nosl LicenseID = "NOSL" - Noweb LicenseID = "Noweb" - Nposl30 LicenseID = "NPOSL-3.0" - Nrl LicenseID = "NRL" - ODBL10 LicenseID = "ODbL-1.0" - ODCBy10 LicenseID = "ODC-By-1.0" - OFL10NoRFN LicenseID = "OFL-1.0-no-RFN" - OFL11NoRFN LicenseID = "OFL-1.1-no-RFN" - OGDLTaiwan10 LicenseID = "OGDL-Taiwan-1.0" - OGLCanada20 LicenseID = "OGL-Canada-2.0" - OUda10 LicenseID = "O-UDA-1.0" - OcctPl LicenseID = "OCCT-PL" - Oclc20 LicenseID = "OCLC-2.0" - Offis LicenseID = "OFFIS" - Ofl10 LicenseID = "OFL-1.0" - Ofl10Rfn LicenseID = "OFL-1.0-RFN" - Ofl11 LicenseID = "OFL-1.1" - Ofl11Rfn LicenseID = "OFL-1.1-RFN" - Ogc10 LicenseID = "OGC-1.0" - OglUk10 LicenseID = "OGL-UK-1.0" - OglUk20 LicenseID = "OGL-UK-2.0" - OglUk30 LicenseID = "OGL-UK-3.0" - Ogtsl LicenseID = "OGTSL" - Oldap11 LicenseID = "OLDAP-1.1" - Oldap12 LicenseID = "OLDAP-1.2" - Oldap13 LicenseID = "OLDAP-1.3" - Oldap14 LicenseID = "OLDAP-1.4" - Oldap20 LicenseID = "OLDAP-2.0" - Oldap201 LicenseID = "OLDAP-2.0.1" - Oldap21 LicenseID = "OLDAP-2.1" - Oldap22 LicenseID = "OLDAP-2.2" - Oldap221 LicenseID = "OLDAP-2.2.1" - Oldap222 LicenseID = "OLDAP-2.2.2" - Oldap23 LicenseID = "OLDAP-2.3" - Oldap24 LicenseID = "OLDAP-2.4" - Oldap25 LicenseID = "OLDAP-2.5" - Oldap26 LicenseID = "OLDAP-2.6" - Oldap27 LicenseID = "OLDAP-2.7" - Oldap28 LicenseID = "OLDAP-2.8" - Oml LicenseID = "OML" - OpenPBS23 LicenseID = "OpenPBS-2.3" - OpenSSL LicenseID = "OpenSSL" - Opl10 LicenseID = "OPL-1.0" - Opubl10 LicenseID = "OPUBL-1.0" - OsetPl21 LicenseID = "OSET-PL-2.1" - Osl10 LicenseID = "OSL-1.0" - Osl11 LicenseID = "OSL-1.1" - Osl20 LicenseID = "OSL-2.0" - Osl21 LicenseID = "OSL-2.1" - Osl30 LicenseID = "OSL-3.0" - PHP30 LicenseID = "PHP-3.0" - PHP301 LicenseID = "PHP-3.01" - Parity600 LicenseID = "Parity-6.0.0" - Parity700 LicenseID = "Parity-7.0.0" - Pddl10 LicenseID = "PDDL-1.0" - Plexus LicenseID = "Plexus" - PolyFormNoncommercial100 LicenseID = "PolyForm-Noncommercial-1.0.0" - PolyFormSmallBusiness100 LicenseID = "PolyForm-Small-Business-1.0.0" - PostgreSQL LicenseID = "PostgreSQL" - Psf20 LicenseID = "PSF-2.0" - Psfrag LicenseID = "psfrag" - Psutils LicenseID = "psutils" - Python20 LicenseID = "Python-2.0" - Python201 LicenseID = "Python-2.0.1" - Qhull LicenseID = "Qhull" - Qpl10 LicenseID = "QPL-1.0" - Qpl10Inria2004 LicenseID = "QPL-1.0-INRIA-2004" - RHeCos11 LicenseID = "RHeCos-1.1" - RSAMd LicenseID = "RSA-MD" - Rdisc LicenseID = "Rdisc" - Rpl11 LicenseID = "RPL-1.1" - Rpl15 LicenseID = "RPL-1.5" - Rpsl10 LicenseID = "RPSL-1.0" - Rscpl LicenseID = "RSCPL" - Ruby LicenseID = "Ruby" - SAXPD LicenseID = "SAX-PD" - SGIB10 LicenseID = "SGI-B-1.0" - SGIB11 LicenseID = "SGI-B-1.1" - SGIB20 LicenseID = "SGI-B-2.0" - SSHOpenSSH LicenseID = "SSH-OpenSSH" - SSHShort LicenseID = "SSH-short" - Saxpath LicenseID = "Saxpath" - Scea LicenseID = "SCEA" - SchemeReport LicenseID = "SchemeReport" - Sendmail LicenseID = "Sendmail" - Sendmail823 LicenseID = "Sendmail-8.23" - Shl05 LicenseID = "SHL-0.5" - Shl051 LicenseID = "SHL-0.51" - SimPL20 LicenseID = "SimPL-2.0" - Sissl LicenseID = "SISSL" - Sissl12 LicenseID = "SISSL-1.2" - Sleepycat LicenseID = "Sleepycat" - Smlnj LicenseID = "SMLNJ" - Smppl LicenseID = "SMPPL" - Snia LicenseID = "SNIA" - Snprintf LicenseID = "snprintf" - Spencer86 LicenseID = "Spencer-86" - Spencer94 LicenseID = "Spencer-94" - Spencer99 LicenseID = "Spencer-99" - Spl10 LicenseID = "SPL-1.0" - Sspl10 LicenseID = "SSPL-1.0" - SugarCRM113 LicenseID = "SugarCRM-1.1.3" - SunPro LicenseID = "SunPro" - Swl LicenseID = "SWL" - Symlinks LicenseID = "Symlinks" - TCPWrappers LicenseID = "TCP-wrappers" - TMate LicenseID = "TMate" - TUBerlin10 LicenseID = "TU-Berlin-1.0" - TUBerlin20 LicenseID = "TU-Berlin-2.0" - TaprOhl10 LicenseID = "TAPR-OHL-1.0" - Tcl LicenseID = "TCL" - The0BSD LicenseID = "0BSD" - Torque11 LicenseID = "TORQUE-1.1" - Tosl LicenseID = "TOSL" - Tpdl LicenseID = "TPDL" - Tpl10 LicenseID = "TPL-1.0" - Ttwl LicenseID = "TTWL" - Ucar LicenseID = "UCAR" - Ucl10 LicenseID = "UCL-1.0" - UnicodeDFS2015 LicenseID = "Unicode-DFS-2015" - UnicodeDFS2016 LicenseID = "Unicode-DFS-2016" - UnicodeTOU LicenseID = "Unicode-TOU" - Unlicense LicenseID = "Unlicense" - Upl10 LicenseID = "UPL-1.0" - Vim LicenseID = "Vim" - Vostrom LicenseID = "VOSTROM" - Vsl10 LicenseID = "VSL-1.0" - W3C LicenseID = "W3C" - W3C19980720 LicenseID = "W3C-19980720" - W3C20150513 LicenseID = "W3C-20150513" - W3M LicenseID = "w3m" - Watcom10 LicenseID = "Watcom-1.0" - Wsuipa LicenseID = "Wsuipa" - Wtfpl LicenseID = "WTFPL" - X11 LicenseID = "X11" - X11DistributeModificationsVariant LicenseID = "X11-distribute-modifications-variant" - XFree8611 LicenseID = "XFree86-1.1" - XSkat LicenseID = "XSkat" - Xerox LicenseID = "Xerox" - Xinetd LicenseID = "xinetd" - Xlock LicenseID = "xlock" - Xnet LicenseID = "Xnet" - Xpp LicenseID = "xpp" - Ypl10 LicenseID = "YPL-1.0" - Ypl11 LicenseID = "YPL-1.1" - ZPL11 LicenseID = "ZPL-1.1" - ZPL20 LicenseID = "ZPL-2.0" - ZPL21 LicenseID = "ZPL-2.1" - Zed LicenseID = "Zed" - Zend20 LicenseID = "Zend-2.0" - Zimbra13 LicenseID = "Zimbra-1.3" - Zimbra14 LicenseID = "Zimbra-1.4" - Zlib LicenseID = "Zlib" - ZlibAcknowledgement LicenseID = "zlib-acknowledgement" -) - -// The time zone where the system is located. -type Timezone string - -const ( - AfricaAbidjan Timezone = "Africa/Abidjan" - AfricaAccra Timezone = "Africa/Accra" - AfricaAddisAbaba Timezone = "Africa/Addis_Ababa" - AfricaAlgiers Timezone = "Africa/Algiers" - AfricaAsmara Timezone = "Africa/Asmara" - AfricaAsmera Timezone = "Africa/Asmera" - AfricaBamako Timezone = "Africa/Bamako" - AfricaBangui Timezone = "Africa/Bangui" - AfricaBanjul Timezone = "Africa/Banjul" - AfricaBissau Timezone = "Africa/Bissau" - AfricaBlantyre Timezone = "Africa/Blantyre" - AfricaBrazzaville Timezone = "Africa/Brazzaville" - AfricaBujumbura Timezone = "Africa/Bujumbura" - AfricaCairo Timezone = "Africa/Cairo" - AfricaCasablanca Timezone = "Africa/Casablanca" - AfricaCeuta Timezone = "Africa/Ceuta" - AfricaConakry Timezone = "Africa/Conakry" - AfricaDakar Timezone = "Africa/Dakar" - AfricaDarEsSalaam Timezone = "Africa/Dar_es_Salaam" - AfricaDjibouti Timezone = "Africa/Djibouti" - AfricaDouala Timezone = "Africa/Douala" - AfricaElAaiun Timezone = "Africa/El_Aaiun" - AfricaFreetown Timezone = "Africa/Freetown" - AfricaGaborone Timezone = "Africa/Gaborone" - AfricaHarare Timezone = "Africa/Harare" - AfricaJohannesburg Timezone = "Africa/Johannesburg" - AfricaJuba Timezone = "Africa/Juba" - AfricaKampala Timezone = "Africa/Kampala" - AfricaKhartoum Timezone = "Africa/Khartoum" - AfricaKigali Timezone = "Africa/Kigali" - AfricaKinshasa Timezone = "Africa/Kinshasa" - AfricaLagos Timezone = "Africa/Lagos" - AfricaLibreville Timezone = "Africa/Libreville" - AfricaLome Timezone = "Africa/Lome" - AfricaLuanda Timezone = "Africa/Luanda" - AfricaLubumbashi Timezone = "Africa/Lubumbashi" - AfricaLusaka Timezone = "Africa/Lusaka" - AfricaMalabo Timezone = "Africa/Malabo" - AfricaMaputo Timezone = "Africa/Maputo" - AfricaMaseru Timezone = "Africa/Maseru" - AfricaMbabane Timezone = "Africa/Mbabane" - AfricaMogadishu Timezone = "Africa/Mogadishu" - AfricaMonrovia Timezone = "Africa/Monrovia" - AfricaNairobi Timezone = "Africa/Nairobi" - AfricaNdjamena Timezone = "Africa/Ndjamena" - AfricaNiamey Timezone = "Africa/Niamey" - AfricaNouakchott Timezone = "Africa/Nouakchott" - AfricaOuagadougou Timezone = "Africa/Ouagadougou" - AfricaPortoNovo Timezone = "Africa/Porto-Novo" - AfricaSaoTome Timezone = "Africa/Sao_Tome" - AfricaTimbuktu Timezone = "Africa/Timbuktu" - AfricaTripoli Timezone = "Africa/Tripoli" - AfricaTunis Timezone = "Africa/Tunis" - AfricaWindhoek Timezone = "Africa/Windhoek" - AmericaAdak Timezone = "America/Adak" - AmericaAnchorage Timezone = "America/Anchorage" - AmericaAnguilla Timezone = "America/Anguilla" - AmericaAntigua Timezone = "America/Antigua" - AmericaAraguaina Timezone = "America/Araguaina" - AmericaArgentinaBuenosAires Timezone = "America/Argentina/Buenos_Aires" - AmericaArgentinaCatamarca Timezone = "America/Argentina/Catamarca" - AmericaArgentinaComodRivadavia Timezone = "America/Argentina/ComodRivadavia" - AmericaArgentinaCordoba Timezone = "America/Argentina/Cordoba" - AmericaArgentinaJujuy Timezone = "America/Argentina/Jujuy" - AmericaArgentinaLaRioja Timezone = "America/Argentina/La_Rioja" - AmericaArgentinaMendoza Timezone = "America/Argentina/Mendoza" - AmericaArgentinaRioGallegos Timezone = "America/Argentina/Rio_Gallegos" - AmericaArgentinaSANJuan Timezone = "America/Argentina/San_Juan" - AmericaArgentinaSANLuis Timezone = "America/Argentina/San_Luis" - AmericaArgentinaSalta Timezone = "America/Argentina/Salta" - AmericaArgentinaTucuman Timezone = "America/Argentina/Tucuman" - AmericaArgentinaUshuaia Timezone = "America/Argentina/Ushuaia" - AmericaAruba Timezone = "America/Aruba" - AmericaAsuncion Timezone = "America/Asuncion" - AmericaAtikokan Timezone = "America/Atikokan" - AmericaAtka Timezone = "America/Atka" - AmericaBahia Timezone = "America/Bahia" - AmericaBahiaBanderas Timezone = "America/Bahia_Banderas" - AmericaBarbados Timezone = "America/Barbados" - AmericaBelem Timezone = "America/Belem" - AmericaBelize Timezone = "America/Belize" - AmericaBlancSablon Timezone = "America/Blanc-Sablon" - AmericaBoaVista Timezone = "America/Boa_Vista" - AmericaBogota Timezone = "America/Bogota" - AmericaBoise Timezone = "America/Boise" - AmericaBuenosAires Timezone = "America/Buenos_Aires" - AmericaCambridgeBay Timezone = "America/Cambridge_Bay" - AmericaCampoGrande Timezone = "America/Campo_Grande" - AmericaCancun Timezone = "America/Cancun" - AmericaCaracas Timezone = "America/Caracas" - AmericaCatamarca Timezone = "America/Catamarca" - AmericaCayenne Timezone = "America/Cayenne" - AmericaCayman Timezone = "America/Cayman" - AmericaChicago Timezone = "America/Chicago" - AmericaChihuahua Timezone = "America/Chihuahua" - AmericaCiudadJuarez Timezone = "America/Ciudad_Juarez" - AmericaCoralHarbour Timezone = "America/Coral_Harbour" - AmericaCordoba Timezone = "America/Cordoba" - AmericaCostaRica Timezone = "America/Costa_Rica" - AmericaCreston Timezone = "America/Creston" - AmericaCuiaba Timezone = "America/Cuiaba" - AmericaCuracao Timezone = "America/Curacao" - AmericaDanmarkshavn Timezone = "America/Danmarkshavn" - AmericaDawson Timezone = "America/Dawson" - AmericaDawsonCreek Timezone = "America/Dawson_Creek" - AmericaDenver Timezone = "America/Denver" - AmericaDetroit Timezone = "America/Detroit" - AmericaDominica Timezone = "America/Dominica" - AmericaEdmonton Timezone = "America/Edmonton" - AmericaEirunepe Timezone = "America/Eirunepe" - AmericaElSalvador Timezone = "America/El_Salvador" - AmericaEnsenada Timezone = "America/Ensenada" - AmericaFortNelson Timezone = "America/Fort_Nelson" - AmericaFortWayne Timezone = "America/Fort_Wayne" - AmericaFortaleza Timezone = "America/Fortaleza" - AmericaGlaceBay Timezone = "America/Glace_Bay" - AmericaGodthab Timezone = "America/Godthab" - AmericaGooseBay Timezone = "America/Goose_Bay" - AmericaGrandTurk Timezone = "America/Grand_Turk" - AmericaGrenada Timezone = "America/Grenada" - AmericaGuadeloupe Timezone = "America/Guadeloupe" - AmericaGuatemala Timezone = "America/Guatemala" - AmericaGuayaquil Timezone = "America/Guayaquil" - AmericaGuyana Timezone = "America/Guyana" - AmericaHalifax Timezone = "America/Halifax" - AmericaHavana Timezone = "America/Havana" - AmericaHermosillo Timezone = "America/Hermosillo" - AmericaIndianaIndianapolis Timezone = "America/Indiana/Indianapolis" - AmericaIndianaKnox Timezone = "America/Indiana/Knox" - AmericaIndianaMarengo Timezone = "America/Indiana/Marengo" - AmericaIndianaPetersburg Timezone = "America/Indiana/Petersburg" - AmericaIndianaTellCity Timezone = "America/Indiana/Tell_City" - AmericaIndianaVevay Timezone = "America/Indiana/Vevay" - AmericaIndianaVincennes Timezone = "America/Indiana/Vincennes" - AmericaIndianaWinamac Timezone = "America/Indiana/Winamac" - AmericaIndianapolis Timezone = "America/Indianapolis" - AmericaInuvik Timezone = "America/Inuvik" - AmericaIqaluit Timezone = "America/Iqaluit" - AmericaJamaica Timezone = "America/Jamaica" - AmericaJujuy Timezone = "America/Jujuy" - AmericaJuneau Timezone = "America/Juneau" - AmericaKentuckyLouisville Timezone = "America/Kentucky/Louisville" - AmericaKentuckyMonticello Timezone = "America/Kentucky/Monticello" - AmericaKnoxIN Timezone = "America/Knox_IN" - AmericaKralendijk Timezone = "America/Kralendijk" - AmericaLaPaz Timezone = "America/La_Paz" - AmericaLima Timezone = "America/Lima" - AmericaLosAngeles Timezone = "America/Los_Angeles" - AmericaLouisville Timezone = "America/Louisville" - AmericaLowerPrinces Timezone = "America/Lower_Princes" - AmericaMaceio Timezone = "America/Maceio" - AmericaManagua Timezone = "America/Managua" - AmericaManaus Timezone = "America/Manaus" - AmericaMarigot Timezone = "America/Marigot" - AmericaMartinique Timezone = "America/Martinique" - AmericaMatamoros Timezone = "America/Matamoros" - AmericaMazatlan Timezone = "America/Mazatlan" - AmericaMendoza Timezone = "America/Mendoza" - AmericaMenominee Timezone = "America/Menominee" - AmericaMerida Timezone = "America/Merida" - AmericaMetlakatla Timezone = "America/Metlakatla" - AmericaMexicoCity Timezone = "America/Mexico_City" - AmericaMiquelon Timezone = "America/Miquelon" - AmericaMoncton Timezone = "America/Moncton" - AmericaMonterrey Timezone = "America/Monterrey" - AmericaMontevideo Timezone = "America/Montevideo" - AmericaMontreal Timezone = "America/Montreal" - AmericaMontserrat Timezone = "America/Montserrat" - AmericaNassau Timezone = "America/Nassau" - AmericaNewYork Timezone = "America/New_York" - AmericaNipigon Timezone = "America/Nipigon" - AmericaNome Timezone = "America/Nome" - AmericaNoronha Timezone = "America/Noronha" - AmericaNorthDakotaBeulah Timezone = "America/North_Dakota/Beulah" - AmericaNorthDakotaCenter Timezone = "America/North_Dakota/Center" - AmericaNorthDakotaNewSalem Timezone = "America/North_Dakota/New_Salem" - AmericaNuuk Timezone = "America/Nuuk" - AmericaOjinaga Timezone = "America/Ojinaga" - AmericaPanama Timezone = "America/Panama" - AmericaPangnirtung Timezone = "America/Pangnirtung" - AmericaParamaribo Timezone = "America/Paramaribo" - AmericaPhoenix Timezone = "America/Phoenix" - AmericaPortAuPrince Timezone = "America/Port-au-Prince" - AmericaPortOfSpain Timezone = "America/Port_of_Spain" - AmericaPortoAcre Timezone = "America/Porto_Acre" - AmericaPortoVelho Timezone = "America/Porto_Velho" - AmericaPuertoRico Timezone = "America/Puerto_Rico" - AmericaPuntaArenas Timezone = "America/Punta_Arenas" - AmericaRainyRiver Timezone = "America/Rainy_River" - AmericaRankinInlet Timezone = "America/Rankin_Inlet" - AmericaRecife Timezone = "America/Recife" - AmericaRegina Timezone = "America/Regina" - AmericaResolute Timezone = "America/Resolute" - AmericaRioBranco Timezone = "America/Rio_Branco" - AmericaRosario Timezone = "America/Rosario" - AmericaSantaIsabel Timezone = "America/Santa_Isabel" - AmericaSantarem Timezone = "America/Santarem" - AmericaSantiago Timezone = "America/Santiago" - AmericaSantoDomingo Timezone = "America/Santo_Domingo" - AmericaSaoPaulo Timezone = "America/Sao_Paulo" - AmericaScoresbysund Timezone = "America/Scoresbysund" - AmericaShiprock Timezone = "America/Shiprock" - AmericaSitka Timezone = "America/Sitka" - AmericaStBarthelemy Timezone = "America/St_Barthelemy" - AmericaStJohns Timezone = "America/St_Johns" - AmericaStKitts Timezone = "America/St_Kitts" - AmericaStLucia Timezone = "America/St_Lucia" - AmericaStThomas Timezone = "America/St_Thomas" - AmericaStVincent Timezone = "America/St_Vincent" - AmericaSwiftCurrent Timezone = "America/Swift_Current" - AmericaTegucigalpa Timezone = "America/Tegucigalpa" - AmericaThule Timezone = "America/Thule" - AmericaThunderBay Timezone = "America/Thunder_Bay" - AmericaTijuana Timezone = "America/Tijuana" - AmericaToronto Timezone = "America/Toronto" - AmericaTortola Timezone = "America/Tortola" - AmericaVancouver Timezone = "America/Vancouver" - AmericaVirgin Timezone = "America/Virgin" - AmericaWhitehorse Timezone = "America/Whitehorse" - AmericaWinnipeg Timezone = "America/Winnipeg" - AmericaYakutat Timezone = "America/Yakutat" - AmericaYellowknife Timezone = "America/Yellowknife" - AntarcticaCasey Timezone = "Antarctica/Casey" - AntarcticaDavis Timezone = "Antarctica/Davis" - AntarcticaDumontDUrville Timezone = "Antarctica/DumontDUrville" - AntarcticaMacquarie Timezone = "Antarctica/Macquarie" - AntarcticaMawson Timezone = "Antarctica/Mawson" - AntarcticaMcMurdo Timezone = "Antarctica/McMurdo" - AntarcticaPalmer Timezone = "Antarctica/Palmer" - AntarcticaRothera Timezone = "Antarctica/Rothera" - AntarcticaSouthPole Timezone = "Antarctica/South_Pole" - AntarcticaSyowa Timezone = "Antarctica/Syowa" - AntarcticaTroll Timezone = "Antarctica/Troll" - AntarcticaVostok Timezone = "Antarctica/Vostok" - ArcticLongyearbyen Timezone = "Arctic/Longyearbyen" - AsiaAden Timezone = "Asia/Aden" - AsiaAlmaty Timezone = "Asia/Almaty" - AsiaAmman Timezone = "Asia/Amman" - AsiaAnadyr Timezone = "Asia/Anadyr" - AsiaAqtau Timezone = "Asia/Aqtau" - AsiaAqtobe Timezone = "Asia/Aqtobe" - AsiaAshgabat Timezone = "Asia/Ashgabat" - AsiaAshkhabad Timezone = "Asia/Ashkhabad" - AsiaAtyrau Timezone = "Asia/Atyrau" - AsiaBaghdad Timezone = "Asia/Baghdad" - AsiaBahrain Timezone = "Asia/Bahrain" - AsiaBaku Timezone = "Asia/Baku" - AsiaBangkok Timezone = "Asia/Bangkok" - AsiaBarnaul Timezone = "Asia/Barnaul" - AsiaBeirut Timezone = "Asia/Beirut" - AsiaBishkek Timezone = "Asia/Bishkek" - AsiaBrunei Timezone = "Asia/Brunei" - AsiaCalcutta Timezone = "Asia/Calcutta" - AsiaChita Timezone = "Asia/Chita" - AsiaChoibalsan Timezone = "Asia/Choibalsan" - AsiaChongqing Timezone = "Asia/Chongqing" - AsiaChungking Timezone = "Asia/Chungking" - AsiaColombo Timezone = "Asia/Colombo" - AsiaDacca Timezone = "Asia/Dacca" - AsiaDamascus Timezone = "Asia/Damascus" - AsiaDhaka Timezone = "Asia/Dhaka" - AsiaDili Timezone = "Asia/Dili" - AsiaDubai Timezone = "Asia/Dubai" - AsiaDushanbe Timezone = "Asia/Dushanbe" - AsiaFamagusta Timezone = "Asia/Famagusta" - AsiaGaza Timezone = "Asia/Gaza" - AsiaHarbin Timezone = "Asia/Harbin" - AsiaHebron Timezone = "Asia/Hebron" - AsiaHoChiMinh Timezone = "Asia/Ho_Chi_Minh" - AsiaHongKong Timezone = "Asia/Hong_Kong" - AsiaHovd Timezone = "Asia/Hovd" - AsiaIrkutsk Timezone = "Asia/Irkutsk" - AsiaIstanbul Timezone = "Asia/Istanbul" - AsiaJakarta Timezone = "Asia/Jakarta" - AsiaJayapura Timezone = "Asia/Jayapura" - AsiaJerusalem Timezone = "Asia/Jerusalem" - AsiaKabul Timezone = "Asia/Kabul" - AsiaKamchatka Timezone = "Asia/Kamchatka" - AsiaKarachi Timezone = "Asia/Karachi" - AsiaKashgar Timezone = "Asia/Kashgar" - AsiaKathmandu Timezone = "Asia/Kathmandu" - AsiaKatmandu Timezone = "Asia/Katmandu" - AsiaKhandyga Timezone = "Asia/Khandyga" - AsiaKolkata Timezone = "Asia/Kolkata" - AsiaKrasnoyarsk Timezone = "Asia/Krasnoyarsk" - AsiaKualaLumpur Timezone = "Asia/Kuala_Lumpur" - AsiaKuching Timezone = "Asia/Kuching" - AsiaKuwait Timezone = "Asia/Kuwait" - AsiaMacao Timezone = "Asia/Macao" - AsiaMacau Timezone = "Asia/Macau" - AsiaMagadan Timezone = "Asia/Magadan" - AsiaMakassar Timezone = "Asia/Makassar" - AsiaManila Timezone = "Asia/Manila" - AsiaMuscat Timezone = "Asia/Muscat" - AsiaNicosia Timezone = "Asia/Nicosia" - AsiaNovokuznetsk Timezone = "Asia/Novokuznetsk" - AsiaNovosibirsk Timezone = "Asia/Novosibirsk" - AsiaOmsk Timezone = "Asia/Omsk" - AsiaOral Timezone = "Asia/Oral" - AsiaPhnomPenh Timezone = "Asia/Phnom_Penh" - AsiaPontianak Timezone = "Asia/Pontianak" - AsiaPyongyang Timezone = "Asia/Pyongyang" - AsiaQatar Timezone = "Asia/Qatar" - AsiaQostanay Timezone = "Asia/Qostanay" - AsiaQyzylorda Timezone = "Asia/Qyzylorda" - AsiaRangoon Timezone = "Asia/Rangoon" - AsiaRiyadh Timezone = "Asia/Riyadh" - AsiaSaigon Timezone = "Asia/Saigon" - AsiaSakhalin Timezone = "Asia/Sakhalin" - AsiaSamarkand Timezone = "Asia/Samarkand" - AsiaSeoul Timezone = "Asia/Seoul" - AsiaShanghai Timezone = "Asia/Shanghai" - AsiaSingapore Timezone = "Asia/Singapore" - AsiaSrednekolymsk Timezone = "Asia/Srednekolymsk" - AsiaTaipei Timezone = "Asia/Taipei" - AsiaTashkent Timezone = "Asia/Tashkent" - AsiaTbilisi Timezone = "Asia/Tbilisi" - AsiaTehran Timezone = "Asia/Tehran" - AsiaTelAviv Timezone = "Asia/Tel_Aviv" - AsiaThimbu Timezone = "Asia/Thimbu" - AsiaThimphu Timezone = "Asia/Thimphu" - AsiaTokyo Timezone = "Asia/Tokyo" - AsiaTomsk Timezone = "Asia/Tomsk" - AsiaUjungPandang Timezone = "Asia/Ujung_Pandang" - AsiaUlaanbaatar Timezone = "Asia/Ulaanbaatar" - AsiaUlanBator Timezone = "Asia/Ulan_Bator" - AsiaUrumqi Timezone = "Asia/Urumqi" - AsiaUstNera Timezone = "Asia/Ust-Nera" - AsiaVientiane Timezone = "Asia/Vientiane" - AsiaVladivostok Timezone = "Asia/Vladivostok" - AsiaYakutsk Timezone = "Asia/Yakutsk" - AsiaYangon Timezone = "Asia/Yangon" - AsiaYekaterinburg Timezone = "Asia/Yekaterinburg" - AsiaYerevan Timezone = "Asia/Yerevan" - AtlanticAzores Timezone = "Atlantic/Azores" - AtlanticBermuda Timezone = "Atlantic/Bermuda" - AtlanticCanary Timezone = "Atlantic/Canary" - AtlanticCapeVerde Timezone = "Atlantic/Cape_Verde" - AtlanticFaeroe Timezone = "Atlantic/Faeroe" - AtlanticFaroe Timezone = "Atlantic/Faroe" - AtlanticJanMayen Timezone = "Atlantic/Jan_Mayen" - AtlanticMadeira Timezone = "Atlantic/Madeira" - AtlanticReykjavik Timezone = "Atlantic/Reykjavik" - AtlanticSouthGeorgia Timezone = "Atlantic/South_Georgia" - AtlanticStHelena Timezone = "Atlantic/St_Helena" - AtlanticStanley Timezone = "Atlantic/Stanley" - AustraliaACT Timezone = "Australia/ACT" - AustraliaAdelaide Timezone = "Australia/Adelaide" - AustraliaBrisbane Timezone = "Australia/Brisbane" - AustraliaBrokenHill Timezone = "Australia/Broken_Hill" - AustraliaCanberra Timezone = "Australia/Canberra" - AustraliaCurrie Timezone = "Australia/Currie" - AustraliaDarwin Timezone = "Australia/Darwin" - AustraliaEucla Timezone = "Australia/Eucla" - AustraliaHobart Timezone = "Australia/Hobart" - AustraliaLHI Timezone = "Australia/LHI" - AustraliaLindeman Timezone = "Australia/Lindeman" - AustraliaLordHowe Timezone = "Australia/Lord_Howe" - AustraliaMelbourne Timezone = "Australia/Melbourne" - AustraliaNSW Timezone = "Australia/NSW" - AustraliaNorth Timezone = "Australia/North" - AustraliaPerth Timezone = "Australia/Perth" - AustraliaQueensland Timezone = "Australia/Queensland" - AustraliaSouth Timezone = "Australia/South" - AustraliaSydney Timezone = "Australia/Sydney" - AustraliaTasmania Timezone = "Australia/Tasmania" - AustraliaVictoria Timezone = "Australia/Victoria" - AustraliaWest Timezone = "Australia/West" - AustraliaYancowinna Timezone = "Australia/Yancowinna" - BrazilAcre Timezone = "Brazil/Acre" - BrazilDeNoronha Timezone = "Brazil/DeNoronha" - BrazilEast Timezone = "Brazil/East" - BrazilWest Timezone = "Brazil/West" - CanadaAtlantic Timezone = "Canada/Atlantic" - CanadaCentral Timezone = "Canada/Central" - CanadaEastern Timezone = "Canada/Eastern" - CanadaMountain Timezone = "Canada/Mountain" - CanadaNewfoundland Timezone = "Canada/Newfoundland" - CanadaPacific Timezone = "Canada/Pacific" - CanadaSaskatchewan Timezone = "Canada/Saskatchewan" - CanadaYukon Timezone = "Canada/Yukon" - Cet Timezone = "CET" - ChileContinental Timezone = "Chile/Continental" - ChileEasterIsland Timezone = "Chile/EasterIsland" - Cst6Cdt Timezone = "CST6CDT" - Cuba Timezone = "Cuba" - Eet Timezone = "EET" - Egypt Timezone = "Egypt" - Eire Timezone = "Eire" - Est Timezone = "EST" - Est5Edt Timezone = "EST5EDT" - EtcGMT Timezone = "Etc/GMT" - EtcGMT0 Timezone = "Etc/GMT+0" - EtcGMT1 Timezone = "Etc/GMT+1" - EtcGMT10 Timezone = "Etc/GMT+10" - EtcGMT11 Timezone = "Etc/GMT+11" - EtcGMT12 Timezone = "Etc/GMT+12" - EtcGMT13 Timezone = "Etc/GMT-13" - EtcGMT14 Timezone = "Etc/GMT-14" - EtcGMT2 Timezone = "Etc/GMT+2" - EtcGMT3 Timezone = "Etc/GMT+3" - EtcGMT4 Timezone = "Etc/GMT+4" - EtcGMT5 Timezone = "Etc/GMT+5" - EtcGMT6 Timezone = "Etc/GMT+6" - EtcGMT7 Timezone = "Etc/GMT+7" - EtcGMT8 Timezone = "Etc/GMT+8" - EtcGMT9 Timezone = "Etc/GMT+9" - EtcGreenwich Timezone = "Etc/Greenwich" - EtcUCT Timezone = "Etc/UCT" - EtcUTC Timezone = "Etc/UTC" - EtcUniversal Timezone = "Etc/Universal" - EtcZulu Timezone = "Etc/Zulu" - EuropeAmsterdam Timezone = "Europe/Amsterdam" - EuropeAndorra Timezone = "Europe/Andorra" - EuropeAstrakhan Timezone = "Europe/Astrakhan" - EuropeAthens Timezone = "Europe/Athens" - EuropeBelfast Timezone = "Europe/Belfast" - EuropeBelgrade Timezone = "Europe/Belgrade" - EuropeBerlin Timezone = "Europe/Berlin" - EuropeBratislava Timezone = "Europe/Bratislava" - EuropeBrussels Timezone = "Europe/Brussels" - EuropeBucharest Timezone = "Europe/Bucharest" - EuropeBudapest Timezone = "Europe/Budapest" - EuropeBusingen Timezone = "Europe/Busingen" - EuropeChisinau Timezone = "Europe/Chisinau" - EuropeCopenhagen Timezone = "Europe/Copenhagen" - EuropeDublin Timezone = "Europe/Dublin" - EuropeGibraltar Timezone = "Europe/Gibraltar" - EuropeGuernsey Timezone = "Europe/Guernsey" - EuropeHelsinki Timezone = "Europe/Helsinki" - EuropeIsleOfMan Timezone = "Europe/Isle_of_Man" - EuropeIstanbul Timezone = "Europe/Istanbul" - EuropeJersey Timezone = "Europe/Jersey" - EuropeKaliningrad Timezone = "Europe/Kaliningrad" - EuropeKiev Timezone = "Europe/Kiev" - EuropeKirov Timezone = "Europe/Kirov" - EuropeKyiv Timezone = "Europe/Kyiv" - EuropeLisbon Timezone = "Europe/Lisbon" - EuropeLjubljana Timezone = "Europe/Ljubljana" - EuropeLondon Timezone = "Europe/London" - EuropeLuxembourg Timezone = "Europe/Luxembourg" - EuropeMadrid Timezone = "Europe/Madrid" - EuropeMalta Timezone = "Europe/Malta" - EuropeMariehamn Timezone = "Europe/Mariehamn" - EuropeMinsk Timezone = "Europe/Minsk" - EuropeMonaco Timezone = "Europe/Monaco" - EuropeMoscow Timezone = "Europe/Moscow" - EuropeNicosia Timezone = "Europe/Nicosia" - EuropeOslo Timezone = "Europe/Oslo" - EuropeParis Timezone = "Europe/Paris" - EuropePodgorica Timezone = "Europe/Podgorica" - EuropePrague Timezone = "Europe/Prague" - EuropeRiga Timezone = "Europe/Riga" - EuropeRome Timezone = "Europe/Rome" - EuropeSANMarino Timezone = "Europe/San_Marino" - EuropeSamara Timezone = "Europe/Samara" - EuropeSarajevo Timezone = "Europe/Sarajevo" - EuropeSaratov Timezone = "Europe/Saratov" - EuropeSimferopol Timezone = "Europe/Simferopol" - EuropeSkopje Timezone = "Europe/Skopje" - EuropeSofia Timezone = "Europe/Sofia" - EuropeStockholm Timezone = "Europe/Stockholm" - EuropeTallinn Timezone = "Europe/Tallinn" - EuropeTirane Timezone = "Europe/Tirane" - EuropeTiraspol Timezone = "Europe/Tiraspol" - EuropeUlyanovsk Timezone = "Europe/Ulyanovsk" - EuropeUzhgorod Timezone = "Europe/Uzhgorod" - EuropeVaduz Timezone = "Europe/Vaduz" - EuropeVatican Timezone = "Europe/Vatican" - EuropeVienna Timezone = "Europe/Vienna" - EuropeVilnius Timezone = "Europe/Vilnius" - EuropeVolgograd Timezone = "Europe/Volgograd" - EuropeWarsaw Timezone = "Europe/Warsaw" - EuropeZagreb Timezone = "Europe/Zagreb" - EuropeZaporozhye Timezone = "Europe/Zaporozhye" - EuropeZurich Timezone = "Europe/Zurich" - Factory Timezone = "Factory" - GB Timezone = "GB" - GBEire Timezone = "GB-Eire" - Gmt Timezone = "GMT" - Gmt0 Timezone = "GMT+0" - Greenwich Timezone = "Greenwich" - Hongkong Timezone = "Hongkong" - Hst Timezone = "HST" - Iceland Timezone = "Iceland" - IndianAntananarivo Timezone = "Indian/Antananarivo" - IndianChagos Timezone = "Indian/Chagos" - IndianChristmas Timezone = "Indian/Christmas" - IndianCocos Timezone = "Indian/Cocos" - IndianComoro Timezone = "Indian/Comoro" - IndianKerguelen Timezone = "Indian/Kerguelen" - IndianMahe Timezone = "Indian/Mahe" - IndianMaldives Timezone = "Indian/Maldives" - IndianMauritius Timezone = "Indian/Mauritius" - IndianMayotte Timezone = "Indian/Mayotte" - IndianReunion Timezone = "Indian/Reunion" - Iran Timezone = "Iran" - Israel Timezone = "Israel" - Jamaica Timezone = "Jamaica" - Japan Timezone = "Japan" - Kwajalein Timezone = "Kwajalein" - Libya Timezone = "Libya" - Met Timezone = "MET" - MexicoBajaNorte Timezone = "Mexico/BajaNorte" - MexicoBajaSur Timezone = "Mexico/BajaSur" - MexicoGeneral Timezone = "Mexico/General" - Mst Timezone = "MST" - Mst7Mdt Timezone = "MST7MDT" - Navajo Timezone = "Navajo" - Nz Timezone = "NZ" - NzChat Timezone = "NZ-CHAT" - PacificApia Timezone = "Pacific/Apia" - PacificAuckland Timezone = "Pacific/Auckland" - PacificBougainville Timezone = "Pacific/Bougainville" - PacificChatham Timezone = "Pacific/Chatham" - PacificChuuk Timezone = "Pacific/Chuuk" - PacificEaster Timezone = "Pacific/Easter" - PacificEfate Timezone = "Pacific/Efate" - PacificEnderbury Timezone = "Pacific/Enderbury" - PacificFakaofo Timezone = "Pacific/Fakaofo" - PacificFiji Timezone = "Pacific/Fiji" - PacificFunafuti Timezone = "Pacific/Funafuti" - PacificGalapagos Timezone = "Pacific/Galapagos" - PacificGambier Timezone = "Pacific/Gambier" - PacificGuadalcanal Timezone = "Pacific/Guadalcanal" - PacificGuam Timezone = "Pacific/Guam" - PacificHonolulu Timezone = "Pacific/Honolulu" - PacificJohnston Timezone = "Pacific/Johnston" - PacificKanton Timezone = "Pacific/Kanton" - PacificKiritimati Timezone = "Pacific/Kiritimati" - PacificKosrae Timezone = "Pacific/Kosrae" - PacificKwajalein Timezone = "Pacific/Kwajalein" - PacificMajuro Timezone = "Pacific/Majuro" - PacificMarquesas Timezone = "Pacific/Marquesas" - PacificMidway Timezone = "Pacific/Midway" - PacificNauru Timezone = "Pacific/Nauru" - PacificNiue Timezone = "Pacific/Niue" - PacificNorfolk Timezone = "Pacific/Norfolk" - PacificNoumea Timezone = "Pacific/Noumea" - PacificPagoPago Timezone = "Pacific/Pago_Pago" - PacificPalau Timezone = "Pacific/Palau" - PacificPitcairn Timezone = "Pacific/Pitcairn" - PacificPohnpei Timezone = "Pacific/Pohnpei" - PacificPonape Timezone = "Pacific/Ponape" - PacificPortMoresby Timezone = "Pacific/Port_Moresby" - PacificRarotonga Timezone = "Pacific/Rarotonga" - PacificSaipan Timezone = "Pacific/Saipan" - PacificSamoa Timezone = "Pacific/Samoa" - PacificTahiti Timezone = "Pacific/Tahiti" - PacificTarawa Timezone = "Pacific/Tarawa" - PacificTongatapu Timezone = "Pacific/Tongatapu" - PacificTruk Timezone = "Pacific/Truk" - PacificWake Timezone = "Pacific/Wake" - PacificWallis Timezone = "Pacific/Wallis" - PacificYap Timezone = "Pacific/Yap" - Poland Timezone = "Poland" - Portugal Timezone = "Portugal" - Prc Timezone = "PRC" - Pst8Pdt Timezone = "PST8PDT" - PurpleEtcGMT0 Timezone = "Etc/GMT0" - PurpleGMT0 Timezone = "GMT0" - Roc Timezone = "ROC" - Rok Timezone = "ROK" - Singapore Timezone = "Singapore" - TimezoneEtcGMT0 Timezone = "Etc/GMT-0" - TimezoneEtcGMT1 Timezone = "Etc/GMT-1" - TimezoneEtcGMT10 Timezone = "Etc/GMT-10" - TimezoneEtcGMT11 Timezone = "Etc/GMT-11" - TimezoneEtcGMT12 Timezone = "Etc/GMT-12" - TimezoneEtcGMT2 Timezone = "Etc/GMT-2" - TimezoneEtcGMT3 Timezone = "Etc/GMT-3" - TimezoneEtcGMT4 Timezone = "Etc/GMT-4" - TimezoneEtcGMT5 Timezone = "Etc/GMT-5" - TimezoneEtcGMT6 Timezone = "Etc/GMT-6" - TimezoneEtcGMT7 Timezone = "Etc/GMT-7" - TimezoneEtcGMT8 Timezone = "Etc/GMT-8" - TimezoneEtcGMT9 Timezone = "Etc/GMT-9" - TimezoneGMT0 Timezone = "GMT-0" - Turkey Timezone = "Turkey" - USAlaska Timezone = "US/Alaska" - USAleutian Timezone = "US/Aleutian" - USArizona Timezone = "US/Arizona" - USCentral Timezone = "US/Central" - USEastIndiana Timezone = "US/East-Indiana" - USEastern Timezone = "US/Eastern" - USHawaii Timezone = "US/Hawaii" - USIndianaStarke Timezone = "US/Indiana-Starke" - USMichigan Timezone = "US/Michigan" - USMountain Timezone = "US/Mountain" - USPacific Timezone = "US/Pacific" - USSamoa Timezone = "US/Samoa" - UTC Timezone = "UTC" - Uct Timezone = "UCT" - Universal Timezone = "Universal" - WSu Timezone = "W-SU" - Wet Timezone = "WET" - Zulu Timezone = "Zulu" -) - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.0/system_pricing_plans/system_pricing_plans.go b/models/golang/v3.0/system_pricing_plans/system_pricing_plans.go index 30db2f68..02a8776f 100644 --- a/models/golang/v3.0/system_pricing_plans/system_pricing_plans.go +++ b/models/golang/v3.0/system_pricing_plans/system_pricing_plans.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,40 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// systemPricingPlans, err := UnmarshalSystemPricingPlans(bytes) -// bytes, err = systemPricingPlans.Marshal() - package system_pricing_plans - - -import "encoding/json" - -func UnmarshalSystemPricingPlans(data []byte) (SystemPricingPlans, error) { - var r SystemPricingPlans - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *SystemPricingPlans) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // Describes the pricing schemes of the system. type SystemPricingPlans struct { - // Array that contains one object per plan as defined below. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + header.HeaderStruct + // Array that contains one object per plan as defined below. + Data Data `json:"data"` } // Array that contains one object per plan as defined below. @@ -54,74 +32,27 @@ type Data struct { } type Plan struct { - // Currency used to pay the fare in ISO 4217 code. - Currency string `json:"currency"` - // Customer-readable description of the pricing plan. - Description []Description `json:"description"` - // Will additional tax be added to the base price? - IsTaxable bool `json:"is_taxable"` - // Name of this pricing plan. - Name []Name `json:"name"` - // Array of segments when the price is a function of distance travelled, displayed in - // kilometers (added in v2.1-RC2). - PerKMPricing []PerKMPricing `json:"per_km_pricing,omitempty"` - // Array of segments when the price is a function of time travelled, displayed in minutes - // (added in v2.1-RC2). - PerMinPricing []PerMinPricing `json:"per_min_pricing,omitempty"` - // Identifier of a pricing plan in the system. - PlanID string `json:"plan_id"` - // Fare price. - Price float64 `json:"price"` - // Is there currently an increase in price in response to increased demand in this pricing - // plan? (added in v2.1-RC2) - SurgePricing *bool `json:"surge_pricing,omitempty"` - // URL where the customer can learn more about this pricing plan. - URL *string `json:"url,omitempty"` -} - -type Description struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type PerKMPricing struct { - // The kilometer at which the rate will no longer apply (added in v2.1-RC2). - End *int64 `json:"end,omitempty"` - // Interval in kilometers at which the rate of this segment is either reapplied - // indefinitely, or if defined, up until (but not including) end kilometer (added in - // v2.1-RC2). - Interval int64 `json:"interval"` - // Rate that is charged for each kilometer interval after the start (added in v2.1-RC2). - Rate float64 `json:"rate"` - // Number of kilometers that have to elapse before this segment starts applying (added in - // v2.1-RC2). - Start int64 `json:"start"` + // Currency used to pay the fare in ISO 4217 code. + Currency string `json:"currency"` + // Customer-readable description of the pricing plan. + Description []common.LocalizedString `json:"description"` + // Will additional tax be added to the base price? + IsTaxable bool `json:"is_taxable"` + // Name of this pricing plan. + Name []common.LocalizedString `json:"name"` + // Array of segments when the price is a function of distance travelled, displayed in + // kilometers (added in v2.1-RC2). + PerKMPricing []common.PerKMPricing `json:"per_km_pricing,omitempty"` + // Array of segments when the price is a function of time travelled, displayed in minutes + // (added in v2.1-RC2). + PerMinPricing []common.PerMinPricing `json:"per_min_pricing,omitempty"` + // Identifier of a pricing plan in the system. + PlanID common.ID `json:"plan_id"` + // Fare price. + Price float64 `json:"price"` + // Is there currently an increase in price in response to increased demand in this pricing + // plan? (added in v2.1-RC2) + SurgePricing *bool `json:"surge_pricing,omitempty"` + // URL where the customer can learn more about this pricing plan. + URL *common.URL `json:"url,omitempty"` } - -type PerMinPricing struct { - // The minute at which the rate will no longer apply (added in v2.1-RC2). - End *int64 `json:"end,omitempty"` - // Interval in minutes at which the rate of this segment is either reapplied (added in - // v2.1-RC2). - Interval int64 `json:"interval"` - // Rate that is charged for each minute interval after the start (added in v2.1-RC2). - Rate float64 `json:"rate"` - // Number of minutes that have to elapse before this segment starts applying (added in - // v2.1-RC2). - Start int64 `json:"start"` -} - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.0/system_regions/system_regions.go b/models/golang/v3.0/system_regions/system_regions.go index fb8b49f4..00ef0e42 100644 --- a/models/golang/v3.0/system_regions/system_regions.go +++ b/models/golang/v3.0/system_regions/system_regions.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,64 +12,30 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// systemRegions, err := UnmarshalSystemRegions(bytes) -// bytes, err = systemRegions.Marshal() - package system_regions - - -import "encoding/json" - -func UnmarshalSystemRegions(data []byte) (SystemRegions, error) { - var r SystemRegions - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *SystemRegions) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // Describes regions for a system that is broken up by geographic or political region. type SystemRegions struct { - // Describe regions for a system that is broken up by geographic or political region. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + header.HeaderStruct + + // Describe regions for a system that is broken up by geographic or political region. + Data Data `json:"data"` } // Describe regions for a system that is broken up by geographic or political region. type Data struct { - // Array of regions. - Regions []Region `json:"regions"` + // Array of regions. + Regions []Region `json:"regions"` } type Region struct { - // Public name for this region. - Name []Name `json:"name"` - // identifier of the region. - RegionID string `json:"region_id"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` + // Public name for this region. + Name []common.LocalizedString `json:"name"` + // identifier of the region. + RegionID common.ID `json:"region_id"` } - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.0/vehicle_status/vehicle_status.go b/models/golang/v3.0/vehicle_status/vehicle_status.go index 98102ce3..e6bec13a 100644 --- a/models/golang/v3.0/vehicle_status/vehicle_status.go +++ b/models/golang/v3.0/vehicle_status/vehicle_status.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,41 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// vehicleStatus, err := UnmarshalVehicleStatus(bytes) -// bytes, err = vehicleStatus.Marshal() - package vehicle_status - - -import "encoding/json" - -func UnmarshalVehicleStatus(data []byte) (VehicleStatus, error) { - var r VehicleStatus - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *VehicleStatus) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // Describes the vehicles that are available for rent (as of v3.0, formerly // free_bike_status). type VehicleStatus struct { - // Array that contains one object per vehicle as defined below. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + header.HeaderStruct + // Array that contains one object per vehicle as defined below. + Data Data `json:"data"` } // Array that contains one object per vehicle as defined below. @@ -55,68 +33,40 @@ type Data struct { } type Vehicle struct { - // The date and time when any rental of the vehicle must be completed. Added in v2.3. - AvailableUntil *string `json:"available_until,omitempty"` - // This value represents the current percentage, expressed from 0 to 1, of fuel or battery - // power remaining in the vehicle. Added in v2.3-RC. - CurrentFuelPercent *float64 `json:"current_fuel_percent,omitempty"` - // The furthest distance in meters that the vehicle can travel without recharging or - // refueling with the vehicle's current charge or fuel (added in v2.1-RC). - CurrentRangeMeters *float64 `json:"current_range_meters,omitempty"` - // The station_id of the station this vehicle must be returned to (added in v2.3-RC). - HomeStationID *string `json:"home_station_id,omitempty"` - // Is the vehicle currently disabled (broken)? - IsDisabled bool `json:"is_disabled"` - // Is the vehicle currently reserved? - IsReserved bool `json:"is_reserved"` - // The last time this vehicle reported its status to the operator's backend in RFC3339 - // format (added in v2.1-RC). - LastReported *string `json:"last_reported,omitempty"` - // The latitude of the vehicle. - Lat *float64 `json:"lat,omitempty"` - // The longitude of the vehicle. - Lon *float64 `json:"lon,omitempty"` - // The plan_id of the pricing plan this vehicle is eligible for (added in v2.2). - PricingPlanID *string `json:"pricing_plan_id,omitempty"` - // Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added - // in v1.1). - RentalUris *RentalUris `json:"rental_uris,omitempty"` - // Identifier referencing the station_id if the vehicle is currently at a station (added in - // v2.1-RC2). - StationID *string `json:"station_id,omitempty"` - // List of vehicle equipment provided by the operator in addition to the accessories already - // provided in the vehicle. Added in v2.3. - VehicleEquipment []VehicleEquipment `json:"vehicle_equipment,omitempty"` - // Rotating (as of v2.0) identifier of a vehicle. - VehicleID string `json:"vehicle_id"` - // The vehicle_type_id of this vehicle (added in v2.1-RC). - VehicleTypeID *string `json:"vehicle_type_id,omitempty"` + // The date and time when any rental of the vehicle must be completed. Added in v2.3. + AvailableUntil *common.DateTime `json:"available_until,omitempty"` + // This value represents the current percentage, expressed from 0 to 1, of fuel or battery + // power remaining in the vehicle. Added in v2.3-RC. + CurrentFuelPercent *float64 `json:"current_fuel_percent,omitempty"` + // The furthest distance in meters that the vehicle can travel without recharging or + // refueling with the vehicle's current charge or fuel (added in v2.1-RC). + CurrentRangeMeters *float64 `json:"current_range_meters,omitempty"` + // The station_id of the station this vehicle must be returned to (added in v2.3-RC). + HomeStationID *common.ID `json:"home_station_id,omitempty"` + // Is the vehicle currently disabled (broken)? + IsDisabled bool `json:"is_disabled"` + // Is the vehicle currently reserved? + IsReserved bool `json:"is_reserved"` + // The last time this vehicle reported its status to the operator's backend in RFC3339 + // format (added in v2.1-RC). + LastReported *common.Timestamp `json:"last_reported,omitempty"` + // The latitude of the vehicle. + Lat *common.Latitude `json:"lat,omitempty"` + // The longitude of the vehicle. + Lon *common.Longitude `json:"lon,omitempty"` + // The plan_id of the pricing plan this vehicle is eligible for (added in v2.2). + PricingPlanID *common.ID `json:"pricing_plan_id,omitempty"` + // Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added + // in v1.1). + RentalUris *common.RentalUris `json:"rental_uris,omitempty"` + // Identifier referencing the station_id if the vehicle is currently at a station (added in + // v2.1-RC2). + StationID *common.ID `json:"station_id,omitempty"` + // List of vehicle equipment provided by the operator in addition to the accessories already + // provided in the vehicle. Added in v2.3. + VehicleEquipment []common.VehicleEquipment `json:"vehicle_equipment,omitempty"` + // Rotating (as of v2.0) identifier of a vehicle. + VehicleID common.ID `json:"vehicle_id"` + // The vehicle_type_id of this vehicle (added in v2.1-RC). + VehicleTypeID *common.ID `json:"vehicle_type_id,omitempty"` } - -// Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added -// in v1.1). -type RentalUris struct { - // URI that can be passed to an Android app with an intent (added in v1.1). - Android *string `json:"android,omitempty"` - // URI that can be used on iOS to launch the rental app for this vehicle (added in v1.1). - Ios *string `json:"ios,omitempty"` - // URL that can be used by a web browser to show more information about renting this vehicle - // (added in v1.1). - Web *string `json:"web,omitempty"` -} - -type VehicleEquipment string - -const ( - ChildSeatA VehicleEquipment = "child_seat_a" - ChildSeatB VehicleEquipment = "child_seat_b" - ChildSeatC VehicleEquipment = "child_seat_c" - SnowChains VehicleEquipment = "snow_chains" - WinterTires VehicleEquipment = "winter_tires" -) - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.0/vehicle_types/vehicle_types.go b/models/golang/v3.0/vehicle_types/vehicle_types.go index 839ef48e..b35018a0 100644 --- a/models/golang/v3.0/vehicle_types/vehicle_types.go +++ b/models/golang/v3.0/vehicle_types/vehicle_types.go @@ -1,4 +1,4 @@ -// Copyright 2024 MobilityData +// Copyright 2025 MobilityData // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,213 +12,85 @@ // See the License for the specific language governing permissions and // limitations under the License. -// This file was generated from JSON Schema using quicktype, do not modify it directly. -// To parse and unparse this JSON data, add this code to your project and do: -// -// vehicleTypes, err := UnmarshalVehicleTypes(bytes) -// bytes, err = vehicleTypes.Marshal() - package vehicle_types - - -import "encoding/json" - -func UnmarshalVehicleTypes(data []byte) (VehicleTypes, error) { - var r VehicleTypes - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *VehicleTypes) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) // Describes the types of vehicles that System operator has available for rent (added in // v2.1-RC). type VehicleTypes struct { - // Response data in the form of name:value pairs. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework. - Version Version `json:"version"` + header.HeaderStruct + + // Response data in the form of name:value pairs. + Data Data `json:"data"` } // Response data in the form of name:value pairs. type Data struct { - // Array that contains one object per vehicle type in the system as defined below. - VehicleTypes []VehicleType `json:"vehicle_types"` + // Array that contains one object per vehicle type in the system as defined below. + VehicleTypes []VehicleType `json:"vehicle_types"` } type VehicleType struct { - // The capacity of the vehicle cargo space (excluding passengers), expressed in kilograms. - CargoLoadCapacity *int64 `json:"cargo_load_capacity,omitempty"` - // Cargo volume available in the vehicle, expressed in liters. - CargoVolumeCapacity *int64 `json:"cargo_volume_capacity,omitempty"` - // The color of the vehicle. Added in v2.3 - Color *string `json:"color,omitempty"` - // A plan_id as defined in system_pricing_plans.json added in v2.3-RC. - DefaultPricingPlanID *string `json:"default_pricing_plan_id,omitempty"` - // Maximum time in minutes that a vehicle can be reserved before a rental begins added in - // v2.3-RC. - DefaultReserveTime *int64 `json:"default_reserve_time,omitempty"` - // Customer-readable description of the vehicle type outlining special features or how-tos. - // An array with one object per supported language with the following keys: - Description []Description `json:"description,omitempty"` - // Vehicle air quality certificate. added in v2.3. - EcoLabels []EcoLabel `json:"eco_labels,omitempty"` - // The vehicle's general form factor. - FormFactor FormFactor `json:"form_factor"` - // Maximum quantity of CO2, in grams, emitted per kilometer, according to the WLTP. Added in - // v2.3 - GCO2KM *int64 `json:"g_CO2_km,omitempty"` - // The name of the vehicle manufacturer. An array with one object per supported language - // with the following keys: - Make []Make `json:"make,omitempty"` - // The maximum speed in kilometers per hour this vehicle is permitted to reach in accordance - // with local permit and regulations. Added in v2.3 - MaxPermittedSpeed *int64 `json:"max_permitted_speed,omitempty"` - // The furthest distance in meters that the vehicle can travel without recharging or - // refueling when it has the maximum amount of energy potential. - MaxRangeMeters *float64 `json:"max_range_meters,omitempty"` - // The name of the vehicle model. An array with one object per supported language with the - // following keys: - Model []Model `json:"model,omitempty"` - // The public name of this vehicle type. An array with one object per supported language - // with the following keys: - Name []Name `json:"name,omitempty"` - // Array of all pricing plan IDs as defined in system_pricing_plans.json added in v2.3-RC. - PricingPlanIDS []string `json:"pricing_plan_ids,omitempty"` - // The primary propulsion type of the vehicle. Updated in v2.3 to represent car-sharing - PropulsionType PropulsionType `json:"propulsion_type"` - // The rated power of the motor for this vehicle type in watts. Added in v2.3 - RatedPower *int64 `json:"rated_power,omitempty"` - // The conditions for returning the vehicle at the end of the trip. Added in v2.3-RC as - // return_type, and updated to return_constraint in v2.3. - ReturnConstraint *ReturnConstraint `json:"return_constraint,omitempty"` - // The number of riders (driver included) the vehicle can legally accommodate - RiderCapacity *int64 `json:"rider_capacity,omitempty"` - // Description of accessories available in the vehicle. - VehicleAccessories []VehicleAccessory `json:"vehicle_accessories,omitempty"` - // An object where each key defines one of the items listed below added in v2.3-RC. - VehicleAssets *VehicleAssets `json:"vehicle_assets,omitempty"` - // URL to an image that would assist the user in identifying the vehicle. JPEG or PNG. Added - // in v2.3 - VehicleImage *string `json:"vehicle_image,omitempty"` - // Unique identifier of a vehicle type. - VehicleTypeID string `json:"vehicle_type_id"` - // Number of wheels this vehicle type has. Added in v2.3 - WheelCount *int64 `json:"wheel_count,omitempty"` + // The capacity of the vehicle cargo space (excluding passengers), expressed in kilograms. + CargoLoadCapacity *uint64 `json:"cargo_load_capacity,omitempty"` + // Cargo volume available in the vehicle, expressed in liters. + CargoVolumeCapacity *uint64 `json:"cargo_volume_capacity,omitempty"` + // The color of the vehicle. Added in v2.3 + Color *string `json:"color,omitempty"` + // A plan_id as defined in system_pricing_plans.json added in v2.3-RC. + DefaultPricingPlanID *common.ID `json:"default_pricing_plan_id,omitempty"` + // Maximum time in minutes that a vehicle can be reserved before a rental begins added in + // v2.3-RC. + DefaultReserveTime *uint64 `json:"default_reserve_time,omitempty"` + // Customer-readable description of the vehicle type outlining special features or how-tos. + // An array with one object per supported language with the following keys: + Description []common.LocalizedString `json:"description,omitempty"` + // Vehicle air quality certificate. added in v2.3. + EcoLabels []common.EcoLabel `json:"eco_labels,omitempty"` + // The vehicle's general form factor. + FormFactor common.FormFactor `json:"form_factor"` + // Maximum quantity of CO2, in grams, emitted per kilometer, according to the WLTP. Added in + // v2.3 + GCO2KM *uint64 `json:"g_CO2_km,omitempty"` + // The name of the vehicle manufacturer. An array with one object per supported language + // with the following keys: + Make []common.LocalizedString `json:"make,omitempty"` + // The maximum speed in kilometers per hour this vehicle is permitted to reach in accordance + // with local permit and regulations. Added in v2.3 + MaxPermittedSpeed *uint64 `json:"max_permitted_speed,omitempty"` + // The furthest distance in meters that the vehicle can travel without recharging or + // refueling when it has the maximum amount of energy potential. + MaxRangeMeters *float64 `json:"max_range_meters,omitempty"` + // The name of the vehicle model. An array with one object per supported language with the + // following keys: + Model []common.LocalizedString `json:"model,omitempty"` + // The public name of this vehicle type. An array with one object per supported language + // with the following keys: + Name []common.LocalizedString `json:"name,omitempty"` + // Array of all pricing plan IDs as defined in system_pricing_plans.json added in v2.3-RC. + PricingPlanIDS []common.ID `json:"pricing_plan_ids,omitempty"` + // The primary propulsion type of the vehicle. Updated in v2.3 to represent car-sharing + PropulsionType common.PropulsionType `json:"propulsion_type"` + // The rated power of the motor for this vehicle type in watts. Added in v2.3 + RatedPower *uint64 `json:"rated_power,omitempty"` + // The conditions for returning the vehicle at the end of the trip. Added in v2.3-RC as + // return_type, and updated to return_constraint in v2.3. + ReturnConstraint *common.ReturnConstraint `json:"return_constraint,omitempty"` + // The number of riders (driver included) the vehicle can legally accommodate + RiderCapacity *uint64 `json:"rider_capacity,omitempty"` + // Description of accessories available in the vehicle. + VehicleAccessories []common.VehicleAccessory `json:"vehicle_accessories,omitempty"` + // An object where each key defines one of the items listed below added in v2.3-RC. + VehicleAssets *common.VehicleAssets `json:"vehicle_assets,omitempty"` + // URL to an image that would assist the user in identifying the vehicle. JPEG or PNG. Added + // in v2.3 + VehicleImage *common.URL `json:"vehicle_image,omitempty"` + // Unique identifier of a vehicle type. + VehicleTypeID common.ID `json:"vehicle_type_id"` + // Number of wheels this vehicle type has. Added in v2.3 + WheelCount *uint64 `json:"wheel_count,omitempty"` } - -type Description struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type EcoLabel struct { - // Country code following the ISO 3166-1 alpha-2 notation. Added in v2.3. - CountryCode *string `json:"country_code,omitempty"` - // Name of the eco label. Added in v2.3. - EcoSticker *string `json:"eco_sticker,omitempty"` -} - -type Make struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Model struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// An object where each key defines one of the items listed below added in v2.3-RC. -type VehicleAssets struct { - // Date that indicates the last time any included vehicle icon images were modified or - // updated added in v2.3-RC. - IconLastModified string `json:"icon_last_modified"` - // A fully qualified URL pointing to the location of a graphic icon file that MAY be used to - // represent this vehicle type on maps and in other applications added in v2.3-RC. - IconURL string `json:"icon_url"` - // A fully qualified URL pointing to the location of a graphic icon file to be used to - // represent this vehicle type when in dark mode added in v2.3-RC. - IconURLDark *string `json:"icon_url_dark,omitempty"` -} - -// The vehicle's general form factor. -type FormFactor string - -const ( - Bicycle FormFactor = "bicycle" - Car FormFactor = "car" - CargoBicycle FormFactor = "cargo_bicycle" - Moped FormFactor = "moped" - Other FormFactor = "other" - Scooter FormFactor = "scooter" - ScooterSeated FormFactor = "scooter_seated" - ScooterStanding FormFactor = "scooter_standing" -) - -// The primary propulsion type of the vehicle. Updated in v2.3 to represent car-sharing -type PropulsionType string - -const ( - Combustion PropulsionType = "combustion" - CombustionDiesel PropulsionType = "combustion_diesel" - Electric PropulsionType = "electric" - ElectricAssist PropulsionType = "electric_assist" - Human PropulsionType = "human" - HydrogenFuelCell PropulsionType = "hydrogen_fuel_cell" - PlugInHybrid PropulsionType = "plug_in_hybrid" - PropulsionTypeHybrid PropulsionType = "hybrid" -) - -// The conditions for returning the vehicle at the end of the trip. Added in v2.3-RC as -// return_type, and updated to return_constraint in v2.3. -type ReturnConstraint string - -const ( - AnyStation ReturnConstraint = "any_station" - FreeFloating ReturnConstraint = "free_floating" - ReturnConstraintHybrid ReturnConstraint = "hybrid" - RoundtripStation ReturnConstraint = "roundtrip_station" -) - -type VehicleAccessory string - -const ( - AirConditioning VehicleAccessory = "air_conditioning" - Automatic VehicleAccessory = "automatic" - Convertible VehicleAccessory = "convertible" - CruiseControl VehicleAccessory = "cruise_control" - Doors2 VehicleAccessory = "doors_2" - Doors3 VehicleAccessory = "doors_3" - Doors4 VehicleAccessory = "doors_4" - Doors5 VehicleAccessory = "doors_5" - Manual VehicleAccessory = "manual" - Navigation VehicleAccessory = "navigation" -) - -type Version string - -const ( - The30 Version = "3.0" -) diff --git a/models/golang/v3.1-RC2/gbfs/gbfs.go b/models/golang/v3.1-RC2/gbfs/gbfs.go index 6bf6bced..35bcd3f7 100644 --- a/models/golang/v3.1-RC2/gbfs/gbfs.go +++ b/models/golang/v3.1-RC2/gbfs/gbfs.go @@ -12,76 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// gbfs, err := UnmarshalGbfs(bytes) -// bytes, err = gbfs.Marshal() - package gbfs - - -import "encoding/json" - -func UnmarshalGbfs(data []byte) (Gbfs, error) { - var r Gbfs - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *Gbfs) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + gbfs_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/gbfs" +) // Auto-discovery file that links to all of the other files published by the system. type Gbfs struct { - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + gbfs_v30.Gbfs } - -type Data struct { - // An array of all of the feeds that are published by the auto-discovery file. Each element - // in the array is an object with the keys below. - Feeds []Feed `json:"feeds"` -} - -type Feed struct { - // Key identifying the type of feed this is. The key must be the base file name defined in - // the spec for the corresponding feed type. - Name Name `json:"name"` - // URL for the feed. - URL string `json:"url"` -} - -// Key identifying the type of feed this is. The key must be the base file name defined in -// the spec for the corresponding feed type. -type Name string - -const ( - GbfsVersions Name = "gbfs_versions" - GeofencingZones Name = "geofencing_zones" - NameGbfs Name = "gbfs" - StationInformation Name = "station_information" - StationStatus Name = "station_status" - SystemAlerts Name = "system_alerts" - SystemInformation Name = "system_information" - SystemPricingPlans Name = "system_pricing_plans" - SystemRegions Name = "system_regions" - VehicleAvailability Name = "vehicle_availability" - VehicleStatus Name = "vehicle_status" - VehicleTypes Name = "vehicle_types" -) - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/gbfs_versions/gbfs_versions.go b/models/golang/v3.1-RC2/gbfs_versions/gbfs_versions.go index 317b657b..770c8bca 100644 --- a/models/golang/v3.1-RC2/gbfs_versions/gbfs_versions.go +++ b/models/golang/v3.1-RC2/gbfs_versions/gbfs_versions.go @@ -12,72 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// gbfsVersions, err := UnmarshalGbfsVersions(bytes) -// bytes, err = gbfsVersions.Marshal() - package gbfs_versions - - -import "encoding/json" - -func UnmarshalGbfsVersions(data []byte) (GbfsVersions, error) { - var r GbfsVersions - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *GbfsVersions) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + versions_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/gbfs_versions" +) // Lists all feed endpoints published according to version sof the GBFS documentation. // (added in v1.1) type GbfsVersions struct { - // Response data in the form of name:value pairs. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework. - Version GbfsVersionsVersion `json:"version"` + versions_v30.GbfsVersions } - -// Response data in the form of name:value pairs. -type Data struct { - // Contains one object, as defined below, for each of the available versions of a feed. The - // array must be sorted by increasing MAJOR and MINOR version number. - Versions []VersionElement `json:"versions"` -} - -type VersionElement struct { - // URL of the corresponding gbfs.json endpoint - URL string `json:"url"` - // The semantic version of the feed in the form X.Y - Version VersionVersion `json:"version"` -} - -// The semantic version of the feed in the form X.Y -type VersionVersion string - -const ( - Purple31RC2 VersionVersion = "3.1-RC2" - The10 VersionVersion = "1.0" - The11 VersionVersion = "1.1" - The20 VersionVersion = "2.0" - The21 VersionVersion = "2.1" - The22 VersionVersion = "2.2" - The23 VersionVersion = "2.3" - The30 VersionVersion = "3.0" -) - -type GbfsVersionsVersion string - -const ( - Fluffy31RC2 GbfsVersionsVersion = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/geofencing_zones/geofencing_zones.go b/models/golang/v3.1-RC2/geofencing_zones/geofencing_zones.go index 89fe86e5..70bd7232 100644 --- a/models/golang/v3.1-RC2/geofencing_zones/geofencing_zones.go +++ b/models/golang/v3.1-RC2/geofencing_zones/geofencing_zones.go @@ -12,148 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// geofencingZones, err := UnmarshalGeofencingZones(bytes) -// bytes, err = geofencingZones.Marshal() - package geofencing_zones - - -import "encoding/json" - -func UnmarshalGeofencingZones(data []byte) (GeofencingZones, error) { - var r GeofencingZones - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *GeofencingZones) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + geofencing_zones_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/geofencing_zones" +) // Describes geofencing zones and their associated rules and attributes (added in v2.1-RC). type GeofencingZones struct { - // Array that contains geofencing information for the system. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework. - Version Version `json:"version"` -} - -// Array that contains geofencing information for the system. -type Data struct { - // Each geofenced zone and its associated rules and attributes is described as an object - // within the array of features. - GeofencingZones GeofencingZonesClass `json:"geofencing_zones"` - // Array of Rule objects defining restrictions that apply globally in all areas as the - // default restrictions, except where overridden with an explicit geofencing zone. - GlobalRules []GlobalRule `json:"global_rules"` -} - -// Each geofenced zone and its associated rules and attributes is described as an object -// within the array of features. -type GeofencingZonesClass struct { - // Array of objects. - Features []GeoJSONFeature `json:"features"` - // FeatureCollection as per IETF RFC 7946. - Type GeofencingZonesType `json:"type"` -} - -type GeoJSONFeature struct { - // A polygon that describes where rides might not be able to start, end, go through, or have - // other limitations. Must follow the right-hand rule. - Geometry GeoJSONMultiPolygon `json:"geometry"` - // Describing travel allowances and limitations. - Properties Properties `json:"properties"` - Type FeatureType `json:"type"` -} - -// A polygon that describes where rides might not be able to start, end, go through, or have -// other limitations. Must follow the right-hand rule. -type GeoJSONMultiPolygon struct { - Coordinates [][][][]float64 `json:"coordinates"` - Type GeometryType `json:"type"` -} - -// Describing travel allowances and limitations. -type Properties struct { - // End time of the geofencing zone in RFC3339 format. - End *string `json:"end,omitempty"` - // Public name of the geofencing zone. - Name []Name `json:"name,omitempty"` - // Array of Rule objects defining restrictions that apply within the area of the polygon. - Rules []Rule `json:"rules,omitempty"` - // Start time of the geofencing zone in RFC3339 format. - Start *string `json:"start,omitempty"` + geofencing_zones_v30.GeofencingZones } - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Rule struct { - // What is the maximum speed allowed, in kilometers per hour? - MaximumSpeedKph *int64 `json:"maximum_speed_kph,omitempty"` - // Is the ride allowed to end in this zone? - RideEndAllowed bool `json:"ride_end_allowed"` - // Is the ride allowed to start in this zone? - RideStartAllowed bool `json:"ride_start_allowed"` - // Is the ride allowed to travel through this zone? - RideThroughAllowed bool `json:"ride_through_allowed"` - // Vehicle MUST be parked at stations defined in station_information.json within this - // geofence zone - StationParking *bool `json:"station_parking,omitempty"` - // Array of vehicle type IDs for which these restrictions apply. - VehicleTypeIDS []string `json:"vehicle_type_ids,omitempty"` -} - -type GlobalRule struct { - // What is the maximum speed allowed, in kilometers per hour? - MaximumSpeedKph *int64 `json:"maximum_speed_kph,omitempty"` - // Is the ride allowed to end in this zone? - RideEndAllowed bool `json:"ride_end_allowed"` - // Is the ride allowed to start in this zone? - RideStartAllowed bool `json:"ride_start_allowed"` - // Is the ride allowed to travel through this zone? - RideThroughAllowed bool `json:"ride_through_allowed"` - // Vehicle MUST be parked at stations defined in station_information.json within this - // geofence zone - StationParking *bool `json:"station_parking,omitempty"` - // Array of vehicle type IDs for which these restrictions apply. - VehicleTypeIDS []string `json:"vehicle_type_ids,omitempty"` -} - -type GeometryType string - -const ( - MultiPolygon GeometryType = "MultiPolygon" -) - -type FeatureType string - -const ( - Feature FeatureType = "Feature" -) - -// FeatureCollection as per IETF RFC 7946. -type GeofencingZonesType string - -const ( - FeatureCollection GeofencingZonesType = "FeatureCollection" -) - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/manifest/manifest.go b/models/golang/v3.1-RC2/manifest/manifest.go index 1d4e55d0..9d11f848 100644 --- a/models/golang/v3.1-RC2/manifest/manifest.go +++ b/models/golang/v3.1-RC2/manifest/manifest.go @@ -12,95 +12,33 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// manifest, err := UnmarshalManifest(bytes) -// bytes, err = manifest.Marshal() - package manifest - - -import "encoding/json" - -func UnmarshalManifest(data []byte) (Manifest, error) { - var r Manifest - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *Manifest) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + manifest_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/manifest" + "github.com/paulmach/orb/geojson" +) // An index of gbfs.json URLs for each GBFS data set produced by a publisher. A single // instance of this file should be published at a single stable URL, for example: // https://example.com/gbfs/manifest.json. type Manifest struct { - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version ManifestVersion `json:"version"` + manifest_v30.Manifest + Data Data `json:"data"` } type Data struct { - // An array of objects, each containing the keys below. - Datasets []Dataset `json:"datasets"` + // An array of objects, each containing the keys below. + Datasets []Dataset `json:"datasets"` } type Dataset struct { - // A GeoJSON MultiPolygon that describes the operating area. - Area *Area `json:"area,omitempty"` - // The ISO 3166-1 alpha-2 country code of the operating area. - CountryCode *string `json:"country_code,omitempty"` - // The system_id from system_information.json for the corresponding data set(s). - SystemID string `json:"system_id"` - // Contains one object, as defined below, for each of the available versions of a feed. The - // array MUST be sorted by increasing MAJOR and MINOR version number. - Versions []VersionElement `json:"versions"` -} - -// A GeoJSON MultiPolygon that describes the operating area. -type Area struct { - Coordinates [][][][]float64 `json:"coordinates"` - Type Type `json:"type"` + manifest_v30.Dataset + // A GeoJSON MultiPolygon that describes the operating area. + // If area is supplied, then the record describes the general operating area of the system for the purpose of discovery. + // Geographic details of the system's operating restrictions must be explicitly specified using station locations and geofencing zones, where appropriate. + Area *geojson.MultiPolygon `json:"area,omitempty"` + // The ISO 3166-1 alpha-2 country code of the operating area. The field MUST NOT be specified if the operating area spans multiple countries. + CountryCode *common.CountryCode `json:"country_code,omitempty"` } - -type VersionElement struct { - // URL of the corresponding gbfs.json endpoint - URL string `json:"url"` - // The semantic version of the feed in the form X.Y - Version VersionVersion `json:"version"` -} - -type Type string - -const ( - MultiPolygon Type = "MultiPolygon" -) - -// The semantic version of the feed in the form X.Y -type VersionVersion string - -const ( - Purple31RC2 VersionVersion = "3.1-RC2" - The10 VersionVersion = "1.0" - The11 VersionVersion = "1.1" - The20 VersionVersion = "2.0" - The21 VersionVersion = "2.1" - The22 VersionVersion = "2.2" - The23 VersionVersion = "2.3" - The30 VersionVersion = "3.0" -) - -type ManifestVersion string - -const ( - Fluffy31RC2 ManifestVersion = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/station_information/station_information.go b/models/golang/v3.1-RC2/station_information/station_information.go index ffb73508..5d3937b7 100644 --- a/models/golang/v3.1-RC2/station_information/station_information.go +++ b/models/golang/v3.1-RC2/station_information/station_information.go @@ -12,184 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// stationInformation, err := UnmarshalStationInformation(bytes) -// bytes, err = stationInformation.Marshal() - package station_information - - -import "encoding/json" - -func UnmarshalStationInformation(data []byte) (StationInformation, error) { - var r StationInformation - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *StationInformation) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + station_information_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/station_information" +) // List of all stations, their capacities and locations. REQUIRED of systems utilizing docks. type StationInformation struct { - // Array that contains one object per station as defined below. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + station_information_v30.StationInformation + // Array that contains one object per station as defined below. + Data Data `json:"data"` } -// Array that contains one object per station as defined below. type Data struct { Stations []Station `json:"stations"` } type Station struct { - // Address where station is located. - Address *string `json:"address,omitempty"` - // Number of total docking points installed at this station, both available and unavailable. - Capacity *int64 `json:"capacity,omitempty"` - // City where station is located. (added in v3.1-RC2) - City *string `json:"city,omitempty"` - // Contact phone of the station. Added in v2.3 - ContactPhone *string `json:"contact_phone,omitempty"` - // Cross street or landmark where the station is located. - CrossStreet *string `json:"cross_street,omitempty"` - // Does the station support charging of electric vehicles? (added in v2.3-RC) - IsChargingStation *bool `json:"is_charging_station,omitempty"` - // Are valet services provided at this station? (added in v2.1-RC) - IsValetStation *bool `json:"is_valet_station,omitempty"` - // Is this station a location with or without physical infrastructure? (added in v2.1-RC) - IsVirtualStation *bool `json:"is_virtual_station,omitempty"` - // The latitude of the station. - Lat float64 `json:"lat"` - // The longitude fo the station. - Lon float64 `json:"lon"` - // Public name of the station. - Name []Name `json:"name"` - // Are parking hoops present at this station? Added in v2.3 - ParkingHoop *bool `json:"parking_hoop,omitempty"` - // Type of parking station. Added in v2.3 - ParkingType *ParkingType `json:"parking_type,omitempty"` - // Postal code where station is located. - PostCode *string `json:"post_code,omitempty"` - // Identifier of the region where the station is located. - RegionID *string `json:"region_id,omitempty"` - // Payment methods accepted at this station. - RentalMethods []RentalMethod `json:"rental_methods,omitempty"` - // Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added - // in v1.1). - RentalUris *RentalUris `json:"rental_uris,omitempty"` - // Short name or other type of identifier. - ShortName []ShortName `json:"short_name,omitempty"` - // A multipolygon that describes the area of a virtual station (added in v2.1-RC). - StationArea *StationArea `json:"station_area,omitempty"` - // Identifier of a station. - StationID string `json:"station_id"` - // Hours of operation for the station in OSM opening_hours format. - StationOpeningHours *string `json:"station_opening_hours,omitempty"` - // This field's value is an array of objects containing the keys vehicle_type_ids and count - // defined below. These objects are used to model the total docking capacity of a station, - // both available and unavailable, for each type of vehicle that may dock at this station. - VehicleDocksCapacity []VehicleDocksCapacity `json:"vehicle_docks_capacity,omitempty"` - // This field's value is an array of objects containing the keys vehicle_type_ids and count - // defined below. These objects are used to model the parking capacity of virtual stations - // (defined using the is_virtual_station field) for each vehicle type that can be returned - // to this station. - VehicleTypesCapacity []VehicleTypesCapacity `json:"vehicle_types_capacity,omitempty"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added -// in v1.1). -type RentalUris struct { - // URI that can be passed to an Android app with an intent (added in v1.1). - Android *string `json:"android,omitempty"` - // URI that can be used on iOS to launch the rental app for this station (added in v1.1). - Ios *string `json:"ios,omitempty"` - // URL that can be used by a web browser to show more information about renting a vehicle at - // this station (added in v1.1). - Web *string `json:"web,omitempty"` -} - -type ShortName struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// A multipolygon that describes the area of a virtual station (added in v2.1-RC). -type StationArea struct { - Coordinates [][][][]float64 `json:"coordinates"` - Type Type `json:"type"` + station_information_v30.Station + City *string `json:"city,omitempty"` } - -type VehicleDocksCapacity struct { - // A number representing the total number of docks at the station, both available and - // unavailable, that may accept the vehicle types specified by vehicle_type_ids. - Count int64 `json:"count"` - // An array of strings where each string represents a vehicle_type_id that is able to use a - // particular type of dock at the station. - VehicleTypeIDS []string `json:"vehicle_type_ids"` -} - -type VehicleTypesCapacity struct { - // A number representing the total number of vehicles of the specified vehicle_type_ids that - // can park within the virtual station. - Count int64 `json:"count"` - // The vehicle_type_ids, as defined in vehicle_types.json, that may park at the virtual - // station. - VehicleTypeIDS []string `json:"vehicle_type_ids"` -} - -// Type of parking station. Added in v2.3 -type ParkingType string - -const ( - Other ParkingType = "other" - ParkingLot ParkingType = "parking_lot" - SidewalkParking ParkingType = "sidewalk_parking" - StreetParking ParkingType = "street_parking" - UndergroundParking ParkingType = "underground_parking" -) - -type RentalMethod string - -const ( - Accountnumber RentalMethod = "accountnumber" - Androidpay RentalMethod = "androidpay" - Applepay RentalMethod = "applepay" - Creditcard RentalMethod = "creditcard" - Key RentalMethod = "key" - Paypass RentalMethod = "paypass" - Phone RentalMethod = "phone" - Transitcard RentalMethod = "transitcard" -) - -type Type string - -const ( - MultiPolygon Type = "MultiPolygon" -) - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/station_status/station_status.go b/models/golang/v3.1-RC2/station_status/station_status.go index 7bdf072b..9e9d84c5 100644 --- a/models/golang/v3.1-RC2/station_status/station_status.go +++ b/models/golang/v3.1-RC2/station_status/station_status.go @@ -12,93 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// stationStatus, err := UnmarshalStationStatus(bytes) -// bytes, err = stationStatus.Marshal() - package station_status - - -import "encoding/json" - -func UnmarshalStationStatus(data []byte) (StationStatus, error) { - var r StationStatus - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *StationStatus) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + station_status_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/station_status" +) // Describes the capacity and rental availability of the station type StationStatus struct { - // Array that contains one object per station as defined below. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` -} - -// Array that contains one object per station as defined below. -type Data struct { - Stations []Station `json:"stations"` -} - -type Station struct { - // Is the station currently on the street? - IsInstalled bool `json:"is_installed"` - // Is the station currently renting vehicles? - IsRenting bool `json:"is_renting"` - // Is the station accepting vehicle returns? - IsReturning bool `json:"is_returning"` - // The last time this station reported its status to the operator's backend in RFC3339 - // format. - LastReported string `json:"last_reported"` - // Number of functional docks physically at the station. - NumDocksAvailable *int64 `json:"num_docks_available,omitempty"` - // Number of empty but disabled docks at the station. - NumDocksDisabled *int64 `json:"num_docks_disabled,omitempty"` - // Number of vehicles of any type physically available for rental at the station. - NumVehiclesAvailable int64 `json:"num_vehicles_available"` - // Number of disabled vehicles of any type at the station. - NumVehiclesDisabled *int64 `json:"num_vehicles_disabled,omitempty"` - // Identifier of a station. - StationID string `json:"station_id"` - // Object displaying available docks by vehicle type (added in v2.1-RC). - VehicleDocksAvailable []VehicleDocksAvailable `json:"vehicle_docks_available,omitempty"` - // Array of objects displaying the total number of each vehicle type at the station (added - // in v2.1-RC). - VehicleTypesAvailable []VehicleTypesAvailable `json:"vehicle_types_available,omitempty"` -} - -type VehicleDocksAvailable struct { - // A number representing the total number of available docks for the defined vehicle type - // (added in v2.1-RC). - Count int64 `json:"count"` - // An array of strings where each string represents a vehicle_type_id that is able to use a - // particular type of dock at the station (added in v2.1-RC). - VehicleTypeIDS []string `json:"vehicle_type_ids"` + station_status_v30.StationStatus } - -type VehicleTypesAvailable struct { - // A number representing the total amount of this vehicle type at the station (added in - // v2.1-RC). - Count int64 `json:"count"` - // The vehicle_type_id of vehicle at the station (added in v2.1-RC). - VehicleTypeID string `json:"vehicle_type_id"` -} - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/system_alerts/system_alerts.go b/models/golang/v3.1-RC2/system_alerts/system_alerts.go index ee0dd857..2058fae8 100644 --- a/models/golang/v3.1-RC2/system_alerts/system_alerts.go +++ b/models/golang/v3.1-RC2/system_alerts/system_alerts.go @@ -12,108 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// systemAlerts, err := UnmarshalSystemAlerts(bytes) -// bytes, err = systemAlerts.Marshal() - package system_alerts - - -import "encoding/json" - -func UnmarshalSystemAlerts(data []byte) (SystemAlerts, error) { - var r SystemAlerts - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *SystemAlerts) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + system_alerts_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/system_alerts" +) // Describes ad-hoc changes to the system. type SystemAlerts struct { - // Array that contains ad-hoc alerts for the system. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` -} - -// Array that contains ad-hoc alerts for the system. -type Data struct { - Alerts []Alert `json:"alerts"` + system_alerts_v30.SystemAlerts } - -type Alert struct { - // Identifier for this alert. - AlertID string `json:"alert_id"` - // Detailed description of the alert. - Description []Description `json:"description,omitempty"` - // Indicates the last time the info for the alert was updated. - LastUpdated *string `json:"last_updated,omitempty"` - // Array of identifiers of the regions for which this alert applies. - RegionIDS []string `json:"region_ids,omitempty"` - // Array of identifiers of the stations for which this alert applies. - StationIDS []string `json:"station_ids,omitempty"` - // A short summary of this alert to be displayed to the customer. - Summary []Summary `json:"summary"` - // Array of objects indicating when the alert is in effect. - Times []Time `json:"times,omitempty"` - // Type of alert. - Type Type `json:"type"` - // URL where the customer can learn more information about this alert. - URL []URL `json:"url,omitempty"` -} - -type Description struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Summary struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Time struct { - // End time of the alert. - End *string `json:"end,omitempty"` - // Start time of the alert. - Start *string `json:"start,omitempty"` -} - -type URL struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// Type of alert. -type Type string - -const ( - Other Type = "other" - StationClosure Type = "station_closure" - StationMove Type = "station_move" - SystemClosure Type = "system_closure" -) - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/system_information/system_information.go b/models/golang/v3.1-RC2/system_information/system_information.go index b246cbed..e9d3ab9b 100644 --- a/models/golang/v3.1-RC2/system_information/system_information.go +++ b/models/golang/v3.1-RC2/system_information/system_information.go @@ -12,1328 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// systemInformation, err := UnmarshalSystemInformation(bytes) -// bytes, err = systemInformation.Marshal() - package system_information - - -import "encoding/json" - -func UnmarshalSystemInformation(data []byte) (SystemInformation, error) { - var r SystemInformation - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *SystemInformation) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + system_information_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/system_information" +) // Details including system operator, system location, year implemented, URL, contact info, // time zone. type SystemInformation struct { - // Response data in the form of name:value pairs. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` -} - -// Response data in the form of name:value pairs. -type Data struct { - // If the feed license requires attribution, name of the organization to which attribution - // should be provided. An array with one object per supported language with the following - // keys: - AttributionOrganizationName []AttributionOrganizationName `json:"attribution_organization_name,omitempty"` - // URL of the organization to which attribution should be provided. - AttributionURL *string `json:"attribution_url,omitempty"` - // An object where each key defines one of the items listed below (added in v2.3-RC). - BrandAssets *BrandAssets `json:"brand_assets,omitempty"` - // Email address actively monitored by the operator's customer service department. - Email *string `json:"email,omitempty"` - // A single contact email address for consumers of this feed to report technical issues - // (added in v1.1). - FeedContactEmail string `json:"feed_contact_email"` - // List of languages used in translated strings. Each element in the list must be of type - // Language. - Languages []string `json:"languages"` - // REQUIRED if the dataset is provided under a standard license. An identifier for a - // standard license from the SPDX License List. Provide license_id rather than license_url - // if the license is included in the SPDX License List. See the GBFS wiki for a comparison - // of a subset of standard licenses. If the license_id and license_url fields are blank or - // omitted, this indicates that the feed is provided under the Creative Commons Universal - // Public Domain Dedication. - LicenseID *LicenseID `json:"license_id,omitempty"` - // A fully qualified URL of a page that defines the license terms for the GBFS data for this - // system. - LicenseURL *string `json:"license_url,omitempty"` - // REQUIRED if the producer publishes datasets for more than one system geography, for - // example Berlin and Paris. A fully qualified URL pointing to the manifest.json file for - // the publisher. - ManifestURL *string `json:"manifest_url,omitempty"` - // Name of the system to be displayed to customers. An array with one object per supported - // language with the following keys: - Name []Name `json:"name"` - // Hours and dates of operation for the system in OSM opening_hours format. (added in v3.0) - OpeningHours string `json:"opening_hours"` - // Name of the system operator. An array with one object per supported language with the - // following keys: - Operator []Operator `json:"operator,omitempty"` - // This OPTIONAL field SHOULD contain a single voice telephone number for the specified - // system’s customer service department. MUST be in E.164 format as defined in Field Types. - PhoneNumber *string `json:"phone_number,omitempty"` - // The date that the privacy policy provided at privacy_url was last updated (added in - // v2.3-RC). - PrivacyLastUpdated *string `json:"privacy_last_updated,omitempty"` - // A fully qualified URL pointing to the privacy policy for the service. An array with one - // object per supported language with the following keys: - PrivacyURL []PrivacyURL `json:"privacy_url,omitempty"` - // URL where a customer can purchase a membership. - PurchaseURL *string `json:"purchase_url,omitempty"` - // Contains rental app information in the android and ios JSON objects (added in v1.1). - RentalApps *RentalApps `json:"rental_apps,omitempty"` - // Abbreviation for a system. An array with one object per supported language with the - // following keys: - ShortName []ShortName `json:"short_name,omitempty"` - // Date that the system began operations. - StartDate *string `json:"start_date,omitempty"` - // Identifier for this vehicle share system. This should be globally unique (even between - // different systems). - SystemID string `json:"system_id"` - // Date after which this data source will no longer be available to consuming applications. - TerminationDate *string `json:"termination_date,omitempty"` - // The date that the terms of service provided at terms_url were last updated (added in - // v2.3-RC) - TermsLastUpdated *string `json:"terms_last_updated,omitempty"` - // A fully qualified URL pointing to the terms of service (also often called "terms of use" - // or "terms and conditions") for the service. An array with one object per supported - // language with the following keys: - TermsURL []TermsURL `json:"terms_url,omitempty"` - // The time zone where the system is located. - Timezone Timezone `json:"timezone"` - // The URL of the vehicle share system. - URL *string `json:"url,omitempty"` -} - -type AttributionOrganizationName struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// An object where each key defines one of the items listed below (added in v2.3-RC). -type BrandAssets struct { - // A fully qualified URL pointing to the location of a graphic file representing the brand - // for the service (added in v2.3-RC). - BrandImageURL string `json:"brand_image_url"` - // A fully qualified URL pointing to the location of a graphic file representing the brand - // for the service for use in dark mode (added in v2.3-RC). - BrandImageURLDark *string `json:"brand_image_url_dark,omitempty"` - // Date that indicates the last time any included brand assets were updated (added in - // v2.3-RC). - BrandLastModified string `json:"brand_last_modified"` - // A fully qualified URL pointing to the location of a page that defines the license terms - // of brand icons, colors or other trademark information (added in v2.3-RC). - BrandTermsURL *string `json:"brand_terms_url,omitempty"` - // Color used to represent the brand for the service (added in v2.3-RC) - Color *string `json:"color,omitempty"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Operator struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type PrivacyURL struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// Contains rental app information in the android and ios JSON objects (added in v1.1). -type RentalApps struct { - // Contains rental app download and app discovery information for the Android platform. - // (added in v1.1) - Android *Android `json:"android,omitempty"` - // Contains rental information for the iOS platform (added in v1.1). - Ios *Ios `json:"ios,omitempty"` -} - -// Contains rental app download and app discovery information for the Android platform. -// (added in v1.1) -type Android struct { - // URI that can be used to discover if the rental Android app is installed on the device - // (added in v1.1). - DiscoveryURI string `json:"discovery_uri"` - // URI where the rental Android app can be downloaded from (added in v1.1). - StoreURI string `json:"store_uri"` -} - -// Contains rental information for the iOS platform (added in v1.1). -type Ios struct { - // URI that can be used to discover if the rental iOS app is installed on the device (added - // in v1.1). - DiscoveryURI string `json:"discovery_uri"` - // URI where the rental iOS app can be downloaded from (added in v1.1). - StoreURI string `json:"store_uri"` -} - -type ShortName struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type TermsURL struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` + system_information_v30.SystemInformation } - -// REQUIRED if the dataset is provided under a standard license. An identifier for a -// standard license from the SPDX License List. Provide license_id rather than license_url -// if the license is included in the SPDX License List. See the GBFS wiki for a comparison -// of a subset of standard licenses. If the license_id and license_url fields are blank or -// omitted, this indicates that the feed is provided under the Creative Commons Universal -// Public Domain Dedication. -type LicenseID string - -const ( - AAL LicenseID = "AAL" - ADSL LicenseID = "ADSL" - AGPL10Only LicenseID = "AGPL-1.0-only" - AGPL10OrLater LicenseID = "AGPL-1.0-or-later" - AGPL30Only LicenseID = "AGPL-3.0-only" - AGPL30OrLater LicenseID = "AGPL-3.0-or-later" - ANTLRPDFallback LicenseID = "ANTLR-PD-fallback" - APL10 LicenseID = "APL-1.0" - Abstyles LicenseID = "Abstyles" - AdaCoreDoc LicenseID = "AdaCore-doc" - Adobe2006 LicenseID = "Adobe-2006" - AdobeGlyph LicenseID = "Adobe-Glyph" - Afl11 LicenseID = "AFL-1.1" - Afl12 LicenseID = "AFL-1.2" - Afl20 LicenseID = "AFL-2.0" - Afl21 LicenseID = "AFL-2.1" - Afl30 LicenseID = "AFL-3.0" - Afmparse LicenseID = "Afmparse" - Aladdin LicenseID = "Aladdin" - Amdplpa LicenseID = "AMDPLPA" - Aml LicenseID = "AML" - Ampas LicenseID = "AMPAS" - AntlrPD LicenseID = "ANTLR-PD" - Apache10 LicenseID = "Apache-1.0" - Apache11 LicenseID = "Apache-1.1" - Apache20 LicenseID = "Apache-2.0" - Apafml LicenseID = "APAFML" - AppS2P LicenseID = "App-s2p" - Apsl10 LicenseID = "APSL-1.0" - Apsl11 LicenseID = "APSL-1.1" - Apsl12 LicenseID = "APSL-1.2" - Apsl20 LicenseID = "APSL-2.0" - Arphic1999 LicenseID = "Arphic-1999" - Artistic10 LicenseID = "Artistic-1.0" - Artistic10Cl8 LicenseID = "Artistic-1.0-cl8" - Artistic10PERL LicenseID = "Artistic-1.0-Perl" - Artistic20 LicenseID = "Artistic-2.0" - BSD1Clause LicenseID = "BSD-1-Clause" - BSD2Clause LicenseID = "BSD-2-Clause" - BSD2ClausePatent LicenseID = "BSD-2-Clause-Patent" - BSD2ClauseViews LicenseID = "BSD-2-Clause-Views" - BSD3Clause LicenseID = "BSD-3-Clause" - BSD3ClauseAttribution LicenseID = "BSD-3-Clause-Attribution" - BSD3ClauseClear LicenseID = "BSD-3-Clause-Clear" - BSD3ClauseLBNL LicenseID = "BSD-3-Clause-LBNL" - BSD3ClauseModification LicenseID = "BSD-3-Clause-Modification" - BSD3ClauseNoMilitaryLicense LicenseID = "BSD-3-Clause-No-Military-License" - BSD3ClauseNoNuclearLicense LicenseID = "BSD-3-Clause-No-Nuclear-License" - BSD3ClauseNoNuclearLicense2014 LicenseID = "BSD-3-Clause-No-Nuclear-License-2014" - BSD3ClauseNoNuclearWarranty LicenseID = "BSD-3-Clause-No-Nuclear-Warranty" - BSD3ClauseOpenMPI LicenseID = "BSD-3-Clause-Open-MPI" - BSD43Reno LicenseID = "BSD-4.3RENO" - BSD43Tahoe LicenseID = "BSD-4.3TAHOE" - BSD4Clause LicenseID = "BSD-4-Clause" - BSD4ClauseShortened LicenseID = "BSD-4-Clause-Shortened" - BSD4ClauseUC LicenseID = "BSD-4-Clause-UC" - BSDAdvertisingAcknowledgement LicenseID = "BSD-Advertising-Acknowledgement" - BSDAttributionHPNDDisclaimer LicenseID = "BSD-Attribution-HPND-disclaimer" - BSDProtection LicenseID = "BSD-Protection" - BSDSourceCode LicenseID = "BSD-Source-Code" - Baekmuk LicenseID = "Baekmuk" - Bahyph LicenseID = "Bahyph" - Barr LicenseID = "Barr" - Beerware LicenseID = "Beerware" - BitTorrent10 LicenseID = "BitTorrent-1.0" - BitTorrent11 LicenseID = "BitTorrent-1.1" - BitstreamCharter LicenseID = "Bitstream-Charter" - BitstreamVera LicenseID = "Bitstream-Vera" - Blessing LicenseID = "blessing" - BlueOak100 LicenseID = "BlueOak-1.0.0" - Borceux LicenseID = "Borceux" - BrianGladman3Clause LicenseID = "Brian-Gladman-3-Clause" - Bsl10 LicenseID = "BSL-1.0" - Busl11 LicenseID = "BUSL-1.1" - Bzip2106 LicenseID = "bzip2-1.0.6" - CAL10CombinedWorkException LicenseID = "CAL-1.0-Combined-Work-Exception" - CDLAPermissive10 LicenseID = "CDLA-Permissive-1.0" - CDLAPermissive20 LicenseID = "CDLA-Permissive-2.0" - CDLASharing10 LicenseID = "CDLA-Sharing-1.0" - CMUMach LicenseID = "CMU-Mach" - CNRIJython LicenseID = "CNRI-Jython" - CNRIPython LicenseID = "CNRI-Python" - CNRIPythonGPLCompatible LicenseID = "CNRI-Python-GPL-Compatible" - CUAOpl10 LicenseID = "CUA-OPL-1.0" - CUda10 LicenseID = "C-UDA-1.0" - Cal10 LicenseID = "CAL-1.0" - Caldera LicenseID = "Caldera" - Catosl11 LicenseID = "CATOSL-1.1" - Cc010 LicenseID = "CC0-1.0" - CcBy10 LicenseID = "CC-BY-1.0" - CcBy20 LicenseID = "CC-BY-2.0" - CcBy25 LicenseID = "CC-BY-2.5" - CcBy25Au LicenseID = "CC-BY-2.5-AU" - CcBy30 LicenseID = "CC-BY-3.0" - CcBy30At LicenseID = "CC-BY-3.0-AT" - CcBy30De LicenseID = "CC-BY-3.0-DE" - CcBy30Igo LicenseID = "CC-BY-3.0-IGO" - CcBy30Nl LicenseID = "CC-BY-3.0-NL" - CcBy30Us LicenseID = "CC-BY-3.0-US" - CcBy40 LicenseID = "CC-BY-4.0" - CcByNc10 LicenseID = "CC-BY-NC-1.0" - CcByNc20 LicenseID = "CC-BY-NC-2.0" - CcByNc25 LicenseID = "CC-BY-NC-2.5" - CcByNc30 LicenseID = "CC-BY-NC-3.0" - CcByNc30De LicenseID = "CC-BY-NC-3.0-DE" - CcByNc40 LicenseID = "CC-BY-NC-4.0" - CcByNcNd10 LicenseID = "CC-BY-NC-ND-1.0" - CcByNcNd20 LicenseID = "CC-BY-NC-ND-2.0" - CcByNcNd25 LicenseID = "CC-BY-NC-ND-2.5" - CcByNcNd30 LicenseID = "CC-BY-NC-ND-3.0" - CcByNcNd30De LicenseID = "CC-BY-NC-ND-3.0-DE" - CcByNcNd30Igo LicenseID = "CC-BY-NC-ND-3.0-IGO" - CcByNcNd40 LicenseID = "CC-BY-NC-ND-4.0" - CcByNcSa10 LicenseID = "CC-BY-NC-SA-1.0" - CcByNcSa20 LicenseID = "CC-BY-NC-SA-2.0" - CcByNcSa20De LicenseID = "CC-BY-NC-SA-2.0-DE" - CcByNcSa20Fr LicenseID = "CC-BY-NC-SA-2.0-FR" - CcByNcSa20Uk LicenseID = "CC-BY-NC-SA-2.0-UK" - CcByNcSa25 LicenseID = "CC-BY-NC-SA-2.5" - CcByNcSa30 LicenseID = "CC-BY-NC-SA-3.0" - CcByNcSa30De LicenseID = "CC-BY-NC-SA-3.0-DE" - CcByNcSa30Igo LicenseID = "CC-BY-NC-SA-3.0-IGO" - CcByNcSa40 LicenseID = "CC-BY-NC-SA-4.0" - CcByNd10 LicenseID = "CC-BY-ND-1.0" - CcByNd20 LicenseID = "CC-BY-ND-2.0" - CcByNd25 LicenseID = "CC-BY-ND-2.5" - CcByNd30 LicenseID = "CC-BY-ND-3.0" - CcByNd30De LicenseID = "CC-BY-ND-3.0-DE" - CcByNd40 LicenseID = "CC-BY-ND-4.0" - CcBySa10 LicenseID = "CC-BY-SA-1.0" - CcBySa20 LicenseID = "CC-BY-SA-2.0" - CcBySa20Uk LicenseID = "CC-BY-SA-2.0-UK" - CcBySa21Jp LicenseID = "CC-BY-SA-2.1-JP" - CcBySa25 LicenseID = "CC-BY-SA-2.5" - CcBySa30 LicenseID = "CC-BY-SA-3.0" - CcBySa30At LicenseID = "CC-BY-SA-3.0-AT" - CcBySa30De LicenseID = "CC-BY-SA-3.0-DE" - CcBySa40 LicenseID = "CC-BY-SA-4.0" - CcPddc LicenseID = "CC-PDDC" - Cddl10 LicenseID = "CDDL-1.0" - Cddl11 LicenseID = "CDDL-1.1" - Cdl10 LicenseID = "CDL-1.0" - Cecill10 LicenseID = "CECILL-1.0" - Cecill11 LicenseID = "CECILL-1.1" - Cecill20 LicenseID = "CECILL-2.0" - Cecill21 LicenseID = "CECILL-2.1" - CecillB LicenseID = "CECILL-B" - CecillC LicenseID = "CECILL-C" - CernOhl11 LicenseID = "CERN-OHL-1.1" - CernOhl12 LicenseID = "CERN-OHL-1.2" - CernOhlP20 LicenseID = "CERN-OHL-P-2.0" - CernOhlS20 LicenseID = "CERN-OHL-S-2.0" - CernOhlW20 LicenseID = "CERN-OHL-W-2.0" - Cfitsio LicenseID = "CFITSIO" - Checkmk LicenseID = "checkmk" - ClArtistic LicenseID = "ClArtistic" - Clips LicenseID = "Clips" - Coil10 LicenseID = "COIL-1.0" - CommunitySpec10 LicenseID = "Community-Spec-1.0" - Condor11 LicenseID = "Condor-1.1" - CopyleftNext030 LicenseID = "copyleft-next-0.3.0" - CopyleftNext031 LicenseID = "copyleft-next-0.3.1" - CornellLosslessJPEG LicenseID = "Cornell-Lossless-JPEG" - Cpal10 LicenseID = "CPAL-1.0" - Cpl10 LicenseID = "CPL-1.0" - Cpol102 LicenseID = "CPOL-1.02" - Crossword LicenseID = "Crossword" - CrystalStacker LicenseID = "CrystalStacker" - Cube LicenseID = "Cube" - Curl LicenseID = "curl" - DFsl10 LicenseID = "D-FSL-1.0" - DLDeBy20 LicenseID = "DL-DE-BY-2.0" - Diffmark LicenseID = "diffmark" - Doc LicenseID = "DOC" - Dotseqn LicenseID = "Dotseqn" - Drl10 LicenseID = "DRL-1.0" - Dsdp LicenseID = "DSDP" - Dvipdfm LicenseID = "dvipdfm" - EGenix LicenseID = "eGenix" - EUDatagrid LicenseID = "EUDatagrid" - Ecl10 LicenseID = "ECL-1.0" - Ecl20 LicenseID = "ECL-2.0" - Efl10 LicenseID = "EFL-1.0" - Efl20 LicenseID = "EFL-2.0" - Elastic20 LicenseID = "Elastic-2.0" - Entessa LicenseID = "Entessa" - Epics LicenseID = "EPICS" - Epl10 LicenseID = "EPL-1.0" - Epl20 LicenseID = "EPL-2.0" - ErlPL11 LicenseID = "ErlPL-1.1" - Etalab20 LicenseID = "etalab-2.0" - Eupl10 LicenseID = "EUPL-1.0" - Eupl11 LicenseID = "EUPL-1.1" - Eupl12 LicenseID = "EUPL-1.2" - Eurosym LicenseID = "Eurosym" - Fair LicenseID = "Fair" - FdkAAC LicenseID = "FDK-AAC" - Frameworx10 LicenseID = "Frameworx-1.0" - FreeBSDDOC LicenseID = "FreeBSD-DOC" - FreeImage LicenseID = "FreeImage" - Fsfap LicenseID = "FSFAP" - Fsful LicenseID = "FSFUL" - Fsfullr LicenseID = "FSFULLR" - Fsfullrwd LicenseID = "FSFULLRWD" - Ftl LicenseID = "FTL" - GFDL11InvariantsOnly LicenseID = "GFDL-1.1-invariants-only" - GFDL11InvariantsOrLater LicenseID = "GFDL-1.1-invariants-or-later" - GFDL11NoInvariantsOnly LicenseID = "GFDL-1.1-no-invariants-only" - GFDL11NoInvariantsOrLater LicenseID = "GFDL-1.1-no-invariants-or-later" - GFDL11Only LicenseID = "GFDL-1.1-only" - GFDL11OrLater LicenseID = "GFDL-1.1-or-later" - GFDL12InvariantsOnly LicenseID = "GFDL-1.2-invariants-only" - GFDL12InvariantsOrLater LicenseID = "GFDL-1.2-invariants-or-later" - GFDL12NoInvariantsOnly LicenseID = "GFDL-1.2-no-invariants-only" - GFDL12NoInvariantsOrLater LicenseID = "GFDL-1.2-no-invariants-or-later" - GFDL12Only LicenseID = "GFDL-1.2-only" - GFDL12OrLater LicenseID = "GFDL-1.2-or-later" - GFDL13InvariantsOnly LicenseID = "GFDL-1.3-invariants-only" - GFDL13InvariantsOrLater LicenseID = "GFDL-1.3-invariants-or-later" - GFDL13NoInvariantsOnly LicenseID = "GFDL-1.3-no-invariants-only" - GFDL13NoInvariantsOrLater LicenseID = "GFDL-1.3-no-invariants-or-later" - GFDL13Only LicenseID = "GFDL-1.3-only" - GFDL13OrLater LicenseID = "GFDL-1.3-or-later" - GPL10Only LicenseID = "GPL-1.0-only" - GPL10OrLater LicenseID = "GPL-1.0-or-later" - GPL20Only LicenseID = "GPL-2.0-only" - GPL20OrLater LicenseID = "GPL-2.0-or-later" - GPL30Only LicenseID = "GPL-3.0-only" - GPL30OrLater LicenseID = "GPL-3.0-or-later" - GSOAP13B LicenseID = "gSOAP-1.3b" - Gd LicenseID = "GD" - Giftware LicenseID = "Giftware" - Gl2PS LicenseID = "GL2PS" - Glide LicenseID = "Glide" - Glulxe LicenseID = "Glulxe" - Glwtpl LicenseID = "GLWTPL" - Gnuplot LicenseID = "gnuplot" - GraphicsGems LicenseID = "Graphics-Gems" - HP1986 LicenseID = "HP-1986" - HPNDExportUS LicenseID = "HPND-export-US" - HPNDMarkusKuhn LicenseID = "HPND-Markus-Kuhn" - HPNDSellVariant LicenseID = "HPND-sell-variant" - HPNDSellVariantMITDisclaimer LicenseID = "HPND-sell-variant-MIT-disclaimer" - HaskellReport LicenseID = "HaskellReport" - Hippocratic21 LicenseID = "Hippocratic-2.1" - Hpnd LicenseID = "HPND" - Htmltidy LicenseID = "HTMLTIDY" - IBMPibs LicenseID = "IBM-pibs" - IECCodeComponentsEULA LicenseID = "IEC-Code-Components-EULA" - IJGShort LicenseID = "IJG-short" - IMatix LicenseID = "iMatix" - IPL10 LicenseID = "IPL-1.0" - ISC LicenseID = "ISC" - Icu LicenseID = "ICU" - Ijg LicenseID = "IJG" - ImageMagick LicenseID = "ImageMagick" - Imlib2 LicenseID = "Imlib2" - InfoZIP LicenseID = "Info-ZIP" - Intel LicenseID = "Intel" - IntelACPI LicenseID = "Intel-ACPI" - Interbase10 LicenseID = "Interbase-1.0" - Ipa LicenseID = "IPA" - JPLImage LicenseID = "JPL-image" - JSON LicenseID = "JSON" - Jam LicenseID = "Jam" - JasPer20 LicenseID = "JasPer-2.0" - Jpnic LicenseID = "JPNIC" - Kazlib LicenseID = "Kazlib" - KnuthCTAN LicenseID = "Knuth-CTAN" - LGPL20Only LicenseID = "LGPL-2.0-only" - LGPL20OrLater LicenseID = "LGPL-2.0-or-later" - LGPL21Only LicenseID = "LGPL-2.1-only" - LGPL21OrLater LicenseID = "LGPL-2.1-or-later" - LGPL30Only LicenseID = "LGPL-3.0-only" - LGPL30OrLater LicenseID = "LGPL-3.0-or-later" - LPPL13A LicenseID = "LPPL-1.3a" - LPPL13C LicenseID = "LPPL-1.3c" - LZMASDK911To920 LicenseID = "LZMA-SDK-9.11-to-9.20" - Lal12 LicenseID = "LAL-1.2" - Lal13 LicenseID = "LAL-1.3" - Latex2E LicenseID = "Latex2e" - Leptonica LicenseID = "Leptonica" - Lgpllr LicenseID = "LGPLLR" - LiLiQP11 LicenseID = "LiLiQ-P-1.1" - LiLiQR11 LicenseID = "LiLiQ-R-1.1" - LiLiQRplus11 LicenseID = "LiLiQ-Rplus-1.1" - Libpng LicenseID = "Libpng" - Libpng20 LicenseID = "libpng-2.0" - Libselinux10 LicenseID = "libselinux-1.0" - Libtiff LicenseID = "libtiff" - LibutilDavidNugent LicenseID = "libutil-David-Nugent" - LinuxManPagesCopyleft LicenseID = "Linux-man-pages-copyleft" - LinuxOpenIB LicenseID = "Linux-OpenIB" - Loop LicenseID = "LOOP" - Lpl10 LicenseID = "LPL-1.0" - Lpl102 LicenseID = "LPL-1.02" - Lppl10 LicenseID = "LPPL-1.0" - Lppl11 LicenseID = "LPPL-1.1" - Lppl12 LicenseID = "LPPL-1.2" - LzmaSDK922 LicenseID = "LZMA-SDK-9.22" - MIT LicenseID = "MIT" - MIT0 LicenseID = "MIT-0" - MITAdvertising LicenseID = "MIT-advertising" - MITCmu LicenseID = "MIT-CMU" - MITEnna LicenseID = "MIT-enna" - MITFeh LicenseID = "MIT-feh" - MITModernVariant LicenseID = "MIT-Modern-Variant" - MITOpenGroup LicenseID = "MIT-open-group" - MITWu LicenseID = "MIT-Wu" - MPL10 LicenseID = "MPL-1.0" - MPL11 LicenseID = "MPL-1.1" - MPL20 LicenseID = "MPL-2.0" - MPL20NoCopyleftException LicenseID = "MPL-2.0-no-copyleft-exception" - MSLpl LicenseID = "MS-LPL" - MSPl LicenseID = "MS-PL" - MSRl LicenseID = "MS-RL" - MakeIndex LicenseID = "MakeIndex" - MartinBirgmeier LicenseID = "Martin-Birgmeier" - Minpack LicenseID = "Minpack" - MirOS LicenseID = "MirOS" - Mitnfa LicenseID = "MITNFA" - Motosoto LicenseID = "Motosoto" - MpiPermissive LicenseID = "mpi-permissive" - Mpich2 LicenseID = "mpich2" - Mplus LicenseID = "mplus" - Mtll LicenseID = "MTLL" - MulanPSL10 LicenseID = "MulanPSL-1.0" - MulanPSL20 LicenseID = "MulanPSL-2.0" - Multics LicenseID = "Multics" - Mup LicenseID = "Mup" - NCSA LicenseID = "NCSA" - NISTPD LicenseID = "NIST-PD" - NISTPDFallback LicenseID = "NIST-PD-fallback" - NPL10 LicenseID = "NPL-1.0" - NPL11 LicenseID = "NPL-1.1" - NTP LicenseID = "NTP" - NTP0 LicenseID = "NTP-0" - Naist2003 LicenseID = "NAIST-2003" - Nasa13 LicenseID = "NASA-1.3" - Naumen LicenseID = "Naumen" - Nbpl10 LicenseID = "NBPL-1.0" - NcglUk20 LicenseID = "NCGL-UK-2.0" - NetCDF LicenseID = "NetCDF" - NetSNMP LicenseID = "Net-SNMP" - Newsletr LicenseID = "Newsletr" - Ngpl LicenseID = "NGPL" - Nicta10 LicenseID = "NICTA-1.0" - Nlod10 LicenseID = "NLOD-1.0" - Nlod20 LicenseID = "NLOD-2.0" - Nlpl LicenseID = "NLPL" - Nokia LicenseID = "Nokia" - Nosl LicenseID = "NOSL" - Noweb LicenseID = "Noweb" - Nposl30 LicenseID = "NPOSL-3.0" - Nrl LicenseID = "NRL" - ODBL10 LicenseID = "ODbL-1.0" - ODCBy10 LicenseID = "ODC-By-1.0" - OFL10NoRFN LicenseID = "OFL-1.0-no-RFN" - OFL11NoRFN LicenseID = "OFL-1.1-no-RFN" - OGDLTaiwan10 LicenseID = "OGDL-Taiwan-1.0" - OGLCanada20 LicenseID = "OGL-Canada-2.0" - OUda10 LicenseID = "O-UDA-1.0" - OcctPl LicenseID = "OCCT-PL" - Oclc20 LicenseID = "OCLC-2.0" - Offis LicenseID = "OFFIS" - Ofl10 LicenseID = "OFL-1.0" - Ofl10Rfn LicenseID = "OFL-1.0-RFN" - Ofl11 LicenseID = "OFL-1.1" - Ofl11Rfn LicenseID = "OFL-1.1-RFN" - Ogc10 LicenseID = "OGC-1.0" - OglUk10 LicenseID = "OGL-UK-1.0" - OglUk20 LicenseID = "OGL-UK-2.0" - OglUk30 LicenseID = "OGL-UK-3.0" - Ogtsl LicenseID = "OGTSL" - Oldap11 LicenseID = "OLDAP-1.1" - Oldap12 LicenseID = "OLDAP-1.2" - Oldap13 LicenseID = "OLDAP-1.3" - Oldap14 LicenseID = "OLDAP-1.4" - Oldap20 LicenseID = "OLDAP-2.0" - Oldap201 LicenseID = "OLDAP-2.0.1" - Oldap21 LicenseID = "OLDAP-2.1" - Oldap22 LicenseID = "OLDAP-2.2" - Oldap221 LicenseID = "OLDAP-2.2.1" - Oldap222 LicenseID = "OLDAP-2.2.2" - Oldap23 LicenseID = "OLDAP-2.3" - Oldap24 LicenseID = "OLDAP-2.4" - Oldap25 LicenseID = "OLDAP-2.5" - Oldap26 LicenseID = "OLDAP-2.6" - Oldap27 LicenseID = "OLDAP-2.7" - Oldap28 LicenseID = "OLDAP-2.8" - Oml LicenseID = "OML" - OpenPBS23 LicenseID = "OpenPBS-2.3" - OpenSSL LicenseID = "OpenSSL" - Opl10 LicenseID = "OPL-1.0" - Opubl10 LicenseID = "OPUBL-1.0" - OsetPl21 LicenseID = "OSET-PL-2.1" - Osl10 LicenseID = "OSL-1.0" - Osl11 LicenseID = "OSL-1.1" - Osl20 LicenseID = "OSL-2.0" - Osl21 LicenseID = "OSL-2.1" - Osl30 LicenseID = "OSL-3.0" - PHP30 LicenseID = "PHP-3.0" - PHP301 LicenseID = "PHP-3.01" - Parity600 LicenseID = "Parity-6.0.0" - Parity700 LicenseID = "Parity-7.0.0" - Pddl10 LicenseID = "PDDL-1.0" - Plexus LicenseID = "Plexus" - PolyFormNoncommercial100 LicenseID = "PolyForm-Noncommercial-1.0.0" - PolyFormSmallBusiness100 LicenseID = "PolyForm-Small-Business-1.0.0" - PostgreSQL LicenseID = "PostgreSQL" - Psf20 LicenseID = "PSF-2.0" - Psfrag LicenseID = "psfrag" - Psutils LicenseID = "psutils" - Python20 LicenseID = "Python-2.0" - Python201 LicenseID = "Python-2.0.1" - Qhull LicenseID = "Qhull" - Qpl10 LicenseID = "QPL-1.0" - Qpl10Inria2004 LicenseID = "QPL-1.0-INRIA-2004" - RHeCos11 LicenseID = "RHeCos-1.1" - RSAMd LicenseID = "RSA-MD" - Rdisc LicenseID = "Rdisc" - Rpl11 LicenseID = "RPL-1.1" - Rpl15 LicenseID = "RPL-1.5" - Rpsl10 LicenseID = "RPSL-1.0" - Rscpl LicenseID = "RSCPL" - Ruby LicenseID = "Ruby" - SAXPD LicenseID = "SAX-PD" - SGIB10 LicenseID = "SGI-B-1.0" - SGIB11 LicenseID = "SGI-B-1.1" - SGIB20 LicenseID = "SGI-B-2.0" - SSHOpenSSH LicenseID = "SSH-OpenSSH" - SSHShort LicenseID = "SSH-short" - Saxpath LicenseID = "Saxpath" - Scea LicenseID = "SCEA" - SchemeReport LicenseID = "SchemeReport" - Sendmail LicenseID = "Sendmail" - Sendmail823 LicenseID = "Sendmail-8.23" - Shl05 LicenseID = "SHL-0.5" - Shl051 LicenseID = "SHL-0.51" - SimPL20 LicenseID = "SimPL-2.0" - Sissl LicenseID = "SISSL" - Sissl12 LicenseID = "SISSL-1.2" - Sleepycat LicenseID = "Sleepycat" - Smlnj LicenseID = "SMLNJ" - Smppl LicenseID = "SMPPL" - Snia LicenseID = "SNIA" - Snprintf LicenseID = "snprintf" - Spencer86 LicenseID = "Spencer-86" - Spencer94 LicenseID = "Spencer-94" - Spencer99 LicenseID = "Spencer-99" - Spl10 LicenseID = "SPL-1.0" - Sspl10 LicenseID = "SSPL-1.0" - SugarCRM113 LicenseID = "SugarCRM-1.1.3" - SunPro LicenseID = "SunPro" - Swl LicenseID = "SWL" - Symlinks LicenseID = "Symlinks" - TCPWrappers LicenseID = "TCP-wrappers" - TMate LicenseID = "TMate" - TUBerlin10 LicenseID = "TU-Berlin-1.0" - TUBerlin20 LicenseID = "TU-Berlin-2.0" - TaprOhl10 LicenseID = "TAPR-OHL-1.0" - Tcl LicenseID = "TCL" - The0BSD LicenseID = "0BSD" - Torque11 LicenseID = "TORQUE-1.1" - Tosl LicenseID = "TOSL" - Tpdl LicenseID = "TPDL" - Tpl10 LicenseID = "TPL-1.0" - Ttwl LicenseID = "TTWL" - Ucar LicenseID = "UCAR" - Ucl10 LicenseID = "UCL-1.0" - UnicodeDFS2015 LicenseID = "Unicode-DFS-2015" - UnicodeDFS2016 LicenseID = "Unicode-DFS-2016" - UnicodeTOU LicenseID = "Unicode-TOU" - Unlicense LicenseID = "Unlicense" - Upl10 LicenseID = "UPL-1.0" - Vim LicenseID = "Vim" - Vostrom LicenseID = "VOSTROM" - Vsl10 LicenseID = "VSL-1.0" - W3C LicenseID = "W3C" - W3C19980720 LicenseID = "W3C-19980720" - W3C20150513 LicenseID = "W3C-20150513" - W3M LicenseID = "w3m" - Watcom10 LicenseID = "Watcom-1.0" - Wsuipa LicenseID = "Wsuipa" - Wtfpl LicenseID = "WTFPL" - X11 LicenseID = "X11" - X11DistributeModificationsVariant LicenseID = "X11-distribute-modifications-variant" - XFree8611 LicenseID = "XFree86-1.1" - XSkat LicenseID = "XSkat" - Xerox LicenseID = "Xerox" - Xinetd LicenseID = "xinetd" - Xlock LicenseID = "xlock" - Xnet LicenseID = "Xnet" - Xpp LicenseID = "xpp" - Ypl10 LicenseID = "YPL-1.0" - Ypl11 LicenseID = "YPL-1.1" - ZPL11 LicenseID = "ZPL-1.1" - ZPL20 LicenseID = "ZPL-2.0" - ZPL21 LicenseID = "ZPL-2.1" - Zed LicenseID = "Zed" - Zend20 LicenseID = "Zend-2.0" - Zimbra13 LicenseID = "Zimbra-1.3" - Zimbra14 LicenseID = "Zimbra-1.4" - Zlib LicenseID = "Zlib" - ZlibAcknowledgement LicenseID = "zlib-acknowledgement" -) - -// The time zone where the system is located. -type Timezone string - -const ( - AfricaAbidjan Timezone = "Africa/Abidjan" - AfricaAccra Timezone = "Africa/Accra" - AfricaAddisAbaba Timezone = "Africa/Addis_Ababa" - AfricaAlgiers Timezone = "Africa/Algiers" - AfricaAsmara Timezone = "Africa/Asmara" - AfricaAsmera Timezone = "Africa/Asmera" - AfricaBamako Timezone = "Africa/Bamako" - AfricaBangui Timezone = "Africa/Bangui" - AfricaBanjul Timezone = "Africa/Banjul" - AfricaBissau Timezone = "Africa/Bissau" - AfricaBlantyre Timezone = "Africa/Blantyre" - AfricaBrazzaville Timezone = "Africa/Brazzaville" - AfricaBujumbura Timezone = "Africa/Bujumbura" - AfricaCairo Timezone = "Africa/Cairo" - AfricaCasablanca Timezone = "Africa/Casablanca" - AfricaCeuta Timezone = "Africa/Ceuta" - AfricaConakry Timezone = "Africa/Conakry" - AfricaDakar Timezone = "Africa/Dakar" - AfricaDarEsSalaam Timezone = "Africa/Dar_es_Salaam" - AfricaDjibouti Timezone = "Africa/Djibouti" - AfricaDouala Timezone = "Africa/Douala" - AfricaElAaiun Timezone = "Africa/El_Aaiun" - AfricaFreetown Timezone = "Africa/Freetown" - AfricaGaborone Timezone = "Africa/Gaborone" - AfricaHarare Timezone = "Africa/Harare" - AfricaJohannesburg Timezone = "Africa/Johannesburg" - AfricaJuba Timezone = "Africa/Juba" - AfricaKampala Timezone = "Africa/Kampala" - AfricaKhartoum Timezone = "Africa/Khartoum" - AfricaKigali Timezone = "Africa/Kigali" - AfricaKinshasa Timezone = "Africa/Kinshasa" - AfricaLagos Timezone = "Africa/Lagos" - AfricaLibreville Timezone = "Africa/Libreville" - AfricaLome Timezone = "Africa/Lome" - AfricaLuanda Timezone = "Africa/Luanda" - AfricaLubumbashi Timezone = "Africa/Lubumbashi" - AfricaLusaka Timezone = "Africa/Lusaka" - AfricaMalabo Timezone = "Africa/Malabo" - AfricaMaputo Timezone = "Africa/Maputo" - AfricaMaseru Timezone = "Africa/Maseru" - AfricaMbabane Timezone = "Africa/Mbabane" - AfricaMogadishu Timezone = "Africa/Mogadishu" - AfricaMonrovia Timezone = "Africa/Monrovia" - AfricaNairobi Timezone = "Africa/Nairobi" - AfricaNdjamena Timezone = "Africa/Ndjamena" - AfricaNiamey Timezone = "Africa/Niamey" - AfricaNouakchott Timezone = "Africa/Nouakchott" - AfricaOuagadougou Timezone = "Africa/Ouagadougou" - AfricaPortoNovo Timezone = "Africa/Porto-Novo" - AfricaSaoTome Timezone = "Africa/Sao_Tome" - AfricaTimbuktu Timezone = "Africa/Timbuktu" - AfricaTripoli Timezone = "Africa/Tripoli" - AfricaTunis Timezone = "Africa/Tunis" - AfricaWindhoek Timezone = "Africa/Windhoek" - AmericaAdak Timezone = "America/Adak" - AmericaAnchorage Timezone = "America/Anchorage" - AmericaAnguilla Timezone = "America/Anguilla" - AmericaAntigua Timezone = "America/Antigua" - AmericaAraguaina Timezone = "America/Araguaina" - AmericaArgentinaBuenosAires Timezone = "America/Argentina/Buenos_Aires" - AmericaArgentinaCatamarca Timezone = "America/Argentina/Catamarca" - AmericaArgentinaComodRivadavia Timezone = "America/Argentina/ComodRivadavia" - AmericaArgentinaCordoba Timezone = "America/Argentina/Cordoba" - AmericaArgentinaJujuy Timezone = "America/Argentina/Jujuy" - AmericaArgentinaLaRioja Timezone = "America/Argentina/La_Rioja" - AmericaArgentinaMendoza Timezone = "America/Argentina/Mendoza" - AmericaArgentinaRioGallegos Timezone = "America/Argentina/Rio_Gallegos" - AmericaArgentinaSANJuan Timezone = "America/Argentina/San_Juan" - AmericaArgentinaSANLuis Timezone = "America/Argentina/San_Luis" - AmericaArgentinaSalta Timezone = "America/Argentina/Salta" - AmericaArgentinaTucuman Timezone = "America/Argentina/Tucuman" - AmericaArgentinaUshuaia Timezone = "America/Argentina/Ushuaia" - AmericaAruba Timezone = "America/Aruba" - AmericaAsuncion Timezone = "America/Asuncion" - AmericaAtikokan Timezone = "America/Atikokan" - AmericaAtka Timezone = "America/Atka" - AmericaBahia Timezone = "America/Bahia" - AmericaBahiaBanderas Timezone = "America/Bahia_Banderas" - AmericaBarbados Timezone = "America/Barbados" - AmericaBelem Timezone = "America/Belem" - AmericaBelize Timezone = "America/Belize" - AmericaBlancSablon Timezone = "America/Blanc-Sablon" - AmericaBoaVista Timezone = "America/Boa_Vista" - AmericaBogota Timezone = "America/Bogota" - AmericaBoise Timezone = "America/Boise" - AmericaBuenosAires Timezone = "America/Buenos_Aires" - AmericaCambridgeBay Timezone = "America/Cambridge_Bay" - AmericaCampoGrande Timezone = "America/Campo_Grande" - AmericaCancun Timezone = "America/Cancun" - AmericaCaracas Timezone = "America/Caracas" - AmericaCatamarca Timezone = "America/Catamarca" - AmericaCayenne Timezone = "America/Cayenne" - AmericaCayman Timezone = "America/Cayman" - AmericaChicago Timezone = "America/Chicago" - AmericaChihuahua Timezone = "America/Chihuahua" - AmericaCiudadJuarez Timezone = "America/Ciudad_Juarez" - AmericaCoralHarbour Timezone = "America/Coral_Harbour" - AmericaCordoba Timezone = "America/Cordoba" - AmericaCostaRica Timezone = "America/Costa_Rica" - AmericaCreston Timezone = "America/Creston" - AmericaCuiaba Timezone = "America/Cuiaba" - AmericaCuracao Timezone = "America/Curacao" - AmericaDanmarkshavn Timezone = "America/Danmarkshavn" - AmericaDawson Timezone = "America/Dawson" - AmericaDawsonCreek Timezone = "America/Dawson_Creek" - AmericaDenver Timezone = "America/Denver" - AmericaDetroit Timezone = "America/Detroit" - AmericaDominica Timezone = "America/Dominica" - AmericaEdmonton Timezone = "America/Edmonton" - AmericaEirunepe Timezone = "America/Eirunepe" - AmericaElSalvador Timezone = "America/El_Salvador" - AmericaEnsenada Timezone = "America/Ensenada" - AmericaFortNelson Timezone = "America/Fort_Nelson" - AmericaFortWayne Timezone = "America/Fort_Wayne" - AmericaFortaleza Timezone = "America/Fortaleza" - AmericaGlaceBay Timezone = "America/Glace_Bay" - AmericaGodthab Timezone = "America/Godthab" - AmericaGooseBay Timezone = "America/Goose_Bay" - AmericaGrandTurk Timezone = "America/Grand_Turk" - AmericaGrenada Timezone = "America/Grenada" - AmericaGuadeloupe Timezone = "America/Guadeloupe" - AmericaGuatemala Timezone = "America/Guatemala" - AmericaGuayaquil Timezone = "America/Guayaquil" - AmericaGuyana Timezone = "America/Guyana" - AmericaHalifax Timezone = "America/Halifax" - AmericaHavana Timezone = "America/Havana" - AmericaHermosillo Timezone = "America/Hermosillo" - AmericaIndianaIndianapolis Timezone = "America/Indiana/Indianapolis" - AmericaIndianaKnox Timezone = "America/Indiana/Knox" - AmericaIndianaMarengo Timezone = "America/Indiana/Marengo" - AmericaIndianaPetersburg Timezone = "America/Indiana/Petersburg" - AmericaIndianaTellCity Timezone = "America/Indiana/Tell_City" - AmericaIndianaVevay Timezone = "America/Indiana/Vevay" - AmericaIndianaVincennes Timezone = "America/Indiana/Vincennes" - AmericaIndianaWinamac Timezone = "America/Indiana/Winamac" - AmericaIndianapolis Timezone = "America/Indianapolis" - AmericaInuvik Timezone = "America/Inuvik" - AmericaIqaluit Timezone = "America/Iqaluit" - AmericaJamaica Timezone = "America/Jamaica" - AmericaJujuy Timezone = "America/Jujuy" - AmericaJuneau Timezone = "America/Juneau" - AmericaKentuckyLouisville Timezone = "America/Kentucky/Louisville" - AmericaKentuckyMonticello Timezone = "America/Kentucky/Monticello" - AmericaKnoxIN Timezone = "America/Knox_IN" - AmericaKralendijk Timezone = "America/Kralendijk" - AmericaLaPaz Timezone = "America/La_Paz" - AmericaLima Timezone = "America/Lima" - AmericaLosAngeles Timezone = "America/Los_Angeles" - AmericaLouisville Timezone = "America/Louisville" - AmericaLowerPrinces Timezone = "America/Lower_Princes" - AmericaMaceio Timezone = "America/Maceio" - AmericaManagua Timezone = "America/Managua" - AmericaManaus Timezone = "America/Manaus" - AmericaMarigot Timezone = "America/Marigot" - AmericaMartinique Timezone = "America/Martinique" - AmericaMatamoros Timezone = "America/Matamoros" - AmericaMazatlan Timezone = "America/Mazatlan" - AmericaMendoza Timezone = "America/Mendoza" - AmericaMenominee Timezone = "America/Menominee" - AmericaMerida Timezone = "America/Merida" - AmericaMetlakatla Timezone = "America/Metlakatla" - AmericaMexicoCity Timezone = "America/Mexico_City" - AmericaMiquelon Timezone = "America/Miquelon" - AmericaMoncton Timezone = "America/Moncton" - AmericaMonterrey Timezone = "America/Monterrey" - AmericaMontevideo Timezone = "America/Montevideo" - AmericaMontreal Timezone = "America/Montreal" - AmericaMontserrat Timezone = "America/Montserrat" - AmericaNassau Timezone = "America/Nassau" - AmericaNewYork Timezone = "America/New_York" - AmericaNipigon Timezone = "America/Nipigon" - AmericaNome Timezone = "America/Nome" - AmericaNoronha Timezone = "America/Noronha" - AmericaNorthDakotaBeulah Timezone = "America/North_Dakota/Beulah" - AmericaNorthDakotaCenter Timezone = "America/North_Dakota/Center" - AmericaNorthDakotaNewSalem Timezone = "America/North_Dakota/New_Salem" - AmericaNuuk Timezone = "America/Nuuk" - AmericaOjinaga Timezone = "America/Ojinaga" - AmericaPanama Timezone = "America/Panama" - AmericaPangnirtung Timezone = "America/Pangnirtung" - AmericaParamaribo Timezone = "America/Paramaribo" - AmericaPhoenix Timezone = "America/Phoenix" - AmericaPortAuPrince Timezone = "America/Port-au-Prince" - AmericaPortOfSpain Timezone = "America/Port_of_Spain" - AmericaPortoAcre Timezone = "America/Porto_Acre" - AmericaPortoVelho Timezone = "America/Porto_Velho" - AmericaPuertoRico Timezone = "America/Puerto_Rico" - AmericaPuntaArenas Timezone = "America/Punta_Arenas" - AmericaRainyRiver Timezone = "America/Rainy_River" - AmericaRankinInlet Timezone = "America/Rankin_Inlet" - AmericaRecife Timezone = "America/Recife" - AmericaRegina Timezone = "America/Regina" - AmericaResolute Timezone = "America/Resolute" - AmericaRioBranco Timezone = "America/Rio_Branco" - AmericaRosario Timezone = "America/Rosario" - AmericaSantaIsabel Timezone = "America/Santa_Isabel" - AmericaSantarem Timezone = "America/Santarem" - AmericaSantiago Timezone = "America/Santiago" - AmericaSantoDomingo Timezone = "America/Santo_Domingo" - AmericaSaoPaulo Timezone = "America/Sao_Paulo" - AmericaScoresbysund Timezone = "America/Scoresbysund" - AmericaShiprock Timezone = "America/Shiprock" - AmericaSitka Timezone = "America/Sitka" - AmericaStBarthelemy Timezone = "America/St_Barthelemy" - AmericaStJohns Timezone = "America/St_Johns" - AmericaStKitts Timezone = "America/St_Kitts" - AmericaStLucia Timezone = "America/St_Lucia" - AmericaStThomas Timezone = "America/St_Thomas" - AmericaStVincent Timezone = "America/St_Vincent" - AmericaSwiftCurrent Timezone = "America/Swift_Current" - AmericaTegucigalpa Timezone = "America/Tegucigalpa" - AmericaThule Timezone = "America/Thule" - AmericaThunderBay Timezone = "America/Thunder_Bay" - AmericaTijuana Timezone = "America/Tijuana" - AmericaToronto Timezone = "America/Toronto" - AmericaTortola Timezone = "America/Tortola" - AmericaVancouver Timezone = "America/Vancouver" - AmericaVirgin Timezone = "America/Virgin" - AmericaWhitehorse Timezone = "America/Whitehorse" - AmericaWinnipeg Timezone = "America/Winnipeg" - AmericaYakutat Timezone = "America/Yakutat" - AmericaYellowknife Timezone = "America/Yellowknife" - AntarcticaCasey Timezone = "Antarctica/Casey" - AntarcticaDavis Timezone = "Antarctica/Davis" - AntarcticaDumontDUrville Timezone = "Antarctica/DumontDUrville" - AntarcticaMacquarie Timezone = "Antarctica/Macquarie" - AntarcticaMawson Timezone = "Antarctica/Mawson" - AntarcticaMcMurdo Timezone = "Antarctica/McMurdo" - AntarcticaPalmer Timezone = "Antarctica/Palmer" - AntarcticaRothera Timezone = "Antarctica/Rothera" - AntarcticaSouthPole Timezone = "Antarctica/South_Pole" - AntarcticaSyowa Timezone = "Antarctica/Syowa" - AntarcticaTroll Timezone = "Antarctica/Troll" - AntarcticaVostok Timezone = "Antarctica/Vostok" - ArcticLongyearbyen Timezone = "Arctic/Longyearbyen" - AsiaAden Timezone = "Asia/Aden" - AsiaAlmaty Timezone = "Asia/Almaty" - AsiaAmman Timezone = "Asia/Amman" - AsiaAnadyr Timezone = "Asia/Anadyr" - AsiaAqtau Timezone = "Asia/Aqtau" - AsiaAqtobe Timezone = "Asia/Aqtobe" - AsiaAshgabat Timezone = "Asia/Ashgabat" - AsiaAshkhabad Timezone = "Asia/Ashkhabad" - AsiaAtyrau Timezone = "Asia/Atyrau" - AsiaBaghdad Timezone = "Asia/Baghdad" - AsiaBahrain Timezone = "Asia/Bahrain" - AsiaBaku Timezone = "Asia/Baku" - AsiaBangkok Timezone = "Asia/Bangkok" - AsiaBarnaul Timezone = "Asia/Barnaul" - AsiaBeirut Timezone = "Asia/Beirut" - AsiaBishkek Timezone = "Asia/Bishkek" - AsiaBrunei Timezone = "Asia/Brunei" - AsiaCalcutta Timezone = "Asia/Calcutta" - AsiaChita Timezone = "Asia/Chita" - AsiaChoibalsan Timezone = "Asia/Choibalsan" - AsiaChongqing Timezone = "Asia/Chongqing" - AsiaChungking Timezone = "Asia/Chungking" - AsiaColombo Timezone = "Asia/Colombo" - AsiaDacca Timezone = "Asia/Dacca" - AsiaDamascus Timezone = "Asia/Damascus" - AsiaDhaka Timezone = "Asia/Dhaka" - AsiaDili Timezone = "Asia/Dili" - AsiaDubai Timezone = "Asia/Dubai" - AsiaDushanbe Timezone = "Asia/Dushanbe" - AsiaFamagusta Timezone = "Asia/Famagusta" - AsiaGaza Timezone = "Asia/Gaza" - AsiaHarbin Timezone = "Asia/Harbin" - AsiaHebron Timezone = "Asia/Hebron" - AsiaHoChiMinh Timezone = "Asia/Ho_Chi_Minh" - AsiaHongKong Timezone = "Asia/Hong_Kong" - AsiaHovd Timezone = "Asia/Hovd" - AsiaIrkutsk Timezone = "Asia/Irkutsk" - AsiaIstanbul Timezone = "Asia/Istanbul" - AsiaJakarta Timezone = "Asia/Jakarta" - AsiaJayapura Timezone = "Asia/Jayapura" - AsiaJerusalem Timezone = "Asia/Jerusalem" - AsiaKabul Timezone = "Asia/Kabul" - AsiaKamchatka Timezone = "Asia/Kamchatka" - AsiaKarachi Timezone = "Asia/Karachi" - AsiaKashgar Timezone = "Asia/Kashgar" - AsiaKathmandu Timezone = "Asia/Kathmandu" - AsiaKatmandu Timezone = "Asia/Katmandu" - AsiaKhandyga Timezone = "Asia/Khandyga" - AsiaKolkata Timezone = "Asia/Kolkata" - AsiaKrasnoyarsk Timezone = "Asia/Krasnoyarsk" - AsiaKualaLumpur Timezone = "Asia/Kuala_Lumpur" - AsiaKuching Timezone = "Asia/Kuching" - AsiaKuwait Timezone = "Asia/Kuwait" - AsiaMacao Timezone = "Asia/Macao" - AsiaMacau Timezone = "Asia/Macau" - AsiaMagadan Timezone = "Asia/Magadan" - AsiaMakassar Timezone = "Asia/Makassar" - AsiaManila Timezone = "Asia/Manila" - AsiaMuscat Timezone = "Asia/Muscat" - AsiaNicosia Timezone = "Asia/Nicosia" - AsiaNovokuznetsk Timezone = "Asia/Novokuznetsk" - AsiaNovosibirsk Timezone = "Asia/Novosibirsk" - AsiaOmsk Timezone = "Asia/Omsk" - AsiaOral Timezone = "Asia/Oral" - AsiaPhnomPenh Timezone = "Asia/Phnom_Penh" - AsiaPontianak Timezone = "Asia/Pontianak" - AsiaPyongyang Timezone = "Asia/Pyongyang" - AsiaQatar Timezone = "Asia/Qatar" - AsiaQostanay Timezone = "Asia/Qostanay" - AsiaQyzylorda Timezone = "Asia/Qyzylorda" - AsiaRangoon Timezone = "Asia/Rangoon" - AsiaRiyadh Timezone = "Asia/Riyadh" - AsiaSaigon Timezone = "Asia/Saigon" - AsiaSakhalin Timezone = "Asia/Sakhalin" - AsiaSamarkand Timezone = "Asia/Samarkand" - AsiaSeoul Timezone = "Asia/Seoul" - AsiaShanghai Timezone = "Asia/Shanghai" - AsiaSingapore Timezone = "Asia/Singapore" - AsiaSrednekolymsk Timezone = "Asia/Srednekolymsk" - AsiaTaipei Timezone = "Asia/Taipei" - AsiaTashkent Timezone = "Asia/Tashkent" - AsiaTbilisi Timezone = "Asia/Tbilisi" - AsiaTehran Timezone = "Asia/Tehran" - AsiaTelAviv Timezone = "Asia/Tel_Aviv" - AsiaThimbu Timezone = "Asia/Thimbu" - AsiaThimphu Timezone = "Asia/Thimphu" - AsiaTokyo Timezone = "Asia/Tokyo" - AsiaTomsk Timezone = "Asia/Tomsk" - AsiaUjungPandang Timezone = "Asia/Ujung_Pandang" - AsiaUlaanbaatar Timezone = "Asia/Ulaanbaatar" - AsiaUlanBator Timezone = "Asia/Ulan_Bator" - AsiaUrumqi Timezone = "Asia/Urumqi" - AsiaUstNera Timezone = "Asia/Ust-Nera" - AsiaVientiane Timezone = "Asia/Vientiane" - AsiaVladivostok Timezone = "Asia/Vladivostok" - AsiaYakutsk Timezone = "Asia/Yakutsk" - AsiaYangon Timezone = "Asia/Yangon" - AsiaYekaterinburg Timezone = "Asia/Yekaterinburg" - AsiaYerevan Timezone = "Asia/Yerevan" - AtlanticAzores Timezone = "Atlantic/Azores" - AtlanticBermuda Timezone = "Atlantic/Bermuda" - AtlanticCanary Timezone = "Atlantic/Canary" - AtlanticCapeVerde Timezone = "Atlantic/Cape_Verde" - AtlanticFaeroe Timezone = "Atlantic/Faeroe" - AtlanticFaroe Timezone = "Atlantic/Faroe" - AtlanticJanMayen Timezone = "Atlantic/Jan_Mayen" - AtlanticMadeira Timezone = "Atlantic/Madeira" - AtlanticReykjavik Timezone = "Atlantic/Reykjavik" - AtlanticSouthGeorgia Timezone = "Atlantic/South_Georgia" - AtlanticStHelena Timezone = "Atlantic/St_Helena" - AtlanticStanley Timezone = "Atlantic/Stanley" - AustraliaACT Timezone = "Australia/ACT" - AustraliaAdelaide Timezone = "Australia/Adelaide" - AustraliaBrisbane Timezone = "Australia/Brisbane" - AustraliaBrokenHill Timezone = "Australia/Broken_Hill" - AustraliaCanberra Timezone = "Australia/Canberra" - AustraliaCurrie Timezone = "Australia/Currie" - AustraliaDarwin Timezone = "Australia/Darwin" - AustraliaEucla Timezone = "Australia/Eucla" - AustraliaHobart Timezone = "Australia/Hobart" - AustraliaLHI Timezone = "Australia/LHI" - AustraliaLindeman Timezone = "Australia/Lindeman" - AustraliaLordHowe Timezone = "Australia/Lord_Howe" - AustraliaMelbourne Timezone = "Australia/Melbourne" - AustraliaNSW Timezone = "Australia/NSW" - AustraliaNorth Timezone = "Australia/North" - AustraliaPerth Timezone = "Australia/Perth" - AustraliaQueensland Timezone = "Australia/Queensland" - AustraliaSouth Timezone = "Australia/South" - AustraliaSydney Timezone = "Australia/Sydney" - AustraliaTasmania Timezone = "Australia/Tasmania" - AustraliaVictoria Timezone = "Australia/Victoria" - AustraliaWest Timezone = "Australia/West" - AustraliaYancowinna Timezone = "Australia/Yancowinna" - BrazilAcre Timezone = "Brazil/Acre" - BrazilDeNoronha Timezone = "Brazil/DeNoronha" - BrazilEast Timezone = "Brazil/East" - BrazilWest Timezone = "Brazil/West" - CanadaAtlantic Timezone = "Canada/Atlantic" - CanadaCentral Timezone = "Canada/Central" - CanadaEastern Timezone = "Canada/Eastern" - CanadaMountain Timezone = "Canada/Mountain" - CanadaNewfoundland Timezone = "Canada/Newfoundland" - CanadaPacific Timezone = "Canada/Pacific" - CanadaSaskatchewan Timezone = "Canada/Saskatchewan" - CanadaYukon Timezone = "Canada/Yukon" - Cet Timezone = "CET" - ChileContinental Timezone = "Chile/Continental" - ChileEasterIsland Timezone = "Chile/EasterIsland" - Cst6Cdt Timezone = "CST6CDT" - Cuba Timezone = "Cuba" - Eet Timezone = "EET" - Egypt Timezone = "Egypt" - Eire Timezone = "Eire" - Est Timezone = "EST" - Est5Edt Timezone = "EST5EDT" - EtcGMT Timezone = "Etc/GMT" - EtcGMT0 Timezone = "Etc/GMT+0" - EtcGMT1 Timezone = "Etc/GMT+1" - EtcGMT10 Timezone = "Etc/GMT+10" - EtcGMT11 Timezone = "Etc/GMT+11" - EtcGMT12 Timezone = "Etc/GMT+12" - EtcGMT13 Timezone = "Etc/GMT-13" - EtcGMT14 Timezone = "Etc/GMT-14" - EtcGMT2 Timezone = "Etc/GMT+2" - EtcGMT3 Timezone = "Etc/GMT+3" - EtcGMT4 Timezone = "Etc/GMT+4" - EtcGMT5 Timezone = "Etc/GMT+5" - EtcGMT6 Timezone = "Etc/GMT+6" - EtcGMT7 Timezone = "Etc/GMT+7" - EtcGMT8 Timezone = "Etc/GMT+8" - EtcGMT9 Timezone = "Etc/GMT+9" - EtcGreenwich Timezone = "Etc/Greenwich" - EtcUCT Timezone = "Etc/UCT" - EtcUTC Timezone = "Etc/UTC" - EtcUniversal Timezone = "Etc/Universal" - EtcZulu Timezone = "Etc/Zulu" - EuropeAmsterdam Timezone = "Europe/Amsterdam" - EuropeAndorra Timezone = "Europe/Andorra" - EuropeAstrakhan Timezone = "Europe/Astrakhan" - EuropeAthens Timezone = "Europe/Athens" - EuropeBelfast Timezone = "Europe/Belfast" - EuropeBelgrade Timezone = "Europe/Belgrade" - EuropeBerlin Timezone = "Europe/Berlin" - EuropeBratislava Timezone = "Europe/Bratislava" - EuropeBrussels Timezone = "Europe/Brussels" - EuropeBucharest Timezone = "Europe/Bucharest" - EuropeBudapest Timezone = "Europe/Budapest" - EuropeBusingen Timezone = "Europe/Busingen" - EuropeChisinau Timezone = "Europe/Chisinau" - EuropeCopenhagen Timezone = "Europe/Copenhagen" - EuropeDublin Timezone = "Europe/Dublin" - EuropeGibraltar Timezone = "Europe/Gibraltar" - EuropeGuernsey Timezone = "Europe/Guernsey" - EuropeHelsinki Timezone = "Europe/Helsinki" - EuropeIsleOfMan Timezone = "Europe/Isle_of_Man" - EuropeIstanbul Timezone = "Europe/Istanbul" - EuropeJersey Timezone = "Europe/Jersey" - EuropeKaliningrad Timezone = "Europe/Kaliningrad" - EuropeKiev Timezone = "Europe/Kiev" - EuropeKirov Timezone = "Europe/Kirov" - EuropeKyiv Timezone = "Europe/Kyiv" - EuropeLisbon Timezone = "Europe/Lisbon" - EuropeLjubljana Timezone = "Europe/Ljubljana" - EuropeLondon Timezone = "Europe/London" - EuropeLuxembourg Timezone = "Europe/Luxembourg" - EuropeMadrid Timezone = "Europe/Madrid" - EuropeMalta Timezone = "Europe/Malta" - EuropeMariehamn Timezone = "Europe/Mariehamn" - EuropeMinsk Timezone = "Europe/Minsk" - EuropeMonaco Timezone = "Europe/Monaco" - EuropeMoscow Timezone = "Europe/Moscow" - EuropeNicosia Timezone = "Europe/Nicosia" - EuropeOslo Timezone = "Europe/Oslo" - EuropeParis Timezone = "Europe/Paris" - EuropePodgorica Timezone = "Europe/Podgorica" - EuropePrague Timezone = "Europe/Prague" - EuropeRiga Timezone = "Europe/Riga" - EuropeRome Timezone = "Europe/Rome" - EuropeSANMarino Timezone = "Europe/San_Marino" - EuropeSamara Timezone = "Europe/Samara" - EuropeSarajevo Timezone = "Europe/Sarajevo" - EuropeSaratov Timezone = "Europe/Saratov" - EuropeSimferopol Timezone = "Europe/Simferopol" - EuropeSkopje Timezone = "Europe/Skopje" - EuropeSofia Timezone = "Europe/Sofia" - EuropeStockholm Timezone = "Europe/Stockholm" - EuropeTallinn Timezone = "Europe/Tallinn" - EuropeTirane Timezone = "Europe/Tirane" - EuropeTiraspol Timezone = "Europe/Tiraspol" - EuropeUlyanovsk Timezone = "Europe/Ulyanovsk" - EuropeUzhgorod Timezone = "Europe/Uzhgorod" - EuropeVaduz Timezone = "Europe/Vaduz" - EuropeVatican Timezone = "Europe/Vatican" - EuropeVienna Timezone = "Europe/Vienna" - EuropeVilnius Timezone = "Europe/Vilnius" - EuropeVolgograd Timezone = "Europe/Volgograd" - EuropeWarsaw Timezone = "Europe/Warsaw" - EuropeZagreb Timezone = "Europe/Zagreb" - EuropeZaporozhye Timezone = "Europe/Zaporozhye" - EuropeZurich Timezone = "Europe/Zurich" - Factory Timezone = "Factory" - GB Timezone = "GB" - GBEire Timezone = "GB-Eire" - Gmt Timezone = "GMT" - Gmt0 Timezone = "GMT+0" - Greenwich Timezone = "Greenwich" - Hongkong Timezone = "Hongkong" - Hst Timezone = "HST" - Iceland Timezone = "Iceland" - IndianAntananarivo Timezone = "Indian/Antananarivo" - IndianChagos Timezone = "Indian/Chagos" - IndianChristmas Timezone = "Indian/Christmas" - IndianCocos Timezone = "Indian/Cocos" - IndianComoro Timezone = "Indian/Comoro" - IndianKerguelen Timezone = "Indian/Kerguelen" - IndianMahe Timezone = "Indian/Mahe" - IndianMaldives Timezone = "Indian/Maldives" - IndianMauritius Timezone = "Indian/Mauritius" - IndianMayotte Timezone = "Indian/Mayotte" - IndianReunion Timezone = "Indian/Reunion" - Iran Timezone = "Iran" - Israel Timezone = "Israel" - Jamaica Timezone = "Jamaica" - Japan Timezone = "Japan" - Kwajalein Timezone = "Kwajalein" - Libya Timezone = "Libya" - Met Timezone = "MET" - MexicoBajaNorte Timezone = "Mexico/BajaNorte" - MexicoBajaSur Timezone = "Mexico/BajaSur" - MexicoGeneral Timezone = "Mexico/General" - Mst Timezone = "MST" - Mst7Mdt Timezone = "MST7MDT" - Navajo Timezone = "Navajo" - Nz Timezone = "NZ" - NzChat Timezone = "NZ-CHAT" - PacificApia Timezone = "Pacific/Apia" - PacificAuckland Timezone = "Pacific/Auckland" - PacificBougainville Timezone = "Pacific/Bougainville" - PacificChatham Timezone = "Pacific/Chatham" - PacificChuuk Timezone = "Pacific/Chuuk" - PacificEaster Timezone = "Pacific/Easter" - PacificEfate Timezone = "Pacific/Efate" - PacificEnderbury Timezone = "Pacific/Enderbury" - PacificFakaofo Timezone = "Pacific/Fakaofo" - PacificFiji Timezone = "Pacific/Fiji" - PacificFunafuti Timezone = "Pacific/Funafuti" - PacificGalapagos Timezone = "Pacific/Galapagos" - PacificGambier Timezone = "Pacific/Gambier" - PacificGuadalcanal Timezone = "Pacific/Guadalcanal" - PacificGuam Timezone = "Pacific/Guam" - PacificHonolulu Timezone = "Pacific/Honolulu" - PacificJohnston Timezone = "Pacific/Johnston" - PacificKanton Timezone = "Pacific/Kanton" - PacificKiritimati Timezone = "Pacific/Kiritimati" - PacificKosrae Timezone = "Pacific/Kosrae" - PacificKwajalein Timezone = "Pacific/Kwajalein" - PacificMajuro Timezone = "Pacific/Majuro" - PacificMarquesas Timezone = "Pacific/Marquesas" - PacificMidway Timezone = "Pacific/Midway" - PacificNauru Timezone = "Pacific/Nauru" - PacificNiue Timezone = "Pacific/Niue" - PacificNorfolk Timezone = "Pacific/Norfolk" - PacificNoumea Timezone = "Pacific/Noumea" - PacificPagoPago Timezone = "Pacific/Pago_Pago" - PacificPalau Timezone = "Pacific/Palau" - PacificPitcairn Timezone = "Pacific/Pitcairn" - PacificPohnpei Timezone = "Pacific/Pohnpei" - PacificPonape Timezone = "Pacific/Ponape" - PacificPortMoresby Timezone = "Pacific/Port_Moresby" - PacificRarotonga Timezone = "Pacific/Rarotonga" - PacificSaipan Timezone = "Pacific/Saipan" - PacificSamoa Timezone = "Pacific/Samoa" - PacificTahiti Timezone = "Pacific/Tahiti" - PacificTarawa Timezone = "Pacific/Tarawa" - PacificTongatapu Timezone = "Pacific/Tongatapu" - PacificTruk Timezone = "Pacific/Truk" - PacificWake Timezone = "Pacific/Wake" - PacificWallis Timezone = "Pacific/Wallis" - PacificYap Timezone = "Pacific/Yap" - Poland Timezone = "Poland" - Portugal Timezone = "Portugal" - Prc Timezone = "PRC" - Pst8Pdt Timezone = "PST8PDT" - PurpleEtcGMT0 Timezone = "Etc/GMT0" - PurpleGMT0 Timezone = "GMT0" - Roc Timezone = "ROC" - Rok Timezone = "ROK" - Singapore Timezone = "Singapore" - TimezoneEtcGMT0 Timezone = "Etc/GMT-0" - TimezoneEtcGMT1 Timezone = "Etc/GMT-1" - TimezoneEtcGMT10 Timezone = "Etc/GMT-10" - TimezoneEtcGMT11 Timezone = "Etc/GMT-11" - TimezoneEtcGMT12 Timezone = "Etc/GMT-12" - TimezoneEtcGMT2 Timezone = "Etc/GMT-2" - TimezoneEtcGMT3 Timezone = "Etc/GMT-3" - TimezoneEtcGMT4 Timezone = "Etc/GMT-4" - TimezoneEtcGMT5 Timezone = "Etc/GMT-5" - TimezoneEtcGMT6 Timezone = "Etc/GMT-6" - TimezoneEtcGMT7 Timezone = "Etc/GMT-7" - TimezoneEtcGMT8 Timezone = "Etc/GMT-8" - TimezoneEtcGMT9 Timezone = "Etc/GMT-9" - TimezoneGMT0 Timezone = "GMT-0" - Turkey Timezone = "Turkey" - USAlaska Timezone = "US/Alaska" - USAleutian Timezone = "US/Aleutian" - USArizona Timezone = "US/Arizona" - USCentral Timezone = "US/Central" - USEastIndiana Timezone = "US/East-Indiana" - USEastern Timezone = "US/Eastern" - USHawaii Timezone = "US/Hawaii" - USIndianaStarke Timezone = "US/Indiana-Starke" - USMichigan Timezone = "US/Michigan" - USMountain Timezone = "US/Mountain" - USPacific Timezone = "US/Pacific" - USSamoa Timezone = "US/Samoa" - UTC Timezone = "UTC" - Uct Timezone = "UCT" - Universal Timezone = "Universal" - WSu Timezone = "W-SU" - Wet Timezone = "WET" - Zulu Timezone = "Zulu" -) - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/system_pricing_plans/system_pricing_plans.go b/models/golang/v3.1-RC2/system_pricing_plans/system_pricing_plans.go index 3bed3d6d..f96fc53b 100644 --- a/models/golang/v3.1-RC2/system_pricing_plans/system_pricing_plans.go +++ b/models/golang/v3.1-RC2/system_pricing_plans/system_pricing_plans.go @@ -12,40 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// systemPricingPlans, err := UnmarshalSystemPricingPlans(bytes) -// bytes, err = systemPricingPlans.Marshal() - package system_pricing_plans - - -import "encoding/json" - -func UnmarshalSystemPricingPlans(data []byte) (SystemPricingPlans, error) { - var r SystemPricingPlans - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *SystemPricingPlans) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + system_pricing_plans_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/system_pricing_plans" +) // Describes the pricing schemes of the system. type SystemPricingPlans struct { - // Array that contains one object per plan as defined below. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + system_pricing_plans_v30.SystemPricingPlans + // Array that contains one object per plan as defined below. + Data Data `json:"data"` } // Array that contains one object per plan as defined below. @@ -54,91 +31,27 @@ type Data struct { } type Plan struct { - // Currency used to pay the fare in ISO 4217 code. - Currency string `json:"currency"` - // Customer-readable description of the pricing plan. - Description []Description `json:"description"` - // Object defining a capped fare once a price threshold has been spent within a timeframe. - // (added in v3.1-RC2) - FareCapping *FareCapping `json:"fare_capping,omitempty"` - // Will additional tax be added to the base price? - IsTaxable bool `json:"is_taxable"` - // Name of this pricing plan. - Name []Name `json:"name"` - // Array of segments when the price is a function of distance travelled, displayed in - // kilometers (added in v2.1-RC2). - PerKMPricing []PerKMPricing `json:"per_km_pricing,omitempty"` - // Array of segments when the price is a function of time travelled, displayed in minutes - // (added in v2.1-RC2). - PerMinPricing []PerMinPricing `json:"per_min_pricing,omitempty"` - // Identifier of a pricing plan in the system. - PlanID string `json:"plan_id"` - // Fare price. - Price float64 `json:"price"` - // The cost, described as a flat rate, to reserve the vehicle prior to beginning a rental. - ReservationPriceFlatRate *float64 `json:"reservation_price_flat_rate,omitempty"` - // The cost, described as per minute rate, to reserve the vehicle prior to beginning a - // rental. - ReservationPricePerMin *float64 `json:"reservation_price_per_min,omitempty"` - // Is there currently an increase in price in response to increased demand in this pricing - // plan? (added in v2.1-RC2) - SurgePricing *bool `json:"surge_pricing,omitempty"` - // URL where the customer can learn more about this pricing plan. - URL *string `json:"url,omitempty"` -} - -type Description struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` + system_pricing_plans_v30.Plan + //The cost, described as per minute rate, to reserve the vehicle prior to beginning a rental. + // This amount is charged for each minute of the vehicle reservation until the rental is initiated, + // or until the number of minutes defined in vehicle_types.json#default_reserve_time elapses, + // whichever comes first. When using this field, you MUST declare a value in vehicle_types.json#default_reserve_time. + // This field MUST NOT be combined in a single pricing plan with reservation_price_flat_rate. + Reservation_price_per_min *float64 `json:"reservation_price_per_min,omitempty"` + // The cost, described as a flat rate, to reserve the vehicle prior to beginning a rental. + // This amount is charged once to reserve the vehicle for the duration of the time defined by + // vehicle_types.json#default_reserve_time. When using this field, you MUST declare a value in + // vehicle_types.json#default_reserve_time. This field MUST NOT be combined in a single pricing + // plan with reservation_price_per_min. + Reservation_price_flat_rate *float64 `json:"reservation_price_flat_rate,omitempty"` + // Object defining a capped fare once a price threshold has been spent within a timeframe. + // The same fare cap applies to each subsequent timeframe. For example, a fare capped at 15.00 CAD per 12-hour period. + Fare_capping *FareCapping `json:"fare_capping,omitempty"` } -// Object defining a capped fare once a price threshold has been spent within a timeframe. -// (added in v3.1-RC2) type FareCapping struct { - // Amount of time in minutes during which the fare is capped. - Duration int64 `json:"duration"` - // The maximum fare threshold for the current timeframe, in the unit specified by currency - Price float64 `json:"price"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type PerKMPricing struct { - // The kilometer at which the rate will no longer apply (added in v2.1-RC2). - End *int64 `json:"end,omitempty"` - // Interval in kilometers at which the rate of this segment is either reapplied - // indefinitely, or if defined, up until (but not including) end kilometer (added in - // v2.1-RC2). - Interval int64 `json:"interval"` - // Rate that is charged for each kilometer interval after the start (added in v2.1-RC2). - Rate float64 `json:"rate"` - // Number of kilometers that have to elapse before this segment starts applying (added in - // v2.1-RC2). - Start int64 `json:"start"` + // Amount of time in minutes during which the fare is capped. + Duration uint64 `json:"duration"` + // The maximum fare threshold for the current timeframe, in the unit specified by currency. + Price float64 `json:"price"` } - -type PerMinPricing struct { - // The minute at which the rate will no longer apply (added in v2.1-RC2). - End *int64 `json:"end,omitempty"` - // Interval in minutes at which the rate of this segment is either reapplied (added in - // v2.1-RC2). - Interval int64 `json:"interval"` - // Rate that is charged for each minute interval after the start (added in v2.1-RC2). - Rate float64 `json:"rate"` - // Number of minutes that have to elapse before this segment starts applying (added in - // v2.1-RC2). - Start int64 `json:"start"` -} - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/system_regions/system_regions.go b/models/golang/v3.1-RC2/system_regions/system_regions.go index 4ee89062..af5983b8 100644 --- a/models/golang/v3.1-RC2/system_regions/system_regions.go +++ b/models/golang/v3.1-RC2/system_regions/system_regions.go @@ -12,64 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// systemRegions, err := UnmarshalSystemRegions(bytes) -// bytes, err = systemRegions.Marshal() - package system_regions - - -import "encoding/json" - -func UnmarshalSystemRegions(data []byte) (SystemRegions, error) { - var r SystemRegions - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *SystemRegions) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + system_regions_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/system_regions" +) // Describes regions for a system that is broken up by geographic or political region. type SystemRegions struct { - // Describe regions for a system that is broken up by geographic or political region. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + system_regions_v30.SystemRegions } - -// Describe regions for a system that is broken up by geographic or political region. -type Data struct { - // Array of regions. - Regions []Region `json:"regions"` -} - -type Region struct { - // Public name for this region. - Name []Name `json:"name"` - // identifier of the region. - RegionID string `json:"region_id"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/vehicle_availability/vehicle_availability.go b/models/golang/v3.1-RC2/vehicle_availability/vehicle_availability.go index 3dd9b751..c9eaa708 100644 --- a/models/golang/v3.1-RC2/vehicle_availability/vehicle_availability.go +++ b/models/golang/v3.1-RC2/vehicle_availability/vehicle_availability.go @@ -1,81 +1,47 @@ -// Copyright 2025 MobilityData -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +package vehicleavailability -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// vehicleAvailability, err := UnmarshalVehicleAvailability(bytes) -// bytes, err = vehicleAvailability.Marshal() -package vehicle_availability - - - -import "encoding/json" - -func UnmarshalVehicleAvailability(data []byte) (VehicleAvailability, error) { - var r VehicleAvailability - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *VehicleAvailability) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + "github.com/MobilityData/gbfs-json-schema/models/golang/common" + "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/header" +) -// Describes the vehicle availabilities of the system. +// Describes the capacity and rental availability of the station type VehicleAvailability struct { - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` + header.HeaderStruct + + // Array that contains one object per station as defined below. + Data Data `json:"data"` } +// Array that contains one object per station as defined below. type Data struct { - // Contains one object per vehicle. - Vehicles []Vehicle `json:"vehicles"` + Vehicles []Vehicle `json:"vehicles"` } type Vehicle struct { - // Array of time slots during which the specified vehicle is available. - Availabilities []Availability `json:"availabilities"` - // The plan_id of the pricing plan this vehicle is eligible for - PricingPlanID *string `json:"pricing_plan_id,omitempty"` - // The id of the station where this vehicle is located when available - StationID string `json:"station_id"` - // List of vehicle equipment provided by the operator - VehicleEquipment []string `json:"vehicle_equipment,omitempty"` - // Identifier of a vehicle - VehicleID string `json:"vehicle_id"` - // Unique identifier of a vehicle type as defined in vehicle_types.json - VehicleTypeID string `json:"vehicle_type_id"` + // Identifier of a vehicle. The vehicle_id identifier MUST be rotated to a random string after each trip to protect user privacy (as of v2.0). + // Use of persistent vehicle IDs poses a threat to user privacy. The vehicle_id identifier SHOULD only be rotated once per trip. + // The vehicle_id SHOULD be the same as in vehicle_status.json if the file has been defined and the vehicle is currently available. + VehicleID common.ID `json:"vehicle_id"` + // Unique identifier of a vehicle type as defined in vehicle_types.json. + VehicleTypeID common.ID `json:"vehicle_type_id"` + // The station_id of the station where this vehicle is located when available as defined in station_information.json. + StationID common.ID `json:"station_id"` + // The plan_id of the pricing plan this vehicle is eligible for as described in system_pricing_plans.json. + // If this field is defined it supersedes default_pricing_plan_id in vehicle_types.json. + // This field SHOULD be used to override default_pricing_plan_id in vehicle_types.json to define pricing plans for individual vehicles when necessary. + PricingPlanID *common.ID `json:"pricing_plan_id,omitempty"` + // List of vehicle equipment provided by the operator in addition to the accessories already provided in the vehicle + // (field vehicle_accessories of vehicle_types.json) but subject to more frequent updates. + VehicleEquipment []*common.VehicleEquipment `json:"vehicle_equipment,omitempty"` + // Array of time slots during which the specified vehicle is available. + Availabilities []Availability `json:"availabilities"` } type Availability struct { - // Start date and time of available time slot. - From string `json:"from"` - // End date and time of available time slot. - Until *string `json:"until,omitempty"` + // Start date and time of available time slot. + From common.DateTime `json:"from"` + // End date and time of available time slot. If this field is empty, it means that the vehicle is available all the time from the date in the from field. + Until *common.DateTime `json:"until,omitempty"` } - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/vehicle_status/vehicle_status.go b/models/golang/v3.1-RC2/vehicle_status/vehicle_status.go index 291d603a..e9b517ac 100644 --- a/models/golang/v3.1-RC2/vehicle_status/vehicle_status.go +++ b/models/golang/v3.1-RC2/vehicle_status/vehicle_status.go @@ -12,111 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// vehicleStatus, err := UnmarshalVehicleStatus(bytes) -// bytes, err = vehicleStatus.Marshal() - package vehicle_status - - -import "encoding/json" - -func UnmarshalVehicleStatus(data []byte) (VehicleStatus, error) { - var r VehicleStatus - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *VehicleStatus) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + vehicle_status_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/vehicle_status" +) // Describes the vehicles that are available for rent (as of v3.0, formerly // free_bike_status). type VehicleStatus struct { - // Array that contains one object per vehicle as defined below. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework - // (added in v1.1). - Version Version `json:"version"` -} - -// Array that contains one object per vehicle as defined below. -type Data struct { - Vehicles []Vehicle `json:"vehicles"` + vehicle_status_v30.VehicleStatus } - -type Vehicle struct { - // The date and time when any rental of the vehicle must be completed. Added in v2.3. - AvailableUntil *string `json:"available_until,omitempty"` - // This value represents the current percentage, expressed from 0 to 1, of fuel or battery - // power remaining in the vehicle. Added in v2.3-RC. - CurrentFuelPercent *float64 `json:"current_fuel_percent,omitempty"` - // The furthest distance in meters that the vehicle can travel without recharging or - // refueling with the vehicle's current charge or fuel (added in v2.1-RC). - CurrentRangeMeters *float64 `json:"current_range_meters,omitempty"` - // The station_id of the station this vehicle must be returned to (added in v2.3-RC). - HomeStationID *string `json:"home_station_id,omitempty"` - // Is the vehicle currently disabled (broken)? - IsDisabled bool `json:"is_disabled"` - // Is the vehicle currently reserved? - IsReserved bool `json:"is_reserved"` - // The last time this vehicle reported its status to the operator's backend in RFC3339 - // format (added in v2.1-RC). - LastReported *string `json:"last_reported,omitempty"` - // The latitude of the vehicle. - Lat *float64 `json:"lat,omitempty"` - // The longitude of the vehicle. - Lon *float64 `json:"lon,omitempty"` - // The plan_id of the pricing plan this vehicle is eligible for (added in v2.2). - PricingPlanID *string `json:"pricing_plan_id,omitempty"` - // Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added - // in v1.1). - RentalUris *RentalUris `json:"rental_uris,omitempty"` - // Identifier referencing the station_id if the vehicle is currently at a station (added in - // v2.1-RC2). - StationID *string `json:"station_id,omitempty"` - // List of vehicle equipment provided by the operator in addition to the accessories already - // provided in the vehicle. Added in v2.3. - VehicleEquipment []VehicleEquipment `json:"vehicle_equipment,omitempty"` - // Rotating (as of v2.0) identifier of a vehicle. - VehicleID string `json:"vehicle_id"` - // The vehicle_type_id of this vehicle (added in v2.1-RC). - VehicleTypeID *string `json:"vehicle_type_id,omitempty"` -} - -// Contains rental uris for Android, iOS, and web in the android, ios, and web fields (added -// in v1.1). -type RentalUris struct { - // URI that can be passed to an Android app with an intent (added in v1.1). - Android *string `json:"android,omitempty"` - // URI that can be used on iOS to launch the rental app for this vehicle (added in v1.1). - Ios *string `json:"ios,omitempty"` - // URL that can be used by a web browser to show more information about renting this vehicle - // (added in v1.1). - Web *string `json:"web,omitempty"` -} - -type VehicleEquipment string - -const ( - ChildSeatA VehicleEquipment = "child_seat_a" - ChildSeatB VehicleEquipment = "child_seat_b" - ChildSeatC VehicleEquipment = "child_seat_c" - SnowChains VehicleEquipment = "snow_chains" - WinterTires VehicleEquipment = "winter_tires" -) - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/golang/v3.1-RC2/vehicle_types/vehicle_types.go b/models/golang/v3.1-RC2/vehicle_types/vehicle_types.go index ac6d060e..10d289d1 100644 --- a/models/golang/v3.1-RC2/vehicle_types/vehicle_types.go +++ b/models/golang/v3.1-RC2/vehicle_types/vehicle_types.go @@ -12,213 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Code generated from JSON Schema using quicktype. DO NOT EDIT. -// To parse and unparse this JSON data, add this code to your project and do: -// -// vehicleTypes, err := UnmarshalVehicleTypes(bytes) -// bytes, err = vehicleTypes.Marshal() - package vehicle_types - - -import "encoding/json" - -func UnmarshalVehicleTypes(data []byte) (VehicleTypes, error) { - var r VehicleTypes - err := json.Unmarshal(data, &r) - return r, err -} - -func (r *VehicleTypes) Marshal() ([]byte, error) { - return json.Marshal(r) -} +import ( + vehicle_types_v30 "github.com/MobilityData/gbfs-json-schema/models/golang/v3.0/vehicle_types" +) // Describes the types of vehicles that System operator has available for rent (added in // v2.1-RC). type VehicleTypes struct { - // Response data in the form of name:value pairs. - Data Data `json:"data"` - // Last time the data in the feed was updated in RFC3339 format. - LastUpdated string `json:"last_updated"` - // Number of seconds before the data in the feed will be updated again (0 if the data should - // always be refreshed). - TTL int64 `json:"ttl"` - // GBFS version number to which the feed conforms, according to the versioning framework. - Version Version `json:"version"` -} - -// Response data in the form of name:value pairs. -type Data struct { - // Array that contains one object per vehicle type in the system as defined below. - VehicleTypes []VehicleType `json:"vehicle_types"` -} - -type VehicleType struct { - // The capacity of the vehicle cargo space (excluding passengers), expressed in kilograms. - CargoLoadCapacity *int64 `json:"cargo_load_capacity,omitempty"` - // Cargo volume available in the vehicle, expressed in liters. - CargoVolumeCapacity *int64 `json:"cargo_volume_capacity,omitempty"` - // The color of the vehicle. Added in v2.3 - Color *string `json:"color,omitempty"` - // A plan_id as defined in system_pricing_plans.json added in v2.3-RC. - DefaultPricingPlanID *string `json:"default_pricing_plan_id,omitempty"` - // Maximum time in minutes that a vehicle can be reserved before a rental begins added in - // v2.3-RC. - DefaultReserveTime *int64 `json:"default_reserve_time,omitempty"` - // Customer-readable description of the vehicle type outlining special features or how-tos. - // An array with one object per supported language with the following keys: - Description []Description `json:"description,omitempty"` - // Vehicle air quality certificate. added in v2.3. - EcoLabels []EcoLabel `json:"eco_labels,omitempty"` - // The vehicle's general form factor. - FormFactor FormFactor `json:"form_factor"` - // Maximum quantity of CO2, in grams, emitted per kilometer, according to the WLTP. Added in - // v2.3 - GCO2KM *int64 `json:"g_CO2_km,omitempty"` - // The name of the vehicle manufacturer. An array with one object per supported language - // with the following keys: - Make []Make `json:"make,omitempty"` - // The maximum speed in kilometers per hour this vehicle is permitted to reach in accordance - // with local permit and regulations. Added in v2.3 - MaxPermittedSpeed *int64 `json:"max_permitted_speed,omitempty"` - // The furthest distance in meters that the vehicle can travel without recharging or - // refueling when it has the maximum amount of energy potential. - MaxRangeMeters *float64 `json:"max_range_meters,omitempty"` - // The name of the vehicle model. An array with one object per supported language with the - // following keys: - Model []Model `json:"model,omitempty"` - // The public name of this vehicle type. An array with one object per supported language - // with the following keys: - Name []Name `json:"name,omitempty"` - // Array of all pricing plan IDs as defined in system_pricing_plans.json added in v2.3-RC. - PricingPlanIDS []string `json:"pricing_plan_ids,omitempty"` - // The primary propulsion type of the vehicle. Updated in v2.3 to represent car-sharing - PropulsionType PropulsionType `json:"propulsion_type"` - // The rated power of the motor for this vehicle type in watts. Added in v2.3 - RatedPower *int64 `json:"rated_power,omitempty"` - // The conditions for returning the vehicle at the end of the trip. Added in v2.3-RC as - // return_type, and updated to return_constraint in v2.3. - ReturnConstraint *ReturnConstraint `json:"return_constraint,omitempty"` - // The number of riders (driver included) the vehicle can legally accommodate - RiderCapacity *int64 `json:"rider_capacity,omitempty"` - // Description of accessories available in the vehicle. - VehicleAccessories []VehicleAccessory `json:"vehicle_accessories,omitempty"` - // An object where each key defines one of the items listed below added in v2.3-RC. - VehicleAssets *VehicleAssets `json:"vehicle_assets,omitempty"` - // URL to an image that would assist the user in identifying the vehicle. JPEG or PNG. Added - // in v2.3 - VehicleImage *string `json:"vehicle_image,omitempty"` - // Unique identifier of a vehicle type. - VehicleTypeID string `json:"vehicle_type_id"` - // Number of wheels this vehicle type has. Added in v2.3 - WheelCount *int64 `json:"wheel_count,omitempty"` -} - -type Description struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type EcoLabel struct { - // Country code following the ISO 3166-1 alpha-2 notation. Added in v2.3. - CountryCode string `json:"country_code"` - // Name of the eco label. Added in v2.3. - EcoSticker string `json:"eco_sticker"` -} - -type Make struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Model struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -type Name struct { - // IETF BCP 47 language code. - Language string `json:"language"` - // The translated text. - Text string `json:"text"` -} - -// An object where each key defines one of the items listed below added in v2.3-RC. -type VehicleAssets struct { - // Date that indicates the last time any included vehicle icon images were modified or - // updated added in v2.3-RC. - IconLastModified string `json:"icon_last_modified"` - // A fully qualified URL pointing to the location of a graphic icon file that MAY be used to - // represent this vehicle type on maps and in other applications added in v2.3-RC. - IconURL string `json:"icon_url"` - // A fully qualified URL pointing to the location of a graphic icon file to be used to - // represent this vehicle type when in dark mode added in v2.3-RC. - IconURLDark *string `json:"icon_url_dark,omitempty"` + vehicle_types_v30.VehicleTypes } - -// The vehicle's general form factor. -type FormFactor string - -const ( - Bicycle FormFactor = "bicycle" - Car FormFactor = "car" - CargoBicycle FormFactor = "cargo_bicycle" - Moped FormFactor = "moped" - Other FormFactor = "other" - Scooter FormFactor = "scooter" - ScooterSeated FormFactor = "scooter_seated" - ScooterStanding FormFactor = "scooter_standing" -) - -// The primary propulsion type of the vehicle. Updated in v2.3 to represent car-sharing -type PropulsionType string - -const ( - Combustion PropulsionType = "combustion" - CombustionDiesel PropulsionType = "combustion_diesel" - Electric PropulsionType = "electric" - ElectricAssist PropulsionType = "electric_assist" - Human PropulsionType = "human" - HydrogenFuelCell PropulsionType = "hydrogen_fuel_cell" - PlugInHybrid PropulsionType = "plug_in_hybrid" - PropulsionTypeHybrid PropulsionType = "hybrid" -) - -// The conditions for returning the vehicle at the end of the trip. Added in v2.3-RC as -// return_type, and updated to return_constraint in v2.3. -type ReturnConstraint string - -const ( - AnyStation ReturnConstraint = "any_station" - FreeFloating ReturnConstraint = "free_floating" - ReturnConstraintHybrid ReturnConstraint = "hybrid" - RoundtripStation ReturnConstraint = "roundtrip_station" -) - -type VehicleAccessory string - -const ( - AirConditioning VehicleAccessory = "air_conditioning" - Automatic VehicleAccessory = "automatic" - Convertible VehicleAccessory = "convertible" - CruiseControl VehicleAccessory = "cruise_control" - Doors2 VehicleAccessory = "doors_2" - Doors3 VehicleAccessory = "doors_3" - Doors4 VehicleAccessory = "doors_4" - Doors5 VehicleAccessory = "doors_5" - Manual VehicleAccessory = "manual" - Navigation VehicleAccessory = "navigation" -) - -type Version string - -const ( - The31Rc2 Version = "3.1-RC2" -) diff --git a/models/typescript/.gitignore b/models/typescript/.gitignore index 488573c6..bb7df91e 100644 --- a/models/typescript/.gitignore +++ b/models/typescript/.gitignore @@ -4,3 +4,5 @@ v3.0/* !v3.0/index.d.ts v3.1-RC/* !v3.1-RC/index.d.ts +v3.1-RC2/* +!v3.1-RC2/index.d.ts diff --git a/models/typescript/README.md b/models/typescript/README.md index d7e1b57e..94ce40e7 100644 --- a/models/typescript/README.md +++ b/models/typescript/README.md @@ -16,7 +16,7 @@ npm install gbfs-typescript-types --save-dev ## Versions - v2.3 - v3.0 -- v3.1-RC +- v3.1-RC2 ## Example Code ```typescript diff --git a/models/typescript/index.d.ts b/models/typescript/index.d.ts index 82a24772..10e8242e 100644 --- a/models/typescript/index.d.ts +++ b/models/typescript/index.d.ts @@ -1,3 +1,4 @@ export * as v23 from "./v2.3"; export * as v3 from "./v3.0"; export * as v31rc from "./v3.1-RC"; +export * as v31rc2 from "./v3.1-RC2"; diff --git a/models/typescript/package.json b/models/typescript/package.json index 9227885d..406b1ddc 100644 --- a/models/typescript/package.json +++ b/models/typescript/package.json @@ -1,6 +1,6 @@ { "name": "gbfs-typescript-types", - "version": "1.0.11", + "version": "1.0.12", "description": "Language Bindings for GBFS in Typescript.", "keywords": [ "gbfs", diff --git a/models/typescript/tests/v2.3.spec.ts b/models/typescript/tests/v2.3.spec.ts index 28cfbedc..c178c9bc 100644 --- a/models/typescript/tests/v2.3.spec.ts +++ b/models/typescript/tests/v2.3.spec.ts @@ -31,17 +31,20 @@ const { SystemRegions } = createCheckers(SystemRegionsTI); const { VehicleTypes } = createCheckers(VehicleTypesTI); // json test data: these are gbfs with no errors for v2.3 -import freeBikeStatusJson from "../../../testFixtures/v2.3/free_bike_status.json"; +import freeBikeStatusCarsharingJson from "../../../testFixtures/v2.3/free_bike_status_carsharing.json"; +import freeBikeStatusMicromobilityJson from "../../../testFixtures/v2.3/free_bike_status_micromobility.json"; import gbfsVersionsJson from "../../../testFixtures/v2.3/gbfs_versions.json"; import gbfsJson from "../../../testFixtures/v2.3/gbfs.json"; import geofencingZonesJson from "../../../testFixtures/v2.3/geofencing_zones.json"; -import stationInformationJson from "../../../testFixtures/v2.3/station_information.json"; +import stationInformationPhysicalStationJson from "../../../testFixtures/v2.3/station_information_physical_station.json"; +import stationInformationVirtualStationJson from "../../../testFixtures/v2.3/station_information_virtual_station.json"; import stationStatusJson from "../../../testFixtures/v2.3/station_status.json"; import systemAlertsJson from "../../../testFixtures/v2.3/system_alerts.json"; import systemCalendarJson from "../../../testFixtures/v2.3/system_calendar.json"; import systemHoursJson from "../../../testFixtures/v2.3/system_hours.json"; import systemInformationJson from "../../../testFixtures/v2.3/system_information.json"; -import systemPricingPlansJson from "../../../testFixtures/v2.3/system_pricing_plans.json"; +import systemPricingPlansAJson from "../../../testFixtures/v2.3/system_pricing_plans_a.json"; +import systemPricingPlansBJson from "../../../testFixtures/v2.3/system_pricing_plans_b.json"; import systemRegionsJson from "../../../testFixtures/v2.3/system_regions.json"; import vehicleTypesJson from "../../../testFixtures/v2.3/vehicle_types.json"; @@ -68,7 +71,13 @@ describe("GBFS Validator v2.3", () => { it("should check if station_information is valid", () => { expect(() => { - StationInformation.check(stationInformationJson); + StationInformation.check(stationInformationPhysicalStationJson); + }).not.toThrow(); + }); + + it("should check if station_information is valid", () => { + expect(() => { + StationInformation.check(stationInformationVirtualStationJson); }).not.toThrow(); }); @@ -104,7 +113,13 @@ describe("GBFS Validator v2.3", () => { it("should check if system_pricing_plans is valid", () => { expect(() => { - SystemPricingPlans.check(systemPricingPlansJson); + SystemPricingPlans.check(systemPricingPlansAJson); + }).not.toThrow(); + }); + + it("should check if system_pricing_plans is valid", () => { + expect(() => { + SystemPricingPlans.check(systemPricingPlansBJson); }).not.toThrow(); }); @@ -116,7 +131,13 @@ describe("GBFS Validator v2.3", () => { it("should check if vehicle_status is valida", () => { expect(() => { - FreeBikeStatus.check(freeBikeStatusJson); + FreeBikeStatus.check(freeBikeStatusMicromobilityJson); + }).not.toThrow(); + }); + + it("should check if vehicle_status is valid", () => { + expect(() => { + FreeBikeStatus.check(freeBikeStatusCarsharingJson); }).not.toThrow(); }); diff --git a/models/typescript/tests/v3.0.spec.ts b/models/typescript/tests/v3.0.spec.ts index 07a0a2bb..dd5e33f2 100644 --- a/models/typescript/tests/v3.0.spec.ts +++ b/models/typescript/tests/v3.0.spec.ts @@ -33,13 +33,16 @@ import gbfsVersionsJson from '../../../testFixtures/v3.0/gbfs_versions.json'; import gbfsJson from '../../../testFixtures/v3.0/gbfs.json'; import geofencingZonesJson from '../../../testFixtures/v3.0/geofencing_zones.json'; import manifestJson from '../../../testFixtures/v3.0/manifest.json'; -import stationInformationJson from '../../../testFixtures/v3.0/station_information.json'; +import stationInformationPhysicalStationLimitedHoursOfOperationJson from '../../../testFixtures/v3.0/station_information_physical_station_limited_hours_of_operation.json'; +import stationInformationVirtualStationJson from '../../../testFixtures/v3.0/station_information_virtual_station.json'; import stationStatusJson from '../../../testFixtures/v3.0/station_status.json'; import systemAlertsJson from '../../../testFixtures/v3.0/system_alerts.json'; import systemInformationJson from '../../../testFixtures/v3.0/system_information.json'; -import systemPricingPlansJson from '../../../testFixtures/v3.0/system_pricing_plans.json'; +import systemPricingPlansAJson from '../../../testFixtures/v3.0/system_pricing_plans_a.json'; +import systemPricingPlansBJson from '../../../testFixtures/v3.0/system_pricing_plans_b.json'; import systemRegionsJson from '../../../testFixtures/v3.0/system_regions.json'; -import vehicleStatusJson from '../../../testFixtures/v3.0/vehicle_status.json'; +import vehicleStatusCarsharingJson from '../../../testFixtures/v3.0/vehicle_status_carsharing.json'; +import vehicleStatusMicromobilityJson from '../../../testFixtures/v3.0/vehicle_status_micromobility.json'; import vehicleTypesJson from '../../../testFixtures/v3.0/vehicle_types.json'; // Date objects cannot be represented in JSON @@ -71,7 +74,13 @@ describe('GBFS Validator v3.0', () => { it('should check if station_information is valid', () => { expect(() => { - StationInformation.check(stationInformationJson); + StationInformation.check(stationInformationPhysicalStationLimitedHoursOfOperationJson); + }).not.toThrow(); + }); + + it('should check if station_information is valid', () => { + expect(() => { + StationInformation.check(stationInformationVirtualStationJson); }).not.toThrow(); }); @@ -95,7 +104,13 @@ describe('GBFS Validator v3.0', () => { it('should check if system_pricing_plans is valid', () => { expect(() => { - SystemPricingPlans.check(systemPricingPlansJson); + SystemPricingPlans.check(systemPricingPlansAJson); + }).not.toThrow(); + }); + + it('should check if system_pricing_plans is valid', () => { + expect(() => { + SystemPricingPlans.check(systemPricingPlansBJson); }).not.toThrow(); }); @@ -105,9 +120,15 @@ describe('GBFS Validator v3.0', () => { }).not.toThrow(); }); - it('should check if vehicle_status is valida', () => { + it('should check if vehicle_status is valid', () => { + expect(() => { + VehicleStatus.check(vehicleStatusMicromobilityJson); + }).not.toThrow(); + }); + + it('should check if vehicle_status is valid', () => { expect(() => { - VehicleStatus.check(vehicleStatusJson); + VehicleStatus.check(vehicleStatusCarsharingJson); }).not.toThrow(); }); diff --git a/models/typescript/tests/v3.1-RC.spec.ts b/models/typescript/tests/v3.1-RC.spec.ts deleted file mode 100644 index 16755c9e..00000000 --- a/models/typescript/tests/v3.1-RC.spec.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { createCheckers } from "ts-interface-checker"; - -// checker model -import GbfsVersionsTI from '../v3.1-RC/test-type-checkers/gbfs_versions-ti'; -import GbfsTI from '../v3.1-RC/test-type-checkers/gbfs-ti'; -import GeofencingZonesTI from '../v3.1-RC/test-type-checkers/geofencing_zones-ti'; -import ManifestTI from '../v3.1-RC/test-type-checkers/manifest-ti'; -import StationsInformationTI from '../v3.1-RC/test-type-checkers/station_information-ti'; -import StationStatusTI from '../v3.1-RC/test-type-checkers/station_status-ti'; -import SystemAlertsTI from "../v3.1-RC/test-type-checkers/system_alerts-ti"; -import SystemInformationTI from '../v3.1-RC/test-type-checkers/system_information-ti'; -import SystemPricingPlansTI from '../v3.1-RC/test-type-checkers/system_pricing_plans-ti' -import SystemRegionsTI from "../v3.1-RC/test-type-checkers/system_regions-ti"; -import VehicleStatusTI from "../v3.1-RC/test-type-checkers/vehicle_status-ti"; -import VehicleTypesTI from '../v3.1-RC/test-type-checkers/vehicle_types-ti'; - -// checkers -const { GbfsVersions } = createCheckers(GbfsVersionsTI); -const { Gbfs } = createCheckers(GbfsTI); -const { GeofencingZones } = createCheckers(GeofencingZonesTI); -const { Manifest } = createCheckers(ManifestTI); -const { StationInformation } = createCheckers(StationsInformationTI); -const { StationStatus } = createCheckers(StationStatusTI); -const { SystemAlerts } = createCheckers(SystemAlertsTI); -const { SystemInformation } = createCheckers(SystemInformationTI); -const { SystemPricingPlans } = createCheckers(SystemPricingPlansTI); -const { SystemRegions } = createCheckers(SystemRegionsTI); -const { VehicleStatus } = createCheckers(VehicleStatusTI); -const { VehicleTypes } = createCheckers(VehicleTypesTI); - -// json test data: these are gbfs with no errors for v3.1-RC -import gbfsVersionsJson from '../../../testFixtures/v3.1-RC/gbfs_versions.json'; -import gbfsJson from '../../../testFixtures/v3.1-RC/gbfs.json'; -import geofencingZonesJson from '../../../testFixtures/v3.1-RC/geofencing_zones.json'; -import manifestJson from '../../../testFixtures/v3.1-RC/manifest.json'; -import stationInformationJson from '../../../testFixtures/v3.1-RC/station_information.json'; -import stationStatusJson from '../../../testFixtures/v3.1-RC/station_status.json'; -import systemAlertsJson from '../../../testFixtures/v3.1-RC/system_alerts.json'; -import systemInformationJson from '../../../testFixtures/v3.1-RC/system_information.json'; -import systemPricingPlansJson from '../../../testFixtures/v3.1-RC/system_pricing_plans.json'; -import systemRegionsJson from '../../../testFixtures/v3.1-RC/system_regions.json'; -import vehicleStatusJson from '../../../testFixtures/v3.1-RC/vehicle_status.json'; -import vehicleTypesJson from '../../../testFixtures/v3.1-RC/vehicle_types.json'; - -// Date objects cannot be represented in JSON -// Manual checks for dates are required -describe('GBFS Validator v3.1-RC', () => { - it('should check if gbfs_versions is valid', () => { - expect(() => { - GbfsVersions.check(gbfsVersionsJson); - }).not.toThrow(); - }); - - it('should check if gbfs is valid', () => { - expect(() => { - Gbfs.check(gbfsJson); - }).not.toThrow(); - }); - - it('should check if geofencing_zones is valid', () => { - expect(() => { - GeofencingZones.check(geofencingZonesJson); - }).not.toThrow(); - }); - - it('should check if manifest is valid', () => { - expect(() => { - Manifest.check(manifestJson); - }).not.toThrow(); - }); - - it('should check if station_information is valid', () => { - expect(() => { - StationInformation.check(stationInformationJson); - }).not.toThrow(); - }); - - it('should check if station_status is valid', () => { - expect(() => { - StationStatus.check(stationStatusJson); - }).not.toThrow(); - }); - - it('should check if system_alerts is valid', () => { - expect(() => { - SystemAlerts.check(systemAlertsJson); - }).not.toThrow(); - }); - - it('should check if system_information is valid', () => { - expect(() => { - SystemInformation.check(systemInformationJson); - }).not.toThrow(); - }); - - it('should check if system_pricing_plans is valid', () => { - expect(() => { - SystemPricingPlans.check(systemPricingPlansJson); - }).not.toThrow(); - }); - - it('should check if system_regions is valid', () => { - expect(() => { - SystemRegions.check(systemRegionsJson); - }).not.toThrow(); - }); - - it('should check if vehicle_status is valida', () => { - expect(() => { - VehicleStatus.check(vehicleStatusJson); - }).not.toThrow(); - }); - - it('should check if vehicle_types is valid', () => { - expect(() => { - VehicleTypes.check(vehicleTypesJson); - }).not.toThrow(); - }); -}); \ No newline at end of file diff --git a/models/typescript/tests/v3.1-RC2.spec.ts b/models/typescript/tests/v3.1-RC2.spec.ts new file mode 100644 index 00000000..62cd63e1 --- /dev/null +++ b/models/typescript/tests/v3.1-RC2.spec.ts @@ -0,0 +1,149 @@ +import { createCheckers } from "ts-interface-checker"; + +// checker model +import GbfsVersionsTI from '../v3.1-RC2/test-type-checkers/gbfs_versions-ti'; +import GbfsTI from '../v3.1-RC2/test-type-checkers/gbfs-ti'; +import GeofencingZonesTI from '../v3.1-RC2/test-type-checkers/geofencing_zones-ti'; +import ManifestTI from '../v3.1-RC2/test-type-checkers/manifest-ti'; +import StationsInformationTI from '../v3.1-RC2/test-type-checkers/station_information-ti'; +import StationStatusTI from '../v3.1-RC2/test-type-checkers/station_status-ti'; +import SystemAlertsTI from "../v3.1-RC2/test-type-checkers/system_alerts-ti"; +import SystemInformationTI from '../v3.1-RC2/test-type-checkers/system_information-ti'; +import SystemPricingPlansTI from '../v3.1-RC2/test-type-checkers/system_pricing_plans-ti' +import SystemRegionsTI from "../v3.1-RC2/test-type-checkers/system_regions-ti"; +import VehicleStatusTI from "../v3.1-RC2/test-type-checkers/vehicle_status-ti"; +import VehicleTypesTI from '../v3.1-RC2/test-type-checkers/vehicle_types-ti'; +import VehicleAvailabilityTI from '../v3.1-RC2/test-type-checkers/vehicle_availability-ti'; + +// checkers +const { GbfsVersions } = createCheckers(GbfsVersionsTI); +const { Gbfs } = createCheckers(GbfsTI); +const { GeofencingZones } = createCheckers(GeofencingZonesTI); +const { Manifest } = createCheckers(ManifestTI); +const { StationInformation } = createCheckers(StationsInformationTI); +const { StationStatus } = createCheckers(StationStatusTI); +const { SystemAlerts } = createCheckers(SystemAlertsTI); +const { SystemInformation } = createCheckers(SystemInformationTI); +const { SystemPricingPlans } = createCheckers(SystemPricingPlansTI); +const { SystemRegions } = createCheckers(SystemRegionsTI); +const { VehicleStatus } = createCheckers(VehicleStatusTI); +const { VehicleTypes } = createCheckers(VehicleTypesTI); +const { VehicleAvailability } = createCheckers(VehicleAvailabilityTI); + +// json test data: these are gbfs with no errors for v3.1-RC2 +import gbfsVersionsJson from '../../../testFixtures/v3.1-RC2/gbfs_versions.json'; +import gbfsJson from '../../../testFixtures/v3.1-RC2/gbfs.json'; +import geofencingZonesJson from '../../../testFixtures/v3.1-RC2/geofencing_zones.json'; +import manifestJson from '../../../testFixtures/v3.1-RC2/manifest.json'; +import stationInformationPhysicalStationLimitedHoursOfOperationJson from '../../../testFixtures/v3.1-RC2/station_information_physical_station_limited_hours_of_operation.json'; +import stationInformationVirtualStation from '../../../testFixtures/v3.1-RC2/station_information_virtual_station.json'; +import stationStatusJson from '../../../testFixtures/v3.1-RC2/station_status.json'; +import systemAlertsJson from '../../../testFixtures/v3.1-RC2/system_alerts.json'; +import systemInformationJson from '../../../testFixtures/v3.1-RC2/system_information.json'; +import systemPricingPlansAJson from '../../../testFixtures/v3.1-RC2/system_pricing_plans_a.json'; +import systemPricingPlansBJson from '../../../testFixtures/v3.1-RC2/system_pricing_plans_b.json'; +import systemRegionsJson from '../../../testFixtures/v3.1-RC2/system_regions.json'; +import vehicleStatusCarsharingJson from '../../../testFixtures/v3.1-RC2/vehicle_status_carsharing.json'; +import vehicleStatusMicromobilityJson from '../../../testFixtures/v3.1-RC2/vehicle_status_micromobility.json'; +import vehicleTypesJson from '../../../testFixtures/v3.1-RC2/vehicle_types.json'; +import vehicleAvailabilityJson from '../../../testFixtures/v3.1-RC2/vehicle_availability.json'; + +// Date objects cannot be represented in JSON +// Manual checks for dates are required +describe('GBFS Validator v3.1-RC2', () => { + it('should check if gbfs_versions is valid', () => { + expect(() => { + GbfsVersions.check(gbfsVersionsJson); + }).not.toThrow(); + }); + + it('should check if gbfs is valid', () => { + expect(() => { + Gbfs.check(gbfsJson); + }).not.toThrow(); + }); + + it('should check if geofencing_zones is valid', () => { + expect(() => { + GeofencingZones.check(geofencingZonesJson); + }).not.toThrow(); + }); + + it('should check if manifest is valid', () => { + expect(() => { + Manifest.check(manifestJson); + }).not.toThrow(); + }); + + it('should check if station_information is valid', () => { + expect(() => { + StationInformation.check(stationInformationPhysicalStationLimitedHoursOfOperationJson); + }).not.toThrow(); + }); + + it('should check if station_information is valid for virtual stations', () => { + expect(() => { + StationInformation.check(stationInformationVirtualStation); + }).not.toThrow(); + }); + + it('should check if station_status is valid', () => { + expect(() => { + StationStatus.check(stationStatusJson); + }).not.toThrow(); + }); + + it('should check if system_alerts is valid', () => { + expect(() => { + SystemAlerts.check(systemAlertsJson); + }).not.toThrow(); + }); + + it('should check if system_information is valid', () => { + expect(() => { + SystemInformation.check(systemInformationJson); + }).not.toThrow(); + }); + + it('should check if system_pricing_plans is valid', () => { + expect(() => { + SystemPricingPlans.check(systemPricingPlansAJson); + }).not.toThrow(); + }); + + it('should check if system_pricing_plans is valid for B', () => { + expect(() => { + SystemPricingPlans.check(systemPricingPlansBJson); + }).not.toThrow(); + }); + + it('should check if system_regions is valid', () => { + expect(() => { + SystemRegions.check(systemRegionsJson); + }).not.toThrow(); + }); + + it('should check if vehicle_status is valid for carsharing', () => { + expect(() => { + VehicleStatus.check(vehicleStatusCarsharingJson); + }).not.toThrow(); + }); + + it('should check if vehicle_status is valid for micromobility', () => { + expect(() => { + VehicleStatus.check(vehicleStatusMicromobilityJson); + }).not.toThrow(); + }); + + it('should check if vehicle_types is valid', () => { + expect(() => { + VehicleTypes.check(vehicleTypesJson); + }).not.toThrow(); + }); + + it('should check if vehicle_availability is valid', () => { + expect(() => { + VehicleAvailability.check(vehicleAvailabilityJson); + }).not.toThrow(); + }); +}); \ No newline at end of file diff --git a/models/typescript/v3.1-RC/index.d.ts b/models/typescript/v3.1-RC2/index.d.ts similarity index 91% rename from models/typescript/v3.1-RC/index.d.ts rename to models/typescript/v3.1-RC2/index.d.ts index b9cef0f4..fd66414a 100644 --- a/models/typescript/v3.1-RC/index.d.ts +++ b/models/typescript/v3.1-RC2/index.d.ts @@ -12,3 +12,4 @@ export { SystemPricingPlans } from './system_pricing_plans'; export { SystemRegions } from './system_regions'; export { VehicleStatus } from './vehicle_status'; export { VehicleTypes } from './vehicle_types'; +export { VehicleAvailability } from './vehicle_availability'; \ No newline at end of file diff --git a/scripts/generate_go_models.sh b/scripts/generate_go_models.sh deleted file mode 100755 index a0bae130..00000000 --- a/scripts/generate_go_models.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -# This script generates golang interfaces from the gbfs schemas (npx quicktype) -# It takes the gbfs version number as an argument -# Using this script can be done as follows: ./scripts/generate_go_models.sh 3.0 -# Just make sure to have the gbfs schemas in the correct folder ./vX.X - -# The script relative path. This make sure the script can be executed from any folder within the repository. -SCRIPT_PATH="$(dirname -- "${BASH_SOURCE[0]}")" - -gbfs_version="v$1" #$1 is the first argument passed to the script (the version number) -gbfs_version_no_decimal=$(echo "$1" | tr -d '.' | tr -d -) -folder_path="$SCRIPT_PATH/../$gbfs_version/" -go_folder="$SCRIPT_PATH/../models/golang/" -output_path="$go_folder/$gbfs_version/" -copyright_file="$SCRIPT_PATH/copyright.txt" - -# Iterate over all the files in the folder of the gbfs version -for file in "$folder_path"/* -do - # Extract the file name from the path and add it to the array - file_name=$(basename "$file") - file_name_no_extension="${file_name%.*}" - echo $file_name_no_extension - - output_path_directory="$output_path/$file_name_no_extension/" - output_file="$output_path_directory/$file_name_no_extension.go" - - # # generates model files from schema files - # npx quicktype -s schema "$folder_path$file_name" -o "$output_file.go" --prefer-unions --just-types - mkdir -p $output_path_directory - npx quicktype -s schema "$folder_path/$file_name" -o "$output_file" --package $file_name_no_extension - - # JSON cannot represent time.Time objects, so manually change time.Time to string and removes the import "time" - # perl over sed because of compatibility issues with MacOS - perl -pi -e "s/time\.Time/string/g" "$output_file" - perl -pi -e "s/import \"time\"//g" "$output_file" - - # Inject copyright text at the top of the file - temp_file=$(mktemp) - cat "$copyright_file" "$output_file" > "$temp_file" - mv "$temp_file" "$output_file" -done diff --git a/testFixtures/README.md b/testFixtures/README.md new file mode 100644 index 00000000..535a1aa4 --- /dev/null +++ b/testFixtures/README.md @@ -0,0 +1,12 @@ +# Test Fixtures for GBFS + +This directory contains JSON files used to test GBFS models in various programming languages for versions v2.3, v3.0, and v3.1-RC. The test fixtures help ensure that the models are correctly implemented and can handle the expected data formats. + +These test fixtures were directly copied from the GitHub specification examples for v2.3, v3.0, and v3.1-RC. + +## Deviations + +In some situations, it is necessary to deviate from the original specification examples. These deviations are documented below. + +### v3.0: +- In geofencing_zones.json, the ride_through_allowed field was added to data.geofencing_zones.features[0].properties.rules[0] to comply with the schema. This change was made in a later version (https://github.com/MobilityData/gbfs/pull/651). \ No newline at end of file diff --git a/testFixtures/v2.3/free_bike_status.json b/testFixtures/v2.3/free_bike_status.json deleted file mode 100644 index f452447a..00000000 --- a/testFixtures/v2.3/free_bike_status.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "last_updated": 1606857968, - "ttl": 300, - "version": "2.3", - "data": { - "bikes": [ - { - "bike_id": "TST:Scooter:1234", - "lat": 59.91465759277344, - "lon": 10.760470390319824, - "is_reserved": false, - "is_disabled": true, - "vehicle_type_id": "TST:VehicleType:Scooter", - "current_range_meters": 1431.2, - "pricing_plan_id": "TST:PricingPlan:Basic", - "rental_uris": { - "android": "test://rentme/TST:Scooter:1234", - "ios": "test://rentme/TST:Scooter:1234", - "web": "https://test.com/rentme/TST:Scooter:1234" - } - } - ] - } -} diff --git a/testFixtures/v2.3/free_bike_status_carsharing.json b/testFixtures/v2.3/free_bike_status_carsharing.json new file mode 100644 index 00000000..f42d9945 --- /dev/null +++ b/testFixtures/v2.3/free_bike_status_carsharing.json @@ -0,0 +1,40 @@ +{ + "last_updated": 1640887163, + "ttl": 0, + "version": "2.3", + "data": { + "bikes": [ + { + "bike_id": "45bd3fb7-a2d5-4def-9de1-c645844ba962", + "last_reported": 1609866109, + "lat": 12.345678, + "lon": 56.789012, + "is_reserved": false, + "is_disabled": false, + "vehicle_type_id": "abc123", + "current_range_meters": 400000.0, + "available_until": "2021-05-17T15:00:00Z", + "home_station": "station1", + "vehicle_equipment": [ + "child_seat_a", + "winter_tires" + ] + }, + { + "bike_id": "d4521def-7922-4e46-8e1d-8ac397239bd0", + "last_reported": 1609866204, + "is_reserved": false, + "is_disabled": false, + "vehicle_type_id": "def456", + "current_fuel_percent": 0.7, + "current_range_meters": 6543.0, + "station_id": "86", + "pricing_plan_id": "plan3", + "home_station_id": "146", + "vehicle_equipment": [ + "child_seat_a" + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v2.3/free_bike_status_micromobility.json b/testFixtures/v2.3/free_bike_status_micromobility.json new file mode 100644 index 00000000..fdbc49ff --- /dev/null +++ b/testFixtures/v2.3/free_bike_status_micromobility.json @@ -0,0 +1,33 @@ + +{ + "last_updated": 1640887163, + "ttl": 0, + "version": "2.3", + "data": { + "bikes": [ + { + "bike_id": "973a5c94-c288-4a2b-afa6-de8aeb6ae2e5", + "last_reported": 1609866109, + "lat": 12.34, + "lon": 56.78, + "is_reserved": false, + "is_disabled": false, + "vehicle_type_id": "abc123", + "rental_uris": { + "android": "https://www.example.com/app?bike_id=973a5c94-c288-4a2b-afa6-de8aeb6ae2e5&platform=android&", + "ios": "https://www.example.com/app?bike_id=973a5c94-c288-4a2b-afa6-de8aeb6ae2e5&platform=ios" + } + }, + { + "bike_id": "987fd100-b822-4347-86a4-b3eef8ca8b53", + "last_reported": 1609866204, + "is_reserved": false, + "is_disabled": false, + "vehicle_type_id": "def456", + "current_range_meters": 6543.0, + "station_id": "86", + "pricing_plan_id": "plan3" + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v2.3/gbfs.json b/testFixtures/v2.3/gbfs.json index ce5b8ccd..21b91586 100644 --- a/testFixtures/v2.3/gbfs.json +++ b/testFixtures/v2.3/gbfs.json @@ -1,59 +1,31 @@ { - "last_updated": 1606727710, - "ttl": 300, + "last_updated": 1640887163, + "ttl": 0, "version": "2.3", "data": { "en": { "feeds": [ - { - "name": "gbfs_versions", - "url": "https://test.com/gbfs_versions" - }, { "name": "system_information", - "url": "https://test.com/system_information" - }, - { - "name": "vehicle_types", - "url": "https://test.com/vehicle_types" + "url": "https://www.example.com/gbfs/1/en/system_information" }, { "name": "station_information", - "url": "https://test.com/station_information" - }, - { - "name": "station_status", - "url": "https://test.com/station_status" - }, - { - "name": "free_bike_status", - "url": "https://test.com/free_bike_status" - }, - { - "name": "system_regions", - "url": "https://test.com/system_regions" - }, - { - "name": "system_pricing_plans", - "url": "https://test.com/system_pricing_plans" - }, - { - "name": "system_hours", - "url": "https://test.com/system_hours" - }, - { - "name": "system_calendar", - "url": "https://test.com/system_calendar" - }, + "url": "https://www.example.com/gbfs/1/en/station_information" + } + ] + }, + "fr" : { + "feeds": [ { - "name": "system_alerts", - "url": "https://test.com/system_alerts" + "name": "system_information", + "url": "https://www.example.com/gbfs/1/fr/system_information" }, { - "name": "geofencing_zones", - "url": "https://test.com/geofencing_zones" + "name": "station_information", + "url": "https://www.example.com/gbfs/1/fr/station_information" } ] } } -} +} \ No newline at end of file diff --git a/testFixtures/v2.3/gbfs_versions.json b/testFixtures/v2.3/gbfs_versions.json index f3d7bb59..f8729f49 100644 --- a/testFixtures/v2.3/gbfs_versions.json +++ b/testFixtures/v2.3/gbfs_versions.json @@ -5,9 +5,13 @@ "data": { "versions": [ { - "version": "2.2", - "url": "https://test.com/gbfs.json" + "version": "2.0", + "url": "https://www.example.com/gbfs/2/gbfs" + }, + { + "version": "2.3", + "url": "https://www.example.com/gbfs/3/gbfs" } ] } -} +} \ No newline at end of file diff --git a/testFixtures/v2.3/geofencing_zones.json b/testFixtures/v2.3/geofencing_zones.json index eb0715c4..d3ab80b0 100644 --- a/testFixtures/v2.3/geofencing_zones.json +++ b/testFixtures/v2.3/geofencing_zones.json @@ -8,116 +8,78 @@ "features": [ { "type": "Feature", - "properties": { - "name": "Nes", - "rules": [ - { - "vehicle_type_ids": ["TST:VehicleType:CityBike"], - "ride_allowed": true, - "ride_through_allowed": false, - "maximum_speed_kph": 20 - } - ] - }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ - [11.53037789067, 60.13740063434], - [11.53372523957, 60.13598476211], - [11.544177, 60.132072], - [11.555332, 60.126844], - [11.567186, 60.112231], - [11.56403794135, 60.10918526319], - [11.5629827195, 60.10773004658], - [11.559217, 60.101878], - [11.55869921547, 60.1018221676], - [11.55847, 60.101506], - [11.55581995556, 60.10123306033], - [11.555637, 60.101056], - [11.49821, 60.095299], - [11.46896, 60.07201], - [11.465957, 60.063589], - [11.476578, 60.059879], - [11.467241, 60.045013], - [11.436058, 60.032524], - [11.394385, 60.029916], - [11.38968940258, 60.03265856905], - [11.375861, 60.030292], - [11.365442, 60.024714], - [11.342163, 60.03279], - [11.325316, 60.033807], - [11.31339, 60.049798], - [11.294868, 60.063006], - [11.306277, 60.071862], - [11.325134, 60.077875], - [11.3179, 60.093846], - [11.33319, 60.108785], - [11.332603, 60.128479], - [11.347831, 60.138723], - [11.32735488653, 60.13999842085], - [11.32497308493, 60.14556400031], - [11.32493016958, 60.14790318539], - [11.3246405071, 60.14881370558], - [11.3217544502, 60.14920087268], - [11.32161497533, 60.15038904672], - [11.32253764987, 60.15125678982], - [11.32308482051, 60.15271988181], - [11.3271295917, 60.15647876853], - [11.32802007437, 60.1609739234], - [11.32733336449, 60.1687562641], - [11.31669035912, 60.17985540754], - [11.29737845421, 60.18267228561], - [11.30046835899, 60.19009744236], - [11.32081023216, 60.19607048737], - [11.32132521629, 60.19820345431], - [11.31720534325, 60.19944051162], - [11.31566039085, 60.20404707345], - [11.31428709984, 60.20660599502], - [11.30793562889, 60.21197908067], - [11.29720679283, 60.21342881013], - [11.29205695152, 60.22250948067], - [11.27961150169, 60.21641334548], - [11.25377646446, 60.25220658872], - [11.30664816856, 60.2682156618], - [11.31445876122, 60.2603824128], - [11.328425, 60.265399], - [11.344468, 60.265328], - [11.382948, 60.253896], - [11.415655, 60.237796], - [11.432291, 60.221773], - [11.437049, 60.22409], - [11.421506, 60.247612], - [11.437835, 60.261601], - [11.412849, 60.285637], - [11.417028, 60.305307], - [11.444868, 60.325789], - [11.515287, 60.304312], - [11.601261, 60.267216], - [11.598781, 60.244722], - [11.584431, 60.236376], - [11.58390281439, 60.20433493011], - [11.58154247046, 60.20230899341], - [11.58229348898, 60.20020828485], - [11.5798902297, 60.20017629332], - [11.5793537879, 60.19961110456], - [11.57785175085, 60.19900324918], - [11.57600639105, 60.19744623492], - [11.57697198629, 60.19644373459], - [11.560396, 60.179793], - [11.5646123457, 60.17349518201], - [11.57135005474, 60.17688886704], - [11.586852, 60.169218], - [11.58838, 60.162737], - [11.554175, 60.14945], - [11.53037789067, 60.13740063434] + [ + -122.578067, + 45.562982 + ], + [ + -122.661838, + 45.562741 + ], + [ + -122.661151, + 45.504542 + ], + [ + -122.578926, + 45.5046625 + ], + [ + -122.578067, + 45.562982 + ] + ] + ], + [ + [ + [ + -122.650680, + 45.548197 + ], + [ + -122.650852, + 45.534731 + ], + [ + -122.630939, + 45.535212 + ], + [ + -122.630424, + 45.548197 + ], + [ + -122.650680, + 45.548197 + ] ] ] ] + }, + "properties": { + "name": "NE 24th/NE Knott", + "start": 1593878400, + "end": 1593907260, + "rules": [ + { + "vehicle_type_id": [ + "moped1", + "car1" + ], + "ride_allowed": false, + "ride_through_allowed": true, + "maximum_speed_kph": 10, + "station_parking": true + } + ] } } ] } } -} +} \ No newline at end of file diff --git a/testFixtures/v2.3/station_information.json b/testFixtures/v2.3/station_information.json deleted file mode 100644 index a6c2e55b..00000000 --- a/testFixtures/v2.3/station_information.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "last_updated": 1751437263, - "ttl": 0, - "version": "2.3", - "data": { - "stations": [ - { - "station_id": "TST:Station:1", - "name": "Cool bikes", - "lat": 12.34, - "lon": 45.67, - "vehicle_type_capacity": { - "TST:VehicleType:CityBike": 7 - } - }, - { - "station_id": "TST:Station:2", - "name": "Cooler bikes", - "lat": 11.34, - "lon": 44.67, - "vehicle_type_capacity": { - "TST:VehicleType:CityBike": 12 - } - } - ] - } -} diff --git a/testFixtures/v2.3/station_information_physical_station.json b/testFixtures/v2.3/station_information_physical_station.json new file mode 100644 index 00000000..2dd61f2d --- /dev/null +++ b/testFixtures/v2.3/station_information_physical_station.json @@ -0,0 +1,23 @@ +{ + "last_updated": 1640887163, + "ttl": 0, + "version": "2.3", + "data": { + "stations": [ + { + "station_id": "pga", + "name": "Parking garage A", + "lat": 12.345678, + "lon": 45.678901, + "parking_type": "underground_parking", + "parking_hoop": false, + "contact_phone": "+33109874321", + "is_charging_station": true, + "vehicle_type_capacity": { + "abc123": 7, + "def456": 9 + } + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v2.3/station_information_virtual_station.json b/testFixtures/v2.3/station_information_virtual_station.json new file mode 100644 index 00000000..be24a0dd --- /dev/null +++ b/testFixtures/v2.3/station_information_virtual_station.json @@ -0,0 +1,53 @@ +{ + "last_updated": 1640887163, + "ttl": 0, + "version": "2.3", + "data": { + "stations": [ + { + "station_id": "station12", + "name": "SE Belmont & SE 10 th", + "lat": 45.516445, + "lon": -122.655775, + "is_valet_station": false, + "is_virtual_station": true, + "is_charging_station": false, + "station_area": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + -122.655775, + 45.516445 + ], + [ + -122.655705, + 45.516445 + ], + [ + -122.655705, + 45.516495 + ], + [ + -122.655775, + 45.516495 + ], + [ + -122.655775, + 45.516445 + ] + ] + ] + ] + }, + "capacity": 16, + "vehicle_capacity": { + "abc123": 8, + "def456": 8, + "ghi789": 16 + } + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v2.3/station_status.json b/testFixtures/v2.3/station_status.json index 4c91a2c5..df241e7e 100644 --- a/testFixtures/v2.3/station_status.json +++ b/testFixtures/v2.3/station_status.json @@ -5,63 +5,67 @@ "data": { "stations": [ { - "station_id": "TST:Station:1", + "station_id": "station1", "is_installed": true, "is_renting": true, "is_returning": true, "last_reported": 1751437263, "num_docks_available": 3, + "num_docks_disabled" : 1, "vehicle_docks_available": [ { - "vehicle_type_ids": ["TST:VehicleType:Scooter"], + "vehicle_type_ids": [ "abc123", "def456" ], "count": 2 }, { - "vehicle_type_ids": ["TST:VehicleType:CityBike"], + "vehicle_type_ids": [ "def456" ], "count": 1 } ], "num_bikes_available": 1, + "num_bikes_disabled": 2, "vehicle_types_available": [ { - "vehicle_type_id": "TST:VehicleType:Scooter", + "vehicle_type_id": "abc123", "count": 1 }, { - "vehicle_type_id": "TST:VehicleType:CityBike", + "vehicle_type_id": "def456", "count": 0 } ] }, { - "station_id": "TST:Station:2", + "station_id": "station2", "is_installed": true, "is_renting": true, "is_returning": true, "last_reported": 1751437263, "num_docks_available": 8, + "num_docks_disabled" : 1, "vehicle_docks_available": [ { - "vehicle_type_ids": ["TST:VehicleType:Scooter"], + "vehicle_type_ids": [ "abc123" ], "count": 6 }, { - "vehicle_type_ids": ["TST:VehicleType:CityBike"], + "vehicle_type_ids": [ "def456" ], "count": 2 } ], "num_bikes_available": 6, + "num_bikes_disabled": 1, "vehicle_types_available": [ { - "vehicle_type_id": "TST:VehicleType:Scooter", + "vehicle_type_id": "abc123", "count": 2 }, { - "vehicle_type_id": "TST:VehicleType:CityBike", + "vehicle_type_id": "def456", "count": 4 } ] } ] } -} +} \ No newline at end of file diff --git a/testFixtures/v2.3/system_alerts.json b/testFixtures/v2.3/system_alerts.json index 47f3d2f6..d3670d01 100644 --- a/testFixtures/v2.3/system_alerts.json +++ b/testFixtures/v2.3/system_alerts.json @@ -5,19 +5,24 @@ "data": { "alerts": [ { - "alert_id": "TST:Alert:1", + "alert_id": "21", "type": "station_closure", + "station_ids": [ + "123", + "456", + "789" + ], "times": [ { "start": 1751437263, "end": 1751434987 } ], - "station_ids": ["TST:Station:1"], + "url": "https://example.com/more-info", "summary": "Closed for maintenance", "description": "Station is closed to install more docks.", "last_updated": 1751434987 } ] } -} +} \ No newline at end of file diff --git a/testFixtures/v2.3/system_calendar.json b/testFixtures/v2.3/system_calendar.json index c0f8bc57..0c7e87ed 100644 --- a/testFixtures/v2.3/system_calendar.json +++ b/testFixtures/v2.3/system_calendar.json @@ -5,13 +5,13 @@ "data": { "calendars": [ { - "start_month": 1, + "start_month": 4, "start_day": 1, "start_year": 2020, - "end_month": 12, - "end_day": 30, - "end_year": 2021 + "end_month": 11, + "end_day": 5, + "end_year": 2020 } ] } -} +} \ No newline at end of file diff --git a/testFixtures/v2.3/system_hours.json b/testFixtures/v2.3/system_hours.json index 589dc1ac..f50d71c5 100644 --- a/testFixtures/v2.3/system_hours.json +++ b/testFixtures/v2.3/system_hours.json @@ -5,23 +5,38 @@ "data": { "rental_hours": [ { - "user_types": ["member"], - "days": ["sat", "sun"], + "user_types": [ "member" ], + "days": [ + "sat", + "sun" + ], "start_time": "00:00:00", "end_time": "23:59:59" }, { - "user_types": ["nonmember"], - "days": ["sat", "sun"], + "user_types": [ "nonmember" ], + "days": [ + "sat", + "sun" + ], "start_time": "05:00:00", "end_time": "23:59:59" }, { - "user_types": ["member", "nonmember"], - "days": ["mon", "tue", "wed", "thu", "fri"], + "user_types": [ + "member", + "nonmember" + ], + "days": [ + "mon", + "tue", + "wed", + "thu", + "fri" + ], "start_time": "00:00:00", "end_time": "23:59:59" } ] } -} +} \ No newline at end of file diff --git a/testFixtures/v2.3/system_information.json b/testFixtures/v2.3/system_information.json index 1c194952..6eaa45db 100644 --- a/testFixtures/v2.3/system_information.json +++ b/testFixtures/v2.3/system_information.json @@ -1,22 +1,42 @@ { - "last_updated": 1606830357, - "ttl": 300, + "last_updated": 1640887163, + "ttl": 1800, "version": "2.3", "data": { - "system_id": "TST:System:Test", + "system_id": "example_cityname", "language": "en", - "name": "Test", - "url": "https://www.test.com/", - "timezone": "Europe/Oslo", + "name": "Example Bike Rental", + "short_name": "Example Bike", + "operator": "Example Sharing, Inc", + "url": "https://www.example.com", + "purchase_url": "https://www.example.com", + "start_date": "2010-06-10", + "phone_number": "1-800-555-1234", + "email": "customerservice@example.com", + "feed_contact_email": "datafeed@example.com", + "timezone": "America/Chicago", + "license_url": "https://www.example.com/data-license.html", + "terms_url": "https://www.example.com/terms", + "terms_last_updated": "2021-06-21", + "privacy_url": "https://www.example.com/privacy-policy", + "privacy_last_updated": "2019-01-13", "rental_apps": { "android": { - "store_uri": "https://play.google.com/store/apps/details?id=com.testrental.android", - "discovery_uri": "com.testrental.android://" + "discovery_uri": "com.example.android://", + "store_uri": "https://play.google.com/store/apps/details?id=com.example.android" }, "ios": { "store_uri": "https://apps.apple.com/app/apple-store/id123456789", - "discovery_uri": "com.testrental.ios://" + "discovery_uri": "com.example.ios://" } - } + }, + "brand_assets": { + "brand_last_modified": "2021-06-15", + "brand_image_url": "https://www.example.com/assets/brand_image.svg", + "brand_image_url_dark": "https://www.example.com/assets/brand_image_dark.svg", + "color": "#C2D32C", + "brand_terms_url": "https://www.example.com/assets/brand.pdf" + } + } } diff --git a/testFixtures/v2.3/system_pricing_plans.json b/testFixtures/v2.3/system_pricing_plans.json deleted file mode 100644 index f597ff4a..00000000 --- a/testFixtures/v2.3/system_pricing_plans.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "last_updated": 1606858558, - "ttl": 300, - "version": "2.3", - "data": { - "plans": [ - { - "plan_id": "TST:PricingPlan:Basic", - "name": "Basic", - "currency": "NOK", - "price": 0.0, - "is_taxable": false, - "description": "Start NOK 0, Per minute 3,50 NOK", - "per_min_pricing": [ - { - "start": 0, - "rate": 3.5, - "interval": 1 - } - ] - } - ] - } -} diff --git a/testFixtures/v2.3/system_pricing_plans_a.json b/testFixtures/v2.3/system_pricing_plans_a.json new file mode 100644 index 00000000..2d3c1b4b --- /dev/null +++ b/testFixtures/v2.3/system_pricing_plans_a.json @@ -0,0 +1,35 @@ +{ + "last_updated": 1640887163, + "ttl": 0, + "version": "2.3", + "data": { + "plans": [ + { + "plan_id": "plan2", + "name": "One-Way", + "currency": "USD", + "price": 2.00, + "is_taxable": false, + "description": "Includes 10km, overage fees apply after 10km.", + "per_km_pricing": [ + { + "start": 10, + "rate": 1.00, + "interval": 1, + "end": 25 + }, + { + "start": 25, + "rate": 0.50, + "interval": 1 + }, + { + "start": 25, + "rate": 3.00, + "interval": 5 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v2.3/system_pricing_plans_b.json b/testFixtures/v2.3/system_pricing_plans_b.json new file mode 100644 index 00000000..d75e2752 --- /dev/null +++ b/testFixtures/v2.3/system_pricing_plans_b.json @@ -0,0 +1,31 @@ +{ + "last_updated": 1640887163, + "ttl": 0, + "version": "2.3", + "data": { + "plans": [ + { + "plan_id": "plan3", + "name": "Simple Rate", + "currency": "CAD", + "price": 3.00, + "is_taxable": true, + "description": "$3 unlock fee, $0.25 per kilometer and 0.50 per minute.", + "per_km_pricing": [ + { + "start": 0, + "rate": 0.25, + "interval": 1 + } + ], + "per_min_pricing": [ + { + "start": 0, + "rate": 0.50, + "interval": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v2.3/system_regions.json b/testFixtures/v2.3/system_regions.json index 60997ba0..0508903d 100644 --- a/testFixtures/v2.3/system_regions.json +++ b/testFixtures/v2.3/system_regions.json @@ -1,13 +1,25 @@ { - "last_updated": 1606858379, - "ttl": 300, + "last_updated": 1640887163, + "ttl": 86400, "version": "2.3", "data": { "regions": [ { - "region_id": "TST:Region:Sahara", - "name": "Sahara" + "name": "North", + "region_id": "3" + }, + { + "name": "East", + "region_id": "4" + }, + { + "name": "South", + "region_id": "5" + }, + { + "name": "West", + "region_id": "6" } ] } -} +} \ No newline at end of file diff --git a/testFixtures/v2.3/vehicle_types.json b/testFixtures/v2.3/vehicle_types.json index 9937f1b5..00aec0e3 100644 --- a/testFixtures/v2.3/vehicle_types.json +++ b/testFixtures/v2.3/vehicle_types.json @@ -1,20 +1,105 @@ { - "last_updated": 1606830898, - "ttl": 300, + "last_updated": 1640887163, + "ttl": 0, "version": "2.3", "data": { "vehicle_types": [ { - "vehicle_type_id": "TST:VehicleType:Scooter", - "form_factor": "scooter", + "vehicle_type_id": "abc123", + "form_factor": "bicycle", + "propulsion_type": "human", + "name": "Example Basic Bike", + "wheel_count": 2, + "default_reserve_time": 30, + "return_constraint": "any_station", + "vehicle_assets": { + "icon_url": "https://www.example.com/assets/icon_bicycle.svg", + "icon_url_dark": "https://www.example.com/assets/icon_bicycle_dark.svg", + "icon_last_modified": "2021-06-15" + }, + "default_pricing_plan_id": "bike_plan_1", + "pricing_plan_ids": [ + "bike_plan_1", + "bike_plan_2", + "bike_plan_3" + ] + }, + { + "vehicle_type_id": "cargo123", + "form_factor": "cargo_bicycle", + "propulsion_type": "human", + "name": "Example Cargo Bike", + "wheel_count": 3, + "default_reserve_time": 30, + "return_constraint": "roundtrip_station", + "vehicle_assets": { + "icon_url": "https://www.example.com/assets/icon_cargobicycle.svg", + "icon_url_dark": "https://www.example.com/assets/icon_cargobicycle_dark.svg", + "icon_last_modified": "2021-06-15" + }, + "default_pricing_plan": "cargo_plan_1", + "pricing_plans": [ + "cargo_plan_1", + "cargo_plan_2", + "cargo_plan_3" + ] + }, + { + "vehicle_type_id": "def456", + "form_factor": "scooter_standing", "propulsion_type": "electric", - "max_range_meters": 0.0 + "name": "Example E-scooter V2", + "wheel_count": 2, + "max_permitted_speed": 25, + "rated_power": 350, + "default_reserve_time": 30, + "max_range_meters": 12345, + "return_constraint": "free_floating", + "vehicle_assets": { + "icon_url": "https://www.example.com/assets/icon_escooter.svg", + "icon_url_dark": "https://www.example.com/assets/icon_escooter_dark.svg", + "icon_last_modified": "2021-06-15" + }, + "default_pricing_plan_id": "scooter_plan_1" }, { - "vehicle_type_id": "TST:VehicleType:CityBike", - "form_factor": "bicycle", - "propulsion_type": "human" + "vehicle_type_id": "car1", + "form_factor": "car", + "rider_capacity": 5, + "min_cargo_volume_capacity": 200, + "propulsion_type": "combustion_diesel", + "eco_label": [ + { + "country_code": "FR", + "eco_sticker": "critair_1" + }, + { + "country_code": "DE", + "eco_sticker": "euro_2" + } + ], + "name": "Four-door Sedan", + "wheel_count": 4, + "default_reserve_time": 0, + "max_range_meters": 523992, + "return_constraint": "roundtrip_station", + "vehicle_accessories": [ + "doors_4", + "automatic", + "cruise_control" + ], + "g_CO2_km": 120, + "vehicle_image": "https://www.example.com/assets/renault-clio.jpg", + "make": "Renault", + "model": "Clio", + "color": "white", + "vehicle_assets": { + "icon_url": "https://www.example.com/assets/icon_car.svg", + "icon_url_dark": "https://www.example.com/assets/icon_car_dark.svg", + "icon_last_modified": "2021-06-15" + }, + "default_pricing_plan_id": "car_plan_1" } ] } -} +} \ No newline at end of file diff --git a/testFixtures/v3.0/gbfs.json b/testFixtures/v3.0/gbfs.json index c5184028..add93828 100644 --- a/testFixtures/v3.0/gbfs.json +++ b/testFixtures/v3.0/gbfs.json @@ -1,41 +1,17 @@ { - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 60, - "version": "3.0", - "data": { - "feeds": [ - { - "name": "system_information", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/system-information" - }, - { - "name": "vehicle_status", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/vehicle-status" - }, - { - "name": "vehicle_types", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/vehicle-types" - }, - { - "name": "system_pricing_plans", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/system-pricing-plans" - }, - { - "name": "station_information", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/station-information" - }, - { - "name": "station_status", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/station-status" - }, - { - "name": "geofencing_zones", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/geofencing-zones" - }, - { - "name": "gbfs_versions", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0/versions" - } - ] - } + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 0, + "version": "3.0", + "data": { + "feeds": [ + { + "name": "system_information", + "url": "https://www.example.com/gbfs/1/system_information" + }, + { + "name": "station_information", + "url": "https://www.example.com/gbfs/1/station_information" + } + ] + } } \ No newline at end of file diff --git a/testFixtures/v3.0/gbfs_versions.json b/testFixtures/v3.0/gbfs_versions.json index e847fbca..5852f9bf 100644 --- a/testFixtures/v3.0/gbfs_versions.json +++ b/testFixtures/v3.0/gbfs_versions.json @@ -1,25 +1,17 @@ { - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 60, - "version": "3.0", - "data": { - "versions": [ - { - "version": "2.1", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/2.1" - }, - { - "version": "2.2", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/2.2" - }, - { - "version": "2.3", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/2.3" - }, - { - "version": "3.0", - "url": "https://berlin.example.tier-services.io/tier_paris/gbfs/3.0" - } - ] - } + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 0, + "version": "3.0", + "data": { + "versions": [ + { + "version": "2.0", + "url": "https://www.example.com/gbfs/2/gbfs" + }, + { + "version": "3.0", + "url": "https://www.example.com/gbfs/3/gbfs" + } + ] + } } \ No newline at end of file diff --git a/testFixtures/v3.0/geofencing_zones.json b/testFixtures/v3.0/geofencing_zones.json index 1cdfb607..e3170c76 100644 --- a/testFixtures/v3.0/geofencing_zones.json +++ b/testFixtures/v3.0/geofencing_zones.json @@ -1,19165 +1,74 @@ { - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 60, - "version": "3.0", - "data": { - "geofencing_zones": { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.27926295942083, - 48.8322965864515 - ], - [ - 2.28936334811021, - 48.8282948783222 - ], - [ - 2.29405341618079, - 48.8264786363884 - ], - [ - 2.30612344430321, - 48.8238903778911 - ], - [ - 2.32019364851507, - 48.8206662198217 - ], - [ - 2.32557343247848, - 48.8196671428364 - ], - [ - 2.33194018149973, - 48.818350147294 - ], - [ - 2.33449213030298, - 48.8168514551005 - ], - [ - 2.33697510751628, - 48.8165335449355 - ], - [ - 2.341251346051, - 48.8167152081337 - ], - [ - 2.34414815280115, - 48.8157160523965 - ], - [ - 2.3448378686939, - 48.8159885513903 - ], - [ - 2.34690701637132, - 48.8158977185571 - ], - [ - 2.35139016967497, - 48.8177597587484 - ], - [ - 2.35387314688825, - 48.817668929124 - ], - [ - 2.35573537979874, - 48.8168514551005 - ], - [ - 2.35621818092355, - 48.8158977185571 - ], - [ - 2.3642188852792, - 48.8157160523965 - ], - [ - 2.37566816909882, - 48.8193038371786 - ], - [ - 2.38394475980681, - 48.8228009278113 - ], - [ - 2.39049706078688, - 48.8247081200699 - ], - [ - 2.39546301521543, - 48.8279320181257 - ], - [ - 2.39987719692806, - 48.8287947162308 - ], - [ - 2.40229120255765, - 48.8293863454994 - ], - [ - 2.41001602055536, - 48.8333817590024 - ], - [ - 2.41167133869789, - 48.8341535635276 - ], - [ - 2.41387842955518, - 48.8381485968768 - ], - [ - 2.41622346359051, - 48.8471362570454 - ], - [ - 2.41643037835848, - 48.8498140863037 - ], - [ - 2.41532683293104, - 48.8551818887268 - ], - [ - 2.41429225909135, - 48.8615348055902 - ], - [ - 2.41429225909408, - 48.8688782082629 - ], - [ - 2.41394740114816, - 48.8723714562076 - ], - [ - 2.41270591254155, - 48.8766356101133 - ], - [ - 2.41036087850625, - 48.8794932970686 - ], - [ - 2.40249811732861, - 48.8818972564765 - ], - [ - 2.40047880393499, - 48.8837961821435 - ], - [ - 2.39928700210456, - 48.8857175109951 - ], - [ - 2.39974834474779, - 48.8880432313689 - ], - [ - 2.39928700210456, - 48.8904193991615 - ], - [ - 2.39744163152838, - 48.8951208452066 - ], - [ - 2.39386622603712, - 48.897370305476 - ], - [ - 2.38629933097542, - 48.8979010622403 - ], - [ - 2.38403106297451, - 48.898684550021 - ], - [ - 2.38214724717869, - 48.8999482141126 - ], - [ - 2.3809960349522, - 48.900125124536 - ], - [ - 2.37595971108868, - 48.9000493058597 - ], - [ - 2.3693855784104, - 48.9003273071101 - ], - [ - 2.36069695861414, - 48.9008580324764 - ], - [ - 2.35735222444504, - 48.9008580324764 - ], - [ - 2.35290403294928, - 48.9013382077177 - ], - [ - 2.351443114576, - 48.9013887522114 - ], - [ - 2.34117824074647, - 48.9012623908817 - ], - [ - 2.33322008013633, - 48.9007822149161 - ], - [ - 2.32049471220446, - 48.9006305794421 - ], - [ - 2.31103718800142, - 48.8972439339912 - ], - [ - 2.30284835606909, - 48.8937559548075 - ], - [ - 2.29454788289758, - 48.8896147128963 - ], - [ - 2.29191416791502, - 48.8898381573961 - ], - [ - 2.28574051343938, - 48.8868215723981 - ], - [ - 2.28116409382656, - 48.8831505828541 - ], - [ - 2.27969147899805, - 48.8788671499768 - ], - [ - 2.27892685206714, - 48.8781221676814 - ], - [ - 2.27816222513707, - 48.8763341649029 - ], - [ - 2.27683120788512, - 48.8737389158208 - ], - [ - 2.27462228564193, - 48.8730683635164 - ], - [ - 2.273574463552, - 48.8713360617975 - ], - [ - 2.27331958791129, - 48.8695824301719 - ], - [ - 2.26918493858392, - 48.8647378957565 - ], - [ - 2.26612643086395, - 48.8607442231418 - ], - [ - 2.26346439636512, - 48.8564961370991 - ], - [ - 2.25958462267977, - 48.8502537777007 - ], - [ - 2.25675267108522, - 48.8455575197499 - ], - [ - 2.25309945352888, - 48.8457438875843 - ], - [ - 2.25224986805668, - 48.8454062678643 - ], - [ - 2.25100380935558, - 48.8430020533527 - ], - [ - 2.25100380935558, - 48.8414923712981 - ], - [ - 2.25140028258116, - 48.8386343814817 - ], - [ - 2.25508181965373, - 48.8348504414872 - ], - [ - 2.26168026686793, - 48.8340488805675 - ], - [ - 2.26391750862814, - 48.8343844192571 - ], - [ - 2.26824666771864, - 48.8346081104682 - ], - [ - 2.26977592157959, - 48.832967685056 - ], - [ - 2.26714220659702, - 48.8315322687583 - ], - [ - 2.26745372127229, - 48.8277850791765 - ], - [ - 2.27393889042318, - 48.8281579464159 - ], - [ - 2.27674252250154, - 48.8299103852768 - ], - [ - 2.27926295942083, - 48.8322965864515 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "BA Nov 23", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3917894793189, - 48.8487893792978 - ], - [ - 2.39157887294698, - 48.8484918192281 - ], - [ - 2.39206822304504, - 48.8484551336178 - ], - [ - 2.3917894793189, - 48.8487893792978 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de l'Imperatrice Eugenie", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32291176295126, - 48.8353605598795 - ], - [ - 2.32258296033518, - 48.8350675700669 - ], - [ - 2.32258950557125, - 48.8350616857872 - ], - [ - 2.32291864366891, - 48.8353556128308 - ], - [ - 2.32291176295126, - 48.8353605598795 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.313693, - 48.891778 - ], - [ - 2.312351, - 48.891397 - ], - [ - 2.314229, - 48.890331 - ], - [ - 2.315452, - 48.889055 - ], - [ - 2.316611, - 48.890367 - ], - [ - 2.313693, - 48.891778 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 140", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35236831665748, - 48.8510352962304 - ], - [ - 2.35234397982495, - 48.8510169944 - ], - [ - 2.35393630402737, - 48.8505594464764 - ], - [ - 2.35394673409866, - 48.8505823239717 - ], - [ - 2.35236831665748, - 48.8510352962304 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Tino Rossi", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.342942650673, - 48.8630148412868 - ], - [ - 2.34277030134714, - 48.8626879605056 - ], - [ - 2.34617414851811, - 48.8618672025839 - ], - [ - 2.34673302183325, - 48.8609409482595 - ], - [ - 2.34772310916498, - 48.8599280119671 - ], - [ - 2.3491166986528, - 48.862349 - ], - [ - 2.34969845849081, - 48.8630480406141 - ], - [ - 2.34842975983801, - 48.8629053607164 - ], - [ - 2.34578823584868, - 48.8626092793196 - ], - [ - 2.34360919649555, - 48.8629701605033 - ], - [ - 2.342942650673, - 48.8630148412868 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Forum des Halles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.23836643514295, - 48.8606762899947 - ], - [ - 2.23781472951816, - 48.8584725351554 - ], - [ - 2.23848465777655, - 48.8540906637687 - ], - [ - 2.23789354460726, - 48.8523015054176 - ], - [ - 2.24065207272818, - 48.8543240275356 - ], - [ - 2.24309534049158, - 48.8580317725445 - ], - [ - 2.23836643514295, - 48.8606762899947 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 20 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.292762, - 48.858045 - ], - [ - 2.296346, - 48.855687 - ], - [ - 2.298556, - 48.857099 - ], - [ - 2.295123, - 48.859499 - ], - [ - 2.292762, - 48.858045 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 7", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.26629559364821, - 48.8443025057336 - ], - [ - 2.26645, - 48.844224 - ], - [ - 2.266267, - 48.844026 - ], - [ - 2.26756, - 48.843461 - ], - [ - 2.268284, - 48.843133 - ], - [ - 2.26859431577602, - 48.8430031737298 - ], - [ - 2.26892668416596, - 48.8432958614324 - ], - [ - 2.26955633525528, - 48.8439129121547 - ], - [ - 2.27043118801397, - 48.8447525814896 - ], - [ - 2.270768, - 48.845103 - ], - [ - 2.270044, - 48.845897 - ], - [ - 2.269046, - 48.845573 - ], - [ - 2.268252, - 48.844743 - ], - [ - 2.267818, - 48.844725 - ], - [ - 2.267346, - 48.84469 - ], - [ - 2.267131, - 48.844545 - ], - [ - 2.26726, - 48.844344 - ], - [ - 2.267324, - 48.844115 - ], - [ - 2.267362, - 48.843991 - ], - [ - 2.267163, - 48.843786 - ], - [ - 2.266675, - 48.843966 - ], - [ - 2.26689, - 48.844199 - ], - [ - 2.26664444462522, - 48.8443133200731 - ], - [ - 2.26691039495114, - 48.8445807403099 - ], - [ - 2.26728070195483, - 48.8449336665695 - ], - [ - 2.26699615798066, - 48.8450288888834 - ], - [ - 2.26629559364821, - 48.8443025057336 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parc Sainte Perine", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.26833863892451, - 48.8615275548939 - ], - [ - 2.26837963892456, - 48.8612467921359 - ], - [ - 2.26859681327629, - 48.8604742984127 - ], - [ - 2.26875873678754, - 48.8599604789143 - ], - [ - 2.26896968167099, - 48.8598042101725 - ], - [ - 2.26930600900219, - 48.8595474208671 - ], - [ - 2.26973279190398, - 48.8592696612673 - ], - [ - 2.2702244983161, - 48.8589625274689 - ], - [ - 2.27071094488251, - 48.8586980085711 - ], - [ - 2.27119742519517, - 48.8586597394856 - ], - [ - 2.27134251405494, - 48.8586490665449 - ], - [ - 2.27144957817365, - 48.8586439608904 - ], - [ - 2.27154562092016, - 48.8586476627601 - ], - [ - 2.271658, - 48.85865 - ], - [ - 2.2706343273312, - 48.8594605672491 - ], - [ - 2.27042057480582, - 48.8593772690095 - ], - [ - 2.26996590213802, - 48.8597615256257 - ], - [ - 2.27005330259018, - 48.8598271050715 - ], - [ - 2.269812, - 48.860073 - ], - [ - 2.269619, - 48.860253 - ], - [ - 2.268922, - 48.860944 - ], - [ - 2.26833863892451, - 48.8615275548939 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin du Ranelagh 1", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.29985260987617, - 48.8414908309377 - ], - [ - 2.30011051816662, - 48.8411057408404 - ], - [ - 2.30016466349321, - 48.8411238405272 - ], - [ - 2.30038678377236, - 48.8411640672328 - ], - [ - 2.30035419118262, - 48.8412476682155 - ], - [ - 2.30016619118262, - 48.8415026682155 - ], - [ - 2.30008976472679, - 48.8415564729018 - ], - [ - 2.29992068254008, - 48.8415134643843 - ], - [ - 2.29985260987617, - 48.8414908309377 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Aires piétonnes", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.403633, - 48.846035 - ], - [ - 2.40368917023034, - 48.8459824199262 - ], - [ - 2.4037917212986, - 48.8459670373502 - ], - [ - 2.40391894576391, - 48.8460504937952 - ], - [ - 2.403899, - 48.846165 - ], - [ - 2.40453906809176, - 48.846266 - ], - [ - 2.404591, - 48.846151 - ], - [ - 2.404883, - 48.846187 - ], - [ - 2.40475670744187, - 48.8465806413345 - ], - [ - 2.405076, - 48.846596 - ], - [ - 2.40509531274733, - 48.8468411251546 - ], - [ - 2.40463734679314, - 48.8468744963355 - ], - [ - 2.404725, - 48.846721 - ], - [ - 2.403816, - 48.846672 - ], - [ - 2.403783, - 48.846506 - ], - [ - 2.40374930641375, - 48.8463989146821 - ], - [ - 2.40374163301661, - 48.8462480244998 - ], - [ - 2.403751, - 48.846162 - ], - [ - 2.403633, - 48.846035 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Cité Debergue", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3742822, - 48.8849401 - ], - [ - 2.3741695, - 48.8848589 - ], - [ - 2.3751137, - 48.8841569 - ], - [ - 2.3752478, - 48.8842222 - ], - [ - 2.3742822, - 48.8849401 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle et élémentaire, École Polyvalente Henri Noguères", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2724431029005, - 48.8530646095188 - ], - [ - 2.2727601029005, - 48.8528776095188 - ], - [ - 2.27287538220424, - 48.8528255840653 - ], - [ - 2.27305115680114, - 48.8527712504601 - ], - [ - 2.2732161029005, - 48.8527326095188 - ], - [ - 2.2735541029005, - 48.8525416095188 - ], - [ - 2.2740201029005, - 48.8528456095188 - ], - [ - 2.2735431029005, - 48.8530606095188 - ], - [ - 2.2736831029005, - 48.8531986095188 - ], - [ - 2.27315058349432, - 48.853321853879 - ], - [ - 2.2725991029005, - 48.8534596095188 - ], - [ - 2.2724431029005, - 48.8530646095188 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Maison d'Accueil de l'Assomption", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33864292851364, - 48.8493969866491 - ], - [ - 2.33872172021884, - 48.8493691435315 - ], - [ - 2.33879435818889, - 48.849393232217 - ], - [ - 2.33886144427623, - 48.8497176968156 - ], - [ - 2.33886407148631, - 48.8497784119576 - ], - [ - 2.33881449808029, - 48.8498263363596 - ], - [ - 2.3387256056893, - 48.8498684486862 - ], - [ - 2.33861993543519, - 48.849823145633 - ], - [ - 2.33856846963722, - 48.8497764483602 - ], - [ - 2.33859125825945, - 48.8497220148747 - ], - [ - 2.33864292851364, - 48.8493969866491 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Place de l'Odéon", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.4635827174879, - 48.8416039791272 - ], - [ - 2.46191704670719, - 48.8392880985986 - ], - [ - 2.46878793868035, - 48.8372461979509 - ], - [ - 2.46581055215879, - 48.840370683298 - ], - [ - 2.4635827174879, - 48.8416039791272 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39800941057286, - 48.8699066695562 - ], - [ - 2.39833087224672, - 48.8696847909674 - ], - [ - 2.39884933001983, - 48.8699198549331 - ], - [ - 2.39855455003181, - 48.8702196167289 - ], - [ - 2.39800941057286, - 48.8699066695562 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Pierre Seghers", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3497134839416, - 48.8402880046504 - ], - [ - 2.34976646218237, - 48.8396690907869 - ], - [ - 2.34984592954291, - 48.8396690907869 - ], - [ - 2.34977308446165, - 48.8402880046504 - ], - [ - 2.3497134839416, - 48.8402880046504 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 38", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.41098353343509, - 48.8670569864799 - ], - [ - 2.41100553362756, - 48.8668616152971 - ], - [ - 2.41104953401126, - 48.8666662433512 - ], - [ - 2.41128053602651, - 48.8666807153733 - ], - [ - 2.41123653564279, - 48.8670786943422 - ], - [ - 2.41098353343509, - 48.8670569864799 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecoles Rue le Vau .2 ", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37678738084624, - 48.8546516591455 - ], - [ - 2.37693002592747, - 48.8546390621418 - ], - [ - 2.37724891035888, - 48.8547075991452 - ], - [ - 2.37733289583167, - 48.8547600249997 - ], - [ - 2.37726727355106, - 48.8547888526712 - ], - [ - 2.37678738084624, - 48.8546516591455 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Bullourde - Passage Bullourde", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.348029, - 48.817586 - ], - [ - 2.348608, - 48.817551 - ], - [ - 2.351162, - 48.818102 - ], - [ - 2.352342, - 48.818836 - ], - [ - 2.351344, - 48.819698 - ], - [ - 2.349241, - 48.818872 - ], - [ - 2.348029, - 48.817586 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 110", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.308732, - 48.8439826 - ], - [ - 2.3086576, - 48.8439191 - ], - [ - 2.30868934701487, - 48.8438986620795 - ], - [ - 2.3087615, - 48.8439552 - ], - [ - 2.3088602, - 48.8440523 - ], - [ - 2.3088793, - 48.8440889 - ], - [ - 2.3088769, - 48.8441115 - ], - [ - 2.3088608, - 48.8441944 - ], - [ - 2.3088152, - 48.8441883 - ], - [ - 2.3088276, - 48.844161 - ], - [ - 2.308832, - 48.8441319 - ], - [ - 2.3088371, - 48.8441069 - ], - [ - 2.3088168, - 48.8440607 - ], - [ - 2.308732, - 48.8439826 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.288791, - 48.838017 - ], - [ - 2.282501, - 48.836097 - ], - [ - 2.282027, - 48.835414 - ], - [ - 2.287838, - 48.833367 - ], - [ - 2.289339, - 48.834091 - ], - [ - 2.288791, - 48.838017 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "risque fraude", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33236416555474, - 48.8629986038639 - ], - [ - 2.33117712786383, - 48.86124891991 - ], - [ - 2.33294830820648, - 48.8608453014278 - ], - [ - 2.333061, - 48.861263 - ], - [ - 2.333073, - 48.861676 - ], - [ - 2.333492, - 48.861985 - ], - [ - 2.3340450901708, - 48.862495 - ], - [ - 2.33321635401253, - 48.8627508302931 - ], - [ - 2.33236416555474, - 48.8629986038639 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 125", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3527633, - 48.8459834 - ], - [ - 2.3534942, - 48.8457769 - ], - [ - 2.3535102, - 48.8457981 - ], - [ - 2.352778, - 48.8460029 - ], - [ - 2.3527633, - 48.8459834 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue des ecoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.29285050432841, - 48.828762368692 - ], - [ - 2.29281310527968, - 48.8283240524342 - ], - [ - 2.29323488885015, - 48.8287303607686 - ], - [ - 2.29285050432841, - 48.828762368692 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 105", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39468864468276, - 48.8828350281466 - ], - [ - 2.39473730465426, - 48.882764155227 - ], - [ - 2.39471930465426, - 48.882674155227 - ], - [ - 2.39446430465426, - 48.882530155227 - ], - [ - 2.39422030465426, - 48.882371155227 - ], - [ - 2.39432766196193, - 48.8823554814679 - ], - [ - 2.39463312251927, - 48.882409983244 - ], - [ - 2.39516639746173, - 48.882493513592 - ], - [ - 2.39557694734543, - 48.8825001300673 - ], - [ - 2.3955543081354, - 48.8825400117475 - ], - [ - 2.39547030465426, - 48.8825605421481 - ], - [ - 2.39536530465426, - 48.882628155227 - ], - [ - 2.39512130465426, - 48.882630155227 - ], - [ - 2.39502430465426, - 48.882771155227 - ], - [ - 2.39487430465426, - 48.882856155227 - ], - [ - 2.39484034846285, - 48.882927911997 - ], - [ - 2.39468864468276, - 48.8828350281466 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Herold", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.351403, - 48.8490882 - ], - [ - 2.3512997, - 48.8489381 - ], - [ - 2.3511917, - 48.8487948 - ], - [ - 2.3511741, - 48.8487677 - ], - [ - 2.3511686, - 48.8487619 - ], - [ - 2.3511012, - 48.848669 - ], - [ - 2.3510745, - 48.8486311 - ], - [ - 2.3510492, - 48.8485933 - ], - [ - 2.3509838, - 48.8485149 - ], - [ - 2.3510168, - 48.8485075 - ], - [ - 2.3510794, - 48.8485852 - ], - [ - 2.3511407, - 48.8486681 - ], - [ - 2.3513319, - 48.8489444 - ], - [ - 2.3514302, - 48.8490789 - ], - [ - 2.351403, - 48.8490882 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue des ecoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33192714239134, - 48.8672356504359 - ], - [ - 2.33165043769435, - 48.8668139261926 - ], - [ - 2.33198644821468, - 48.866650463237 - ], - [ - 2.3318976520954, - 48.8662866901111 - ], - [ - 2.33194, - 48.8662873476782 - ], - [ - 2.33249001052027, - 48.86713207461 - ], - [ - 2.33192714239134, - 48.8672356504359 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Place du marché Saint-Honoré", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32006780858429, - 48.841440580994 - ], - [ - 2.320837, - 48.84104 - ], - [ - 2.321062, - 48.84133 - ], - [ - 2.321513, - 48.841905 - ], - [ - 2.32006780858429, - 48.841440580994 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 45", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34461661556329, - 48.8927835584663 - ], - [ - 2.34447327735292, - 48.8925849299021 - ], - [ - 2.34491923112659, - 48.8925006121662 - ], - [ - 2.34498550731684, - 48.8926866822512 - ], - [ - 2.34461661556329, - 48.8927835584663 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 13", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3895247, - 48.8418766 - ], - [ - 2.3895059, - 48.8418254 - ], - [ - 2.3898331, - 48.8417548 - ], - [ - 2.3902301, - 48.8416665 - ], - [ - 2.3908148, - 48.8415376 - ], - [ - 2.3926387, - 48.8411246 - ], - [ - 2.3926548, - 48.8411775 - ], - [ - 2.391818, - 48.8413646 - ], - [ - 2.3908738, - 48.8415747 - ], - [ - 2.3901013, - 48.8417459 - ], - [ - 2.3896829, - 48.8418307 - ], - [ - 2.3895247, - 48.8418766 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Coulée verte René-Dumont 10", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.41352737190715, - 48.8484536109243 - ], - [ - 2.4133666026574, - 48.8477095281859 - ], - [ - 2.41368054800611, - 48.8476798402729 - ], - [ - 2.41382115177902, - 48.8484263962923 - ], - [ - 2.41352737190715, - 48.8484536109243 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Benoit Frachon", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36903258439534, - 48.8532456648777 - ], - [ - 2.36852348148193, - 48.8521750163771 - ], - [ - 2.36889283065426, - 48.8520896262469 - ], - [ - 2.36929212705695, - 48.8532259598973 - ], - [ - 2.36903258439534, - 48.8532456648777 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "[Paris][LSZ][Bastille]", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33676461117871, - 48.8421340057004 - ], - [ - 2.33670123107925, - 48.8412357176563 - ], - [ - 2.33688475984381, - 48.841222937269 - ], - [ - 2.3369897429628, - 48.842139998714 - ], - [ - 2.33676461117871, - 48.8421340057004 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin des Grands Explorateurs", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39395072528467, - 48.8547680077719 - ], - [ - 2.39405765092989, - 48.8546425109802 - ], - [ - 2.39501732976071, - 48.8549249521499 - ], - [ - 2.39493508556854, - 48.8550647837287 - ], - [ - 2.39395072528467, - 48.8547680077719 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Damia", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3465173393148, - 48.8933635961937 - ], - [ - 2.34654833453488, - 48.8931948787663 - ], - [ - 2.34627153248836, - 48.8926725782614 - ], - [ - 2.34634338567884, - 48.8926543938133 - ], - [ - 2.34642993502322, - 48.8926394743372 - ], - [ - 2.34678501054953, - 48.8932948135689 - ], - [ - 2.3465173393148, - 48.8933635961937 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 159", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32920266322049, - 48.8895352487975 - ], - [ - 2.32820397616981, - 48.8882367551184 - ], - [ - 2.331101, - 48.886049 - ], - [ - 2.33201713264498, - 48.8867219220938 - ], - [ - 2.33134146942342, - 48.8885004313783 - ], - [ - 2.32920266322049, - 48.8895352487975 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 143", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35525315472486, - 48.8545919944435 - ], - [ - 2.35521269390122, - 48.854557607553 - ], - [ - 2.35580949105818, - 48.8543313190385 - ], - [ - 2.35584658014739, - 48.8543634875661 - ], - [ - 2.35525315472486, - 48.8545919944435 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "SPZ rue de l'hotel de ville", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39627516474453, - 48.8732260709802 - ], - [ - 2.39632599639637, - 48.8731449902139 - ], - [ - 2.3963684, - 48.8731002 - ], - [ - 2.3965561, - 48.8731108 - ], - [ - 2.3964971, - 48.8732148 - ], - [ - 2.3963469, - 48.8733895 - ], - [ - 2.3962504, - 48.8735624 - ], - [ - 2.3961752, - 48.87373 - ], - [ - 2.3961448985589, - 48.8737571648885 - ], - [ - 2.3961055, - 48.8737406 - ], - [ - 2.39612854819769, - 48.8736393290103 - ], - [ - 2.3961431, - 48.8735006 - ], - [ - 2.39621656546518, - 48.8733401 - ], - [ - 2.39627516474453, - 48.8732260709802 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Pixerecourt", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34927285558464, - 48.84046409921 - ], - [ - 2.34929396035358, - 48.8404177982863 - ], - [ - 2.35006780187663, - 48.840431688568 - ], - [ - 2.35006780187663, - 48.8404965098306 - ], - [ - 2.34927285558464, - 48.84046409921 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Aire pietonne - Rue de l'Arbalete v3", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37117889020046, - 48.8804768912974 - ], - [ - 2.37114912814325, - 48.8804506031444 - ], - [ - 2.37149137060415, - 48.8802866874535 - ], - [ - 2.37206721633074, - 48.8800069469327 - ], - [ - 2.37210093919536, - 48.8800207124962 - ], - [ - 2.37155184899349, - 48.8802863156847 - ], - [ - 2.37117889020046, - 48.8804768912974 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Lepage", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.45174599876648, - 48.8438675026056 - ], - [ - 2.45047890960331, - 48.8422677733618 - ], - [ - 2.46007258469479, - 48.8396468299143 - ], - [ - 2.4621413016956, - 48.8419954739338 - ], - [ - 2.45174599876648, - 48.8438675026056 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37964385441323, - 48.858377903809 - ], - [ - 2.37982973515643, - 48.8582405074795 - ], - [ - 2.38004365565292, - 48.8580324111878 - ], - [ - 2.38007134434708, - 48.8580479035269 - ], - [ - 2.37968999328873, - 48.8583734519026 - ], - [ - 2.37964011254473, - 48.8583827934154 - ], - [ - 2.37964385441323, - 48.858377903809 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Mairie 11eme + Place Leon Blum", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38536410044748, - 48.8455514277738 - ], - [ - 2.38513583161329, - 48.8455715479508 - ], - [ - 2.385772, - 48.845377 - ], - [ - 2.387086, - 48.845346 - ], - [ - 2.38708944559071, - 48.8453418855375 - ], - [ - 2.38710746233299, - 48.8455071988712 - ], - [ - 2.386029, - 48.845512 - ], - [ - 2.38536410044748, - 48.8455514277738 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle d'Artagnan - Rue d'Artagnan", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.296013, - 48.842581 - ], - [ - 2.296757, - 48.841768 - ], - [ - 2.297844, - 48.842034 - ], - [ - 2.297568, - 48.842672 - ], - [ - 2.296013, - 48.842581 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square Saint-Lambert", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.27841648779071, - 48.8379557987191 - ], - [ - 2.27848002519417, - 48.8375990250637 - ], - [ - 2.27853591220804, - 48.8372287394108 - ], - [ - 2.27863116831265, - 48.8372464520118 - ], - [ - 2.2785654, - 48.8376876 - ], - [ - 2.27850272519298, - 48.8379617361471 - ], - [ - 2.27841648779071, - 48.8379557987191 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37365664773327, - 48.8637072798213 - ], - [ - 2.37396789489864, - 48.8633544034429 - ], - [ - 2.3734447347689, - 48.8631496468726 - ], - [ - 2.37348446844976, - 48.8630930119285 - ], - [ - 2.37409371822062, - 48.8633500469285 - ], - [ - 2.37372949281448, - 48.8637377751941 - ], - [ - 2.37365664773327, - 48.8637072798213 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Beslay/Elementaire Pihet - Passage Beslay/Rue Pihet", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3854286, - 48.8433445 - ], - [ - 2.3854822, - 48.8432704 - ], - [ - 2.3862252, - 48.843574 - ], - [ - 2.3871505, - 48.8440082 - ], - [ - 2.3870674, - 48.8440594 - ], - [ - 2.3854286, - 48.8433445 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecole Privée Rechit Homma - 12 cité Moynet", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38647601753442, - 48.8564781273857 - ], - [ - 2.38740549999011, - 48.8556088082082 - ], - [ - 2.38858079598708, - 48.8558817356224 - ], - [ - 2.38807380555707, - 48.8568470780548 - ], - [ - 2.38647601753442, - 48.8564781273857 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Passages Carriere Mainguet/Gustave Lepeu/Alexandrine/Emile Lepeu", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.288299, - 48.859535 - ], - [ - 2.289, - 48.859127 - ], - [ - 2.289426, - 48.859384 - ], - [ - 2.290041, - 48.859938 - ], - [ - 2.290073, - 48.859977 - ], - [ - 2.289426, - 48.859799 - ], - [ - 2.288832, - 48.859659 - ], - [ - 2.288564, - 48.859588 - ], - [ - 2.288299, - 48.859535 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardins du Trocadéro 1", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38175201637285, - 48.8827318736974 - ], - [ - 2.38192752455984, - 48.8825266894739 - ], - [ - 2.38203078683858, - 48.8824667000457 - ], - [ - 2.38210991797977, - 48.8824503316667 - ], - [ - 2.38221155730556, - 48.8824545737266 - ], - [ - 2.382338, - 48.882485 - ], - [ - 2.38240018041451, - 48.8825266210541 - ], - [ - 2.38242881974152, - 48.8825613684359 - ], - [ - 2.38241895088149, - 48.8826090579152 - ], - [ - 2.3823563279286, - 48.8827196790334 - ], - [ - 2.38224831155445, - 48.8828866790988 - ], - [ - 2.38212724606312, - 48.882846037269 - ], - [ - 2.38175201637285, - 48.8827318736974 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Mairie du 19eme", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3180891, - 48.8354306 - ], - [ - 2.3184405, - 48.8356345 - ], - [ - 2.3187167, - 48.8357868 - ], - [ - 2.3186819, - 48.8358172 - ], - [ - 2.3180462, - 48.8354606 - ], - [ - 2.3180891, - 48.8354306 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.4070277, - 48.8551792 - ], - [ - 2.40708898480964, - 48.8551340263208 - ], - [ - 2.40718178797533, - 48.855068951028 - ], - [ - 2.40730149114107, - 48.8549753966418 - ], - [ - 2.40758611519042, - 48.8549412247768 - ], - [ - 2.4079531, - 48.8546192055083 - ], - [ - 2.40800364304114, - 48.8546452648361 - ], - [ - 2.40762444620563, - 48.8549668280911 - ], - [ - 2.40770783734545, - 48.8552414018129 - ], - [ - 2.4076715, - 48.8552922 - ], - [ - 2.40756243038077, - 48.8549882368052 - ], - [ - 2.40731865442887, - 48.8550068402442 - ], - [ - 2.40708721519036, - 48.855202601793 - ], - [ - 2.4070277, - 48.8551792 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle et élémentaire Mouraud", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2836313, - 48.8383317 - ], - [ - 2.2835294, - 48.8382735 - ], - [ - 2.28447878703554, - 48.8377125274936 - ], - [ - 2.28463605439744, - 48.8377585923941 - ], - [ - 2.2836313, - 48.8383317 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux ecoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37688520225599, - 48.8950359219242 - ], - [ - 2.37702290169276, - 48.894971185924 - ], - [ - 2.37737444180995, - 48.8948032380411 - ], - [ - 2.377531, - 48.894951 - ], - [ - 2.37798789945748, - 48.895402200033 - ], - [ - 2.377548644066, - 48.8956224204042 - ], - [ - 2.37688520225599, - 48.8950359219242 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin du Ver Tetu", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40699827641735, - 48.8623125513334 - ], - [ - 2.40645182925429, - 48.8618841524002 - ], - [ - 2.40677850615708, - 48.861407923143 - ], - [ - 2.40830170761736, - 48.8615032315231 - ], - [ - 2.40839381693885, - 48.8619403895657 - ], - [ - 2.40770208537348, - 48.8622388137657 - ], - [ - 2.4071553378427, - 48.8624326269093 - ], - [ - 2.40699827641735, - 48.8623125513334 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de l'Hospice Debrousse", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38778738173073, - 48.8659024777755 - ], - [ - 2.38795689293894, - 48.8656012918699 - ], - [ - 2.38837744730771, - 48.865747119701 - ], - [ - 2.38875518133294, - 48.8658973060062 - ], - [ - 2.38869158548006, - 48.8659834104788 - ], - [ - 2.389065, - 48.866147 - ], - [ - 2.38933589461539, - 48.8661936496796 - ], - [ - 2.38927192572815, - 48.8663847180734 - ], - [ - 2.38858047842042, - 48.8661789039177 - ], - [ - 2.38778738173073, - 48.8659024777755 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Toussaint Louverture", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.286602, - 48.860555 - ], - [ - 2.287492, - 48.86023 - ], - [ - 2.287736, - 48.860098 - ], - [ - 2.287993, - 48.860118 - ], - [ - 2.288756, - 48.860262 - ], - [ - 2.28935, - 48.860315 - ], - [ - 2.289837, - 48.860433 - ], - [ - 2.290122, - 48.860614 - ], - [ - 2.290273, - 48.860692 - ], - [ - 2.290484, - 48.860704 - ], - [ - 2.290598, - 48.860761 - ], - [ - 2.290751, - 48.860832 - ], - [ - 2.290758, - 48.86093 - ], - [ - 2.290827, - 48.86104 - ], - [ - 2.290913, - 48.861198 - ], - [ - 2.291092, - 48.861302 - ], - [ - 2.291117, - 48.861506 - ], - [ - 2.291315, - 48.862401 - ], - [ - 2.291353, - 48.862707 - ], - [ - 2.291144, - 48.8629 - ], - [ - 2.290876, - 48.862988 - ], - [ - 2.290491, - 48.863117 - ], - [ - 2.290023, - 48.863089 - ], - [ - 2.289579, - 48.862978 - ], - [ - 2.289309, - 48.862842 - ], - [ - 2.289105, - 48.862697 - ], - [ - 2.288312, - 48.862509 - ], - [ - 2.287797, - 48.8623 - ], - [ - 2.287451, - 48.862007 - ], - [ - 2.287292, - 48.861733 - ], - [ - 2.287176, - 48.861394 - ], - [ - 2.287086, - 48.86113 - ], - [ - 2.286927, - 48.860825 - ], - [ - 2.286602, - 48.860555 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Trocadéro + Jardins", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.388545, - 48.862644 - ], - [ - 2.389627, - 48.860205 - ], - [ - 2.39098, - 48.85987 - ], - [ - 2.392475, - 48.858162 - ], - [ - 2.39346, - 48.85771 - ], - [ - 2.394592, - 48.857077 - ], - [ - 2.394922, - 48.857358 - ], - [ - 2.39513, - 48.85759 - ], - [ - 2.39645, - 48.85797 - ], - [ - 2.39665, - 48.85831 - ], - [ - 2.39815, - 48.85869 - ], - [ - 2.3998, - 48.8598 - ], - [ - 2.3997, - 48.8605 - ], - [ - 2.397821, - 48.862103 - ], - [ - 2.396697, - 48.863281 - ], - [ - 2.39537, - 48.864201 - ], - [ - 2.388545, - 48.862644 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Pere Lachaise", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.44757358772296, - 48.8333769690638 - ], - [ - 2.45368443562271, - 48.8287054935144 - ], - [ - 2.45923010711979, - 48.8246489314369 - ], - [ - 2.46097518324973, - 48.8224276788737 - ], - [ - 2.46295293619554, - 48.8264105445013 - ], - [ - 2.45283149464655, - 48.834183879927 - ], - [ - 2.44757358772296, - 48.8333769690638 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32637856512417, - 48.8329727177193 - ], - [ - 2.32636330995595, - 48.8329418366137 - ], - [ - 2.32718825871872, - 48.8327394048354 - ], - [ - 2.32720351388696, - 48.8327640853919 - ], - [ - 2.32637856512417, - 48.8329727177193 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "parvis mairie", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34931113368092, - 48.8441460983078 - ], - [ - 2.3493304, - 48.844052 - ], - [ - 2.34934681087896, - 48.8439667969802 - ], - [ - 2.34940565543878, - 48.8439591223461 - ], - [ - 2.3493706, - 48.8440582 - ], - [ - 2.34937390052141, - 48.8441330237977 - ], - [ - 2.34931113368092, - 48.8441460983078 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux ecoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37534343008266, - 48.8349733221704 - ], - [ - 2.37408237792771, - 48.8342686472696 - ], - [ - 2.37622513983328, - 48.8323574828897 - ], - [ - 2.37761414814915, - 48.8331178749036 - ], - [ - 2.37534343008266, - 48.8349733221704 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 5", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32116806774597, - 48.8841956775883 - ], - [ - 2.32146096116949, - 48.8839329558852 - ], - [ - 2.32215695700257, - 48.8840771932175 - ], - [ - 2.32232934206172, - 48.8841788344439 - ], - [ - 2.32171572087509, - 48.8845430769641 - ], - [ - 2.32116806774597, - 48.8841956775883 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parvis Mairie 17e", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.28184555589877, - 48.8649488301726 - ], - [ - 2.28186740058788, - 48.8649200897127 - ], - [ - 2.28267358153104, - 48.86522797171 - ], - [ - 2.28262864673164, - 48.8652575312706 - ], - [ - 2.28184555589877, - 48.8649488301726 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecole Polyvalente Decamps", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.25862369777155, - 48.880771023397 - ], - [ - 2.25571426713111, - 48.8746480138407 - ], - [ - 2.24771333286887, - 48.8763701860337 - ], - [ - 2.23345712273022, - 48.8677587321866 - ], - [ - 2.22720184685383, - 48.8485211334654 - ], - [ - 2.25280483648933, - 48.8458406822552 - ], - [ - 2.2573144539825, - 48.8481382206485 - ], - [ - 2.27782593999751, - 48.8798143525592 - ], - [ - 2.25862369777155, - 48.880771023397 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "NGZ ESCOOTER BOIS DE BOULOGNE", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3395861, - 48.8262103 - ], - [ - 2.3395834, - 48.8261855 - ], - [ - 2.3404096, - 48.8261343 - ], - [ - 2.3404095, - 48.8261589 - ], - [ - 2.3395861, - 48.8262103 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.27545469227438, - 48.8640263964049 - ], - [ - 2.27545199227438, - 48.8638869964049 - ], - [ - 2.27668309227438, - 48.8637475964049 - ], - [ - 2.27675819227438, - 48.8637475964049 - ], - [ - 2.27681719227438, - 48.8638587964049 - ], - [ - 2.27545469227438, - 48.8640263964049 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Mairie du 16eme", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37496242667383, - 48.8974409825983 - ], - [ - 2.374709, - 48.897254 - ], - [ - 2.375047, - 48.897184 - ], - [ - 2.376259, - 48.897476 - ], - [ - 2.377203, - 48.897653 - ], - [ - 2.377144, - 48.897727 - ], - [ - 2.376463, - 48.8976173426092 - ], - [ - 2.375873, - 48.897517252572 - ], - [ - 2.37496242667383, - 48.8974409825983 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Cesaria Evora", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3768028, - 48.8710474 - ], - [ - 2.3775028, - 48.8706222 - ], - [ - 2.3775967, - 48.870654 - ], - [ - 2.3768269, - 48.8711127 - ], - [ - 2.3768028, - 48.8710474 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Présentation -4 bis rue Présentation", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35582614582931, - 48.8579787381382 - ], - [ - 2.35544297671837, - 48.85743746404 - ], - [ - 2.35548572108174, - 48.8574268145347 - ], - [ - 2.35587813455595, - 48.8579647373203 - ], - [ - 2.35582614582931, - 48.8579787381382 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 102", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35247212525833, - 48.8621340442967 - ], - [ - 2.35225657008186, - 48.861815666491 - ], - [ - 2.35191526315831, - 48.8613196315177 - ], - [ - 2.35122113856928, - 48.8614848643353 - ], - [ - 2.35072341861194, - 48.8604202713987 - ], - [ - 2.3501348954066, - 48.8594515751246 - ], - [ - 2.35067156538706, - 48.8593100537987 - ], - [ - 2.351350417182, - 48.859087119761 - ], - [ - 2.3533052772061, - 48.8619827186863 - ], - [ - 2.35296186728834, - 48.8620370730388 - ], - [ - 2.35247212525833, - 48.8621340442967 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Beaubourg", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32710173646294, - 48.8319312780501 - ], - [ - 2.32688839379458, - 48.8316144298034 - ], - [ - 2.32689797329144, - 48.831613348327 - ], - [ - 2.32711740105517, - 48.8319291914709 - ], - [ - 2.32710173646294, - 48.8319312780501 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square Aspirant Dunand_2", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36333155532332, - 48.8680756934641 - ], - [ - 2.36312621503872, - 48.8678951506431 - ], - [ - 2.36474277766168, - 48.8669601592092 - ], - [ - 2.36493533715688, - 48.8671261803147 - ], - [ - 2.36333155532332, - 48.8680756934641 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Place de la République", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2707527017765, - 48.8579982364115 - ], - [ - 2.27065034757709, - 48.8580992487711 - ], - [ - 2.26821090581683, - 48.857358486734 - ], - [ - 2.2707527017765, - 48.8579982364115 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin du Ranelagh 4", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35527448226731, - 48.8322957646527 - ], - [ - 2.35545650907549, - 48.8320224953776 - ], - [ - 2.35565828567412, - 48.832025 - ], - [ - 2.35579534822723, - 48.8323071702239 - ], - [ - 2.35527448226731, - 48.8322957646527 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 8", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2966354, - 48.8355381 - ], - [ - 2.2963873, - 48.8352751 - ], - [ - 2.2964409, - 48.8352547 - ], - [ - 2.296685, - 48.8355186 - ], - [ - 2.2966354, - 48.8355381 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.25292388591035, - 48.8675709659082 - ], - [ - 2.26016164688083, - 48.8659869942446 - ], - [ - 2.25837286273964, - 48.8639914220867 - ], - [ - 2.25729733661591, - 48.861797649584 - ], - [ - 2.24950301512384, - 48.862675003955 - ], - [ - 2.24767326207126, - 48.8591528817385 - ], - [ - 2.26189515048148, - 48.8590384958447 - ], - [ - 2.2656505635594, - 48.863773853241 - ], - [ - 2.26412058045364, - 48.8680513030055 - ], - [ - 2.26300786546824, - 48.8709332287599 - ], - [ - 2.25292388591035, - 48.8675709659082 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 20 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34515234612263, - 48.84645097815 - ], - [ - 2.3452193119217, - 48.8463639139388 - ], - [ - 2.3452312, - 48.8463896 - ], - [ - 2.34526205, - 48.84644785 - ], - [ - 2.3452929, - 48.8465061 - ], - [ - 2.34526672175923, - 48.8465068883152 - ], - [ - 2.34520875439741, - 48.8464838186959 - ], - [ - 2.34515234612263, - 48.84645097815 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Monuments - Pantheon", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3292019250408, - 48.8704082474756 - ], - [ - 2.329415, - 48.871261 - ], - [ - 2.329206, - 48.871417 - ], - [ - 2.328938, - 48.871342 - ], - [ - 2.328954, - 48.871244 - ], - [ - 2.329238, - 48.871064 - ], - [ - 2.32907039152277, - 48.870409262026 - ], - [ - 2.3292019250408, - 48.8704082474756 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Place Edouard VII", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40905800222615, - 48.852550860962 - ], - [ - 2.40970888212155, - 48.8513388388782 - ], - [ - 2.41023901767042, - 48.8518770113869 - ], - [ - 2.410039120345, - 48.8526599731031 - ], - [ - 2.40905800222615, - 48.852550860962 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de la Gare de Charonne", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38395, - 48.860015 - ], - [ - 2.384492, - 48.859049 - ], - [ - 2.385748, - 48.859343 - ], - [ - 2.385137, - 48.860366 - ], - [ - 2.38463, - 48.860241 - ], - [ - 2.38452, - 48.860176 - ], - [ - 2.38395, - 48.860015 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square de la Roquette", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33972802173652, - 48.8670995943304 - ], - [ - 2.33942577950046, - 48.8665099378522 - ], - [ - 2.33952980100448, - 48.8664837917247 - ], - [ - 2.33987664596375, - 48.8670501562067 - ], - [ - 2.33972802173652, - 48.8670995943304 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 77", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.386762, - 48.861375 - ], - [ - 2.387003, - 48.8608 - ], - [ - 2.387475, - 48.860884 - ], - [ - 2.387416, - 48.86104 - ], - [ - 2.387931, - 48.861181 - ], - [ - 2.387717, - 48.861597 - ], - [ - 2.387427, - 48.861594 - ], - [ - 2.387379, - 48.861675 - ], - [ - 2.386783, - 48.861481 - ], - [ - 2.386762, - 48.861375 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin des Jeunes Pouces", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33693453091556, - 48.8675945583974 - ], - [ - 2.33659476038556, - 48.8669425877526 - ], - [ - 2.33665916038556, - 48.8669324524291 - ], - [ - 2.33698823091556, - 48.8675839583974 - ], - [ - 2.33693453091556, - 48.8675945583974 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 76", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37425090397426, - 48.8323317764088 - ], - [ - 2.37371071199007, - 48.8320247115126 - ], - [ - 2.37485593201721, - 48.8309568306261 - ], - [ - 2.37552146539255, - 48.8301579319006 - ], - [ - 2.37614898698564, - 48.8304824359337 - ], - [ - 2.37425090397426, - 48.8323317764088 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "DVD Demo No Go Zone 1", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.22337320337346, - 48.8488745684919 - ], - [ - 2.22105344931992, - 48.8425026510011 - ], - [ - 2.22643258915537, - 48.8418831157789 - ], - [ - 2.22871872358559, - 48.8490073081515 - ], - [ - 2.22337320337346, - 48.8488745684919 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "No parking rock en seine 1", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": false, - "ride_end_allowed": false - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39191256953936, - 48.8781825237558 - ], - [ - 2.39183322035032, - 48.87806 - ], - [ - 2.391931, - 48.878076 - ], - [ - 2.39208029355061, - 48.8779582433423 - ], - [ - 2.392169, - 48.877871 - ], - [ - 2.39234595277213, - 48.8778273168104 - ], - [ - 2.39284840704871, - 48.8778941625255 - ], - [ - 2.3928888338305, - 48.8780118886499 - ], - [ - 2.392808, - 48.878016 - ], - [ - 2.392722, - 48.878235 - ], - [ - 2.392124, - 48.878182 - ], - [ - 2.391998, - 48.87823 - ], - [ - 2.39191256953936, - 48.8781825237558 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Compans", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36128622099802, - 48.875393637161 - ], - [ - 2.36126513708107, - 48.8753565903577 - ], - [ - 2.36200866106121, - 48.8749371485029 - ], - [ - 2.36211240106566, - 48.8749428574508 - ], - [ - 2.36128622099802, - 48.875393637161 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 17", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38759331753337, - 48.8412671169851 - ], - [ - 2.38766496614607, - 48.8411488887954 - ], - [ - 2.38777603926675, - 48.8410364266561 - ], - [ - 2.38789241976851, - 48.840928517427 - ], - [ - 2.388132, - 48.841116 - ], - [ - 2.3878302877455, - 48.8412305320695 - ], - [ - 2.38759331753337, - 48.8412671169851 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Mairie du 12eme + Square Eugene Thomas", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.395137, - 48.841249 - ], - [ - 2.395159, - 48.841051 - ], - [ - 2.396699, - 48.841094 - ], - [ - 2.397943, - 48.841034 - ], - [ - 2.39823251932845, - 48.841079340986 - ], - [ - 2.3983281505474, - 48.8412486647718 - ], - [ - 2.39694, - 48.841327 - ], - [ - 2.395856, - 48.841352 - ], - [ - 2.395137, - 48.841249 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Coulée verte René-Dumont 11", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.25580811465852, - 48.8734280332631 - ], - [ - 2.25294023282831, - 48.8692831858182 - ], - [ - 2.2634557995396, - 48.8727222785428 - ], - [ - 2.25746641367607, - 48.8742107677633 - ], - [ - 2.25580811465852, - 48.8734280332631 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37685950676561, - 48.8474840360399 - ], - [ - 2.37640612148653, - 48.847166113332 - ], - [ - 2.37674058603551, - 48.8469802498911 - ], - [ - 2.37720140386068, - 48.8472883915355 - ], - [ - 2.37685950676561, - 48.8474840360399 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Hector Malot", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33675, - 48.823747 - ], - [ - 2.33548049651362, - 48.8216296205058 - ], - [ - 2.34065491608612, - 48.8203783513312 - ], - [ - 2.339453, - 48.82403 - ], - [ - 2.33675, - 48.823747 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 108", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36668581142268, - 48.8575654171118 - ], - [ - 2.36658560616428, - 48.8573116463957 - ], - [ - 2.36699477805943, - 48.8572318219695 - ], - [ - 2.36699070172442, - 48.8575158265688 - ], - [ - 2.36668581142268, - 48.8575654171118 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Arnaud Beltrame", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3932448689448, - 48.8699231205669 - ], - [ - 2.39338676765942, - 48.869748789738 - ], - [ - 2.39382598467537, - 48.8699199063055 - ], - [ - 2.39369146468256, - 48.8700897708171 - ], - [ - 2.3932448689448, - 48.8699231205669 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin du Carre du Baudoin", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37857933303447, - 48.885868 - ], - [ - 2.3786494997955, - 48.8857908267933 - ], - [ - 2.37960683340149, - 48.8860389197643 - ], - [ - 2.38002400008122, - 48.8862143726802 - ], - [ - 2.38096450036844, - 48.8866270944431 - ], - [ - 2.38084450028441, - 48.8867226148098 - ], - [ - 2.37974333327824, - 48.8861396005156 - ], - [ - 2.37857933303447, - 48.885868 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecole Polyvalente + maternelle + élémentaire Tandou", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34751412716415, - 48.8399501568447 - ], - [ - 2.34774627962065, - 48.8400057184664 - ], - [ - 2.34773220977519, - 48.8400473896426 - ], - [ - 2.34751412716415, - 48.8399501568447 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Aire pietonne - Rue de l'Arbalete", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.379892802361, - 48.8727079954998 - ], - [ - 2.38074468006814, - 48.871878968703 - ], - [ - 2.38077371406155, - 48.8718920567221 - ], - [ - 2.38031376212034, - 48.8723725329257 - ], - [ - 2.37997108460092, - 48.8727251085939 - ], - [ - 2.379892802361, - 48.8727079954998 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle et élémentaire Tourtille", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.42204771854878, - 48.8346687719233 - ], - [ - 2.42256177013064, - 48.825682462015 - ], - [ - 2.42953002490253, - 48.8249680000212 - ], - [ - 2.43741214915249, - 48.8208314409168 - ], - [ - 2.44215284707192, - 48.8195904066093 - ], - [ - 2.44398058602815, - 48.8219220214571 - ], - [ - 2.44642164025959, - 48.8212274208407 - ], - [ - 2.45107558406989, - 48.8210861056981 - ], - [ - 2.45591852294678, - 48.8242490907771 - ], - [ - 2.45385583846316, - 48.8264811331337 - ], - [ - 2.44228315534428, - 48.8272844262184 - ], - [ - 2.44359911971441, - 48.8334720443847 - ], - [ - 2.43552729335397, - 48.8388417820093 - ], - [ - 2.42204771854878, - 48.8346687719233 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 20 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38958430294602, - 48.8729722197693 - ], - [ - 2.38963881176391, - 48.8729530938405 - ], - [ - 2.38997549411498, - 48.8732680587148 - ], - [ - 2.38993352500181, - 48.8732937409378 - ], - [ - 2.38958430294602, - 48.8729722197693 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecole Elementaire Levert", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.402312, - 48.879323 - ], - [ - 2.402132, - 48.879279 - ], - [ - 2.402089, - 48.879188 - ], - [ - 2.402253, - 48.879108 - ], - [ - 2.402358, - 48.879008 - ], - [ - 2.402406, - 48.878898 - ], - [ - 2.40240074431797, - 48.8788165418624 - ], - [ - 2.40281417689478, - 48.8787641241044 - ], - [ - 2.402886, - 48.878948 - ], - [ - 2.40294, - 48.879096 - ], - [ - 2.402838, - 48.879156 - ], - [ - 2.40258, - 48.879046 - ], - [ - 2.40251, - 48.879048 - ], - [ - 2.402403, - 48.879186 - ], - [ - 2.402312, - 48.879323 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de Notre Dame de Fatima", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38527861543128, - 48.8524835921663 - ], - [ - 2.38548701633718, - 48.8520907380429 - ], - [ - 2.38565035758685, - 48.8517979485309 - ], - [ - 2.38601083482777, - 48.8518498353847 - ], - [ - 2.38587847209111, - 48.8521870976276 - ], - [ - 2.38544195668209, - 48.8525243598704 - ], - [ - 2.38527861543128, - 48.8524835921663 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de la Folie Titon", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.45160921719733, - 48.8403493978724 - ], - [ - 2.45532150900851, - 48.8354865558788 - ], - [ - 2.46369236309405, - 48.8291857186808 - ], - [ - 2.46412910330693, - 48.8322763424046 - ], - [ - 2.46747744493985, - 48.8337856474949 - ], - [ - 2.46882406059785, - 48.8355584239755 - ], - [ - 2.45160921719733, - 48.8403493978724 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33784601503565, - 48.8529101767944 - ], - [ - 2.3378715, - 48.8531327 - ], - [ - 2.33796661646752, - 48.8535792888894 - ], - [ - 2.33792616372432, - 48.853593194552 - ], - [ - 2.3378474, - 48.8531416 - ], - [ - 2.33777942052345, - 48.85292257675 - ], - [ - 2.33784601503565, - 48.8529101767944 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "(Piéton)Rue Grégoire de Tours", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33748922490595, - 48.8680780227138 - ], - [ - 2.3374557779567, - 48.8679802092119 - ], - [ - 2.33761232814477, - 48.8679488215929 - ], - [ - 2.33765337198056, - 48.8680416865536 - ], - [ - 2.33748922490595, - 48.8680780227138 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square Louvois + alentour piéton", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38806281680369, - 48.8921565573005 - ], - [ - 2.38741087915115, - 48.891874112909 - ], - [ - 2.38703518046485, - 48.8917048050265 - ], - [ - 2.38764700589893, - 48.8908502508801 - ], - [ - 2.388212, - 48.891023 - ], - [ - 2.389264, - 48.890169 - ], - [ - 2.38963698217862, - 48.8898716951909 - ], - [ - 2.39007597772206, - 48.8900299717042 - ], - [ - 2.39051199108982, - 48.8902133896132 - ], - [ - 2.390497, - 48.890236 - ], - [ - 2.389725, - 48.890913 - ], - [ - 2.389189, - 48.8914 - ], - [ - 2.388502, - 48.892074 - ], - [ - 2.388302, - 48.892248 - ], - [ - 2.38806281680369, - 48.8921565573005 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Villette 2", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37316907158019, - 48.8894570659641 - ], - [ - 2.37308807158019, - 48.8893290659641 - ], - [ - 2.37352807158019, - 48.8891700659641 - ], - [ - 2.37407007158019, - 48.8896140659641 - ], - [ - 2.37429807158019, - 48.8898100659641 - ], - [ - 2.37410707158019, - 48.8898880659641 - ], - [ - 2.37379607158019, - 48.8898840659641 - ], - [ - 2.37363307158019, - 48.8898220659641 - ], - [ - 2.37340207158019, - 48.8898420659641 - ], - [ - 2.37339707158019, - 48.8897840659641 - ], - [ - 2.37352507158019, - 48.8897270659641 - ], - [ - 2.37359007158019, - 48.8896090659641 - ], - [ - 2.37359207158019, - 48.8895100659641 - ], - [ - 2.37341007158019, - 48.8894470659641 - ], - [ - 2.37316907158019, - 48.8894570659641 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de l'Ilot Riquet", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2946, - 48.828201 - ], - [ - 2.29442075983801, - 48.8277516263967 - ], - [ - 2.29924543234423, - 48.8267434566993 - ], - [ - 2.29946921832999, - 48.8271252844759 - ], - [ - 2.2946, - 48.828201 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 104", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35503335887577, - 48.8547889690614 - ], - [ - 2.35504775059808, - 48.8547857729666 - ], - [ - 2.35507404138462, - 48.8548423495623 - ], - [ - 2.3550997444555, - 48.8548966062418 - ], - [ - 2.35512867329527, - 48.8549592336091 - ], - [ - 2.35517241441956, - 48.855053647302 - ], - [ - 2.35519077209833, - 48.8550894668258 - ], - [ - 2.3552024122852, - 48.8551147453675 - ], - [ - 2.35525997303571, - 48.8552208102978 - ], - [ - 2.35523745460717, - 48.8553080545825 - ], - [ - 2.3552632, - 48.8553408 - ], - [ - 2.35525175981313, - 48.8553454136424 - ], - [ - 2.35522207423265, - 48.8553096565302 - ], - [ - 2.35524508745447, - 48.8552199331535 - ], - [ - 2.35518760921426, - 48.8551193687822 - ], - [ - 2.3551582, - 48.8550523 - ], - [ - 2.35514219385737, - 48.8550158039047 - ], - [ - 2.355118458875, - 48.8549631453257 - ], - [ - 2.35508425887577, - 48.8548982058604 - ], - [ - 2.3550574073404, - 48.8548434452916 - ], - [ - 2.35503335887577, - 48.8547889690614 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 96", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38334960602064, - 48.8712146957486 - ], - [ - 2.38363202570245, - 48.8709962150951 - ], - [ - 2.38406754176601, - 48.8707323897612 - ], - [ - 2.38428008353115, - 48.8706356069785 - ], - [ - 2.38447045180817, - 48.8703777828427 - ], - [ - 2.38497, - 48.870446 - ], - [ - 2.385501, - 48.870504 - ], - [ - 2.386332, - 48.870564 - ], - [ - 2.387032, - 48.87061 - ], - [ - 2.387866, - 48.870693 - ], - [ - 2.38800396144691, - 48.8707643487394 - ], - [ - 2.38820492931955, - 48.8709974786932 - ], - [ - 2.38871689314487, - 48.8715682118865 - ], - [ - 2.3871215032129, - 48.8713992618157 - ], - [ - 2.386506, - 48.871322 - ], - [ - 2.386029, - 48.87129 - ], - [ - 2.385688, - 48.87131 - ], - [ - 2.385357, - 48.871418 - ], - [ - 2.385119, - 48.8715 - ], - [ - 2.384889, - 48.871618 - ], - [ - 2.384756, - 48.871777 - ], - [ - 2.38436, - 48.871721 - ], - [ - 2.383958, - 48.871629 - ], - [ - 2.383878, - 48.872152 - ], - [ - 2.383894, - 48.872346 - ], - [ - 2.383744, - 48.872483 - ], - [ - 2.384039, - 48.872635 - ], - [ - 2.383867, - 48.872776 - ], - [ - 2.383626, - 48.872642 - ], - [ - 2.383373, - 48.872469 - ], - [ - 2.38330603212821, - 48.872362909193 - ], - [ - 2.38330303855312, - 48.8722425630699 - ], - [ - 2.38336283293677, - 48.8720801909478 - ], - [ - 2.38362006425545, - 48.8715083042385 - ], - [ - 2.38334960602064, - 48.8712146957486 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parc de Belleville 2", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2965755, - 48.851213 - ], - [ - 2.296542, - 48.8511874 - ], - [ - 2.2969202, - 48.85095 - ], - [ - 2.2969578, - 48.8509694 - ], - [ - 2.2965755, - 48.851213 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 38", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.29665252630846, - 48.8608651797976 - ], - [ - 2.29690752029794, - 48.8605966192494 - ], - [ - 2.29722295574808, - 48.8604017870503 - ], - [ - 2.29811489740018, - 48.8605908206135 - ], - [ - 2.2980990991235, - 48.8605799398473 - ], - [ - 2.29851319389221, - 48.8606744563851 - ], - [ - 2.29853744308318, - 48.8607289700539 - ], - [ - 2.29940439502317, - 48.8609037399238 - ], - [ - 2.29894657910467, - 48.8616865669119 - ], - [ - 2.29808201578163, - 48.8614402496771 - ], - [ - 2.29802285938595, - 48.8614641793028 - ], - [ - 2.29775941448318, - 48.8613260319692 - ], - [ - 2.29775353369988, - 48.8613005308523 - ], - [ - 2.29665252630846, - 48.8608651797976 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "NGZ Jardin musée quai branly", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32273224195231, - 48.8326084090206 - ], - [ - 2.32461917525511, - 48.8320460593498 - ], - [ - 2.32463111642698, - 48.8320574444005 - ], - [ - 2.32459403634062, - 48.8320648933754 - ], - [ - 2.32366299248648, - 48.8323418533007 - ], - [ - 2.32319892960376, - 48.832480333282 - ], - [ - 2.32296543911805, - 48.8325510139323 - ], - [ - 2.32274799812112, - 48.8326202539505 - ], - [ - 2.32273224195231, - 48.8326084090206 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles 14eme", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3039682, - 48.8366818 - ], - [ - 2.3039701, - 48.8367087 - ], - [ - 2.3035699, - 48.836762 - ], - [ - 2.3035619, - 48.8367321 - ], - [ - 2.3039682, - 48.8366818 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.28243427846402, - 48.8556099575603 - ], - [ - 2.28322005117198, - 48.8551476341274 - ], - [ - 2.28354838635334, - 48.854951508463 - ], - [ - 2.28464549424266, - 48.8557852400883 - ], - [ - 2.28352678976535, - 48.8564401186686 - ], - [ - 2.28243427846402, - 48.8556099575603 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parc de Passy", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38474171308352, - 48.872272305598 - ], - [ - 2.38476854868796, - 48.8722509928291 - ], - [ - 2.38536511257338, - 48.8725545601613 - ], - [ - 2.38533818272625, - 48.8725746411408 - ], - [ - 2.38474171308352, - 48.872272305598 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle du Pere Julien d'Huit", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32639262822359, - 48.8327431779614 - ], - [ - 2.32627570325192, - 48.8325553281006 - ], - [ - 2.32685646248582, - 48.8324215299529 - ], - [ - 2.32694550615589, - 48.8326175691563 - ], - [ - 2.32639262822359, - 48.8327431779614 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square Ferdinand-Brunot", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.24906952942703, - 48.8736725372618 - ], - [ - 2.24369408656065, - 48.8672180854049 - ], - [ - 2.24440405071277, - 48.8670512926679 - ], - [ - 2.24724390732123, - 48.8690694474531 - ], - [ - 2.24944986736611, - 48.8703036507643 - ], - [ - 2.25236579156211, - 48.8729220623833 - ], - [ - 2.24906952942703, - 48.8736725372618 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.27569939835511, - 48.8438066728047 - ], - [ - 2.27543699783577, - 48.8435006180199 - ], - [ - 2.275998, - 48.843282 - ], - [ - 2.27628, - 48.843584 - ], - [ - 2.27569939835511, - 48.8438066728047 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de Cévennes", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3895271811301, - 48.8407521908109 - ], - [ - 2.3899643811301, - 48.8402260908109 - ], - [ - 2.3900770811301, - 48.8402560908109 - ], - [ - 2.3897551811301, - 48.8406991908109 - ], - [ - 2.3895271811301, - 48.8407521908109 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Elisa Lemonnier - 15 rue Elisa Lemonnier", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38829152092598, - 48.8405110337542 - ], - [ - 2.3884247813889, - 48.8404609866034 - ], - [ - 2.38890012756791, - 48.8408500753298 - ], - [ - 2.38876374790809, - 48.8409057849141 - ], - [ - 2.38829152092598, - 48.8405110337542 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Élémentaire Bignon - Rue Bignon", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3055543229577, - 48.8781538221889 - ], - [ - 2.3055783485733, - 48.8781305448494 - ], - [ - 2.30559847940897, - 48.878107986328 - ], - [ - 2.30628528728929, - 48.8784291635113 - ], - [ - 2.30622508965587, - 48.8784841962392 - ], - [ - 2.30552682798229, - 48.8781804768074 - ], - [ - 2.3055543229577, - 48.8781538221889 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "EIB Primaire Monceau - École Internationale Bilingue", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.30505861553679, - 48.8687320879519 - ], - [ - 2.3050760758445, - 48.8687603877511 - ], - [ - 2.30484176168328, - 48.8689125461123 - ], - [ - 2.30480156168328, - 48.8688772461123 - ], - [ - 2.30505861553679, - 48.8687320879519 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecole Robert Estienne", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.325668, - 48.840198 - ], - [ - 2.323909, - 48.837882 - ], - [ - 2.327568, - 48.836586 - ], - [ - 2.329397, - 48.839023 - ], - [ - 2.325668, - 48.840198 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Cimetiere Montparnasse 1", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3074746, - 48.8401338 - ], - [ - 2.3078635, - 48.8396712 - ], - [ - 2.307909, - 48.8396924 - ], - [ - 2.3075202, - 48.8401479 - ], - [ - 2.3074746, - 48.8401338 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34252390079766, - 48.8394572766505 - ], - [ - 2.3428042751556, - 48.8393721647037 - ], - [ - 2.34292864282767, - 48.8396024376345 - ], - [ - 2.34263912253516, - 48.839696134397 - ], - [ - 2.34252390079766, - 48.8394572766505 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Monuments", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3118417, - 48.8325982 - ], - [ - 2.3125525, - 48.8323245 - ], - [ - 2.3125954, - 48.8323668 - ], - [ - 2.3119195, - 48.8326281 - ], - [ - 2.3118417, - 48.8325982 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39297135096621, - 48.8936912409785 - ], - [ - 2.39386253425906, - 48.894131287927 - ], - [ - 2.39368717891969, - 48.8942996437286 - ], - [ - 2.39352271826349, - 48.8944369840297 - ], - [ - 2.39331552029608, - 48.8946174020465 - ], - [ - 2.3921963483354, - 48.8940051805468 - ], - [ - 2.39219994421482, - 48.8939728066295 - ], - [ - 2.39194099651257, - 48.8941199484661 - ], - [ - 2.389843, - 48.893076 - ], - [ - 2.388611, - 48.892411 - ], - [ - 2.389479, - 48.891388 - ], - [ - 2.390761, - 48.890238 - ], - [ - 2.391196, - 48.889808 - ], - [ - 2.392113, - 48.888944 - ], - [ - 2.392961, - 48.889163 - ], - [ - 2.39370975604912, - 48.8893427052659 - ], - [ - 2.39463188306303, - 48.8895950170091 - ], - [ - 2.39508398992305, - 48.8896773213312 - ], - [ - 2.39525462197649, - 48.8899096425699 - ], - [ - 2.39515382459401, - 48.8902304924373 - ], - [ - 2.39475940725958, - 48.8904149033181 - ], - [ - 2.3946318487906, - 48.8910663460418 - ], - [ - 2.39438187802457, - 48.8919922827392 - ], - [ - 2.39411620967842, - 48.8927505043989 - ], - [ - 2.39346298690494, - 48.8927401204586 - ], - [ - 2.393331, - 48.893 - ], - [ - 2.39323869254265, - 48.8935067700504 - ], - [ - 2.39297135096621, - 48.8936912409785 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Villette + Zenith", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35556552692015, - 48.8557166662758 - ], - [ - 2.35528579466077, - 48.8554077965673 - ], - [ - 2.35530830185502, - 48.8553951032512 - ], - [ - 2.3556008953673, - 48.8557018574978 - ], - [ - 2.35556552692015, - 48.8557166662758 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 97", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40978151102024, - 48.8610733704421 - ], - [ - 2.40981371102141, - 48.8608472372676 - ], - [ - 2.41088178159298, - 48.8609235359909 - ], - [ - 2.41087592238885, - 48.8609914718 - ], - [ - 2.41086044091204, - 48.8611175198541 - ], - [ - 2.40978151102024, - 48.8610733704421 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Serpollet", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.283972, - 48.862883 - ], - [ - 2.28362, - 48.8627 - ], - [ - 2.284, - 48.86244 - ], - [ - 2.28471, - 48.86244 - ], - [ - 2.28483, - 48.86208 - ], - [ - 2.285121, - 48.862098 - ], - [ - 2.285379, - 48.862058 - ], - [ - 2.285726, - 48.862064 - ], - [ - 2.286237, - 48.862322 - ], - [ - 2.286066, - 48.862494 - ], - [ - 2.285894, - 48.86276 - ], - [ - 2.283972, - 48.862883 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Cimetiere de Passy", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40133314081463, - 48.8573329059866 - ], - [ - 2.4012365945311, - 48.8572755476698 - ], - [ - 2.401704, - 48.856967 - ], - [ - 2.402085, - 48.856904 - ], - [ - 2.402099, - 48.856965 - ], - [ - 2.401927, - 48.857077 - ], - [ - 2.40143023338069, - 48.8573890127161 - ], - [ - 2.40133314081463, - 48.8573329059866 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de Vitaly", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32565787503194, - 48.8847598523799 - ], - [ - 2.326339969884, - 48.8840282657887 - ], - [ - 2.32639957040541, - 48.8840587487771 - ], - [ - 2.3257240978339, - 48.8847990442169 - ], - [ - 2.32565787503194, - 48.8847598523799 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 21", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.26774367641176, - 48.8583031974103 - ], - [ - 2.26706170564837, - 48.85738415512 - ], - [ - 2.267083, - 48.857384 - ], - [ - 2.26788708827654, - 48.8577124788558 - ], - [ - 2.268707, - 48.858014 - ], - [ - 2.269574, - 48.858284 - ], - [ - 2.26774367641176, - 48.8583031974103 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin du Ranelagh 3", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38172211260754, - 48.8883705205071 - ], - [ - 2.38231164699198, - 48.8877331274846 - ], - [ - 2.38235990601491, - 48.8877568034347 - ], - [ - 2.38178631547144, - 48.8883912248334 - ], - [ - 2.38172211260754, - 48.8883705205071 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Thionville", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.27537036396434, - 48.8652385980692 - ], - [ - 2.27519525953915, - 48.8649822349517 - ], - [ - 2.27509124740019, - 48.8648171609578 - ], - [ - 2.27495290693933, - 48.8645890302018 - ], - [ - 2.27497623641573, - 48.8645782604135 - ], - [ - 2.27522260519846, - 48.8649798520391 - ], - [ - 2.27539033756787, - 48.8652358919556 - ], - [ - 2.27537036396434, - 48.8652385980692 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square Lamartine", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.31679306739931, - 48.877789703435 - ], - [ - 2.31743048633977, - 48.8778210755833 - ], - [ - 2.31787401650124, - 48.8778374604546 - ], - [ - 2.31783798134083, - 48.877881464242 - ], - [ - 2.31742375682883, - 48.8778589718959 - ], - [ - 2.31674863397061, - 48.8778288007232 - ], - [ - 2.31679306739931, - 48.877789703435 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Mairie 8eme", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36431264116243, - 48.8257256851822 - ], - [ - 2.36394255177145, - 48.8254526256827 - ], - [ - 2.36370282058056, - 48.8250684446096 - ], - [ - 2.366885, - 48.823442 - ], - [ - 2.36734185144143, - 48.8237274897593 - ], - [ - 2.36580017941944, - 48.826116217787 - ], - [ - 2.36475428296245, - 48.826043940087 - ], - [ - 2.36431264116243, - 48.8257256851822 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Olympiade", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2896736, - 48.8704774 - ], - [ - 2.29040300700096, - 48.8698949994956 - ], - [ - 2.29046804459721, - 48.8699325759112 - ], - [ - 2.28974390319782, - 48.870505976187 - ], - [ - 2.2896736, - 48.8704774 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Paul Valéry", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.31934215025373, - 48.834139317934 - ], - [ - 2.319777, - 48.833851 - ], - [ - 2.31929693096609, - 48.8335682671972 - ], - [ - 2.31939533858069, - 48.8335244431936 - ], - [ - 2.31977198274148, - 48.8337131759805 - ], - [ - 2.31986396548384, - 48.8338048003535 - ], - [ - 2.32020456649723, - 48.8338718914958 - ], - [ - 2.319828, - 48.83398 - ], - [ - 2.32001630050745, - 48.8341552384492 - ], - [ - 2.31958815025375, - 48.8343223013385 - ], - [ - 2.31934215025373, - 48.834139317934 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Françoise Héritier", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35706209165744, - 48.855320426981 - ], - [ - 2.3568997, - 48.8551885 - ], - [ - 2.3567549, - 48.8551073 - ], - [ - 2.3564974, - 48.8549008 - ], - [ - 2.35623604362936, - 48.8546875128115 - ], - [ - 2.35629467671837, - 48.85466451284 - ], - [ - 2.3563258, - 48.8547076 - ], - [ - 2.3564572, - 48.8548126 - ], - [ - 2.3565698, - 48.8549114 - ], - [ - 2.3566892, - 48.8550094 - ], - [ - 2.3567898, - 48.855087 - ], - [ - 2.3569413, - 48.8551726 - ], - [ - 2.35710732474757, - 48.8552821727489 - ], - [ - 2.35706209165744, - 48.855320426981 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 100", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.333282, - 48.848354 - ], - [ - 2.333089, - 48.84488 - ], - [ - 2.338652, - 48.844566 - ], - [ - 2.339717, - 48.846714 - ], - [ - 2.339069, - 48.847993 - ], - [ - 2.337756, - 48.848834 - ], - [ - 2.335476, - 48.84882 - ], - [ - 2.333282, - 48.848354 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin du Luxembourg", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38192408786783, - 48.8703878616072 - ], - [ - 2.38194389305113, - 48.8703639832425 - ], - [ - 2.38241183910364, - 48.8705456271002 - ], - [ - 2.38239162697302, - 48.8705712105384 - ], - [ - 2.38192408786783, - 48.8703878616072 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Pali Kao", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3145682, - 48.8287784 - ], - [ - 2.3146084, - 48.8287943 - ], - [ - 2.3138144, - 48.8293258 - ], - [ - 2.3137581, - 48.8292976 - ], - [ - 2.3145682, - 48.8287784 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.271229, - 48.852008 - ], - [ - 2.27096075235548, - 48.8518939993215 - ], - [ - 2.271299, - 48.851537 - ], - [ - 2.27109571870844, - 48.8514251249452 - ], - [ - 2.271334, - 48.851249 - ], - [ - 2.27146522743605, - 48.8513388236868 - ], - [ - 2.27173973545424, - 48.85128286869 - ], - [ - 2.27183519105438, - 48.8512778385146 - ], - [ - 2.2718469783389, - 48.8513354684781 - ], - [ - 2.27176129602955, - 48.851459 - ], - [ - 2.27165799394287, - 48.8516148251255 - ], - [ - 2.27154861776623, - 48.851735175366 - ], - [ - 2.271296, - 48.852019 - ], - [ - 2.271229, - 48.852008 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de la Fondation d'Auteuil", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.269899, - 48.853164 - ], - [ - 2.270516, - 48.852688 - ], - [ - 2.27096171170985, - 48.8528027165246 - ], - [ - 2.27086029279068, - 48.8530540763817 - ], - [ - 2.27068043693699, - 48.8531292364039 - ], - [ - 2.27057722071816, - 48.8532364256354 - ], - [ - 2.27012876576455, - 48.8533633605024 - ], - [ - 2.269899, - 48.853164 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Christine Desroches-Noblecourt", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.29289940104835, - 48.8352357574464 - ], - [ - 2.29275625131165, - 48.8351613689708 - ], - [ - 2.29301612565544, - 48.8349772039042 - ], - [ - 2.29325954538224, - 48.8348080875699 - ], - [ - 2.29298458289691, - 48.8346017478193 - ], - [ - 2.293202, - 48.834462 - ], - [ - 2.29356259092349, - 48.8347752522652 - ], - [ - 2.29289940104835, - 48.8352357574464 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Hôpital de Vaugirard", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.4033228689246, - 48.8680341779614 - ], - [ - 2.40319387928215, - 48.8679978 - ], - [ - 2.4033811, - 48.8679378 - ], - [ - 2.4034549, - 48.8678893 - ], - [ - 2.4033985, - 48.8678179 - ], - [ - 2.4033915, - 48.8678107 - ], - [ - 2.403472, - 48.8677004 - ], - [ - 2.40348517719937, - 48.8678125542005 - ], - [ - 2.40356092123784, - 48.8678898347349 - ], - [ - 2.40342489843594, - 48.8679482266813 - ], - [ - 2.4033757, - 48.8680552 - ], - [ - 2.4033228689246, - 48.8680341779614 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Surmelin", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3905367675442, - 48.852068902582 - ], - [ - 2.390596, - 48.851917 - ], - [ - 2.39062709575804, - 48.8518643205597 - ], - [ - 2.39102092251532, - 48.8519429704897 - ], - [ - 2.39159878581665, - 48.8520704858216 - ], - [ - 2.39156393713299, - 48.8521247092039 - ], - [ - 2.3915080884493, - 48.8522513858548 - ], - [ - 2.3905367675442, - 48.852068902582 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square de l’Impasse des Jardiniers", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.22041470446277, - 48.8394270241916 - ], - [ - 2.22283531738907, - 48.8329432530104 - ], - [ - 2.22579384429918, - 48.8275210253531 - ], - [ - 2.23056783090328, - 48.8224523718054 - ], - [ - 2.23762795193755, - 48.8202166892047 - ], - [ - 2.24784831762568, - 48.819596878353 - ], - [ - 2.25470672091618, - 48.8229836084531 - ], - [ - 2.26025395887211, - 48.8257061078919 - ], - [ - 2.26169960270283, - 48.8302875413513 - ], - [ - 2.25820316180997, - 48.8314383670202 - ], - [ - 2.25033616979962, - 48.8261930434188 - ], - [ - 2.24384758237341, - 48.8240017962878 - ], - [ - 2.23789690892991, - 48.8242452729224 - ], - [ - 2.23167727849403, - 48.8272111660492 - ], - [ - 2.22861789271309, - 48.8306637757284 - ], - [ - 2.22633175828193, - 48.8351119797773 - ], - [ - 2.22491973407543, - 48.8394048967073 - ], - [ - 2.22041470446277, - 48.8394270241916 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "No parking rock en seine 2", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": false, - "ride_end_allowed": false - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.313173, - 48.897343 - ], - [ - 2.314675, - 48.896496 - ], - [ - 2.320211, - 48.898612 - ], - [ - 2.318881, - 48.899134 - ], - [ - 2.313173, - 48.897343 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 141", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40103412720865, - 48.8362478995556 - ], - [ - 2.40114045209441, - 48.8361536323599 - ], - [ - 2.40100545209441, - 48.8360866323599 - ], - [ - 2.40121545209441, - 48.8358846323599 - ], - [ - 2.40098945209441, - 48.8357896323599 - ], - [ - 2.40089345209441, - 48.8358496323599 - ], - [ - 2.40043745209441, - 48.8356586323599 - ], - [ - 2.40067845209441, - 48.8354406323599 - ], - [ - 2.40101645209441, - 48.8355536323599 - ], - [ - 2.40127445209441, - 48.8356346323599 - ], - [ - 2.40157861633425, - 48.8357930005468 - ], - [ - 2.40183518420097, - 48.8359059979182 - ], - [ - 2.40170845209441, - 48.8360476323599 - ], - [ - 2.40191245209441, - 48.8361256323599 - ], - [ - 2.40208171717638, - 48.8360351444495 - ], - [ - 2.40234745209441, - 48.8362526323599 - ], - [ - 2.40219645209441, - 48.8364286323599 - ], - [ - 2.40193945209441, - 48.8363126323599 - ], - [ - 2.40184845209441, - 48.8364566323599 - ], - [ - 2.40119945209441, - 48.8362386323599 - ], - [ - 2.40113338767974, - 48.8362789376069 - ], - [ - 2.40103412720865, - 48.8362478995556 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Square Fécamp", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38587952839293, - 48.8782480120682 - ], - [ - 2.38587282839367, - 48.878195 - ], - [ - 2.38637073524317, - 48.8781512251522 - ], - [ - 2.3869358, - 48.8781064794645 - ], - [ - 2.38783429713605, - 48.8780281503621 - ], - [ - 2.38784810684945, - 48.8780787331134 - ], - [ - 2.38694091618961, - 48.878160137137 - ], - [ - 2.38587952839293, - 48.8782480120682 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Septième Art", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.41162544625269, - 48.8477839942741 - ], - [ - 2.41160737878855, - 48.8477302425876 - ], - [ - 2.41295760876851, - 48.8476140374548 - ], - [ - 2.41296259712685, - 48.847662783986 - ], - [ - 2.41162544625269, - 48.8477839942741 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de la Rue Noel Ballay", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38552667525519, - 48.8960844343442 - ], - [ - 2.38521497631601, - 48.8959304437373 - ], - [ - 2.386459, - 48.894244 - ], - [ - 2.387226, - 48.89352 - ], - [ - 2.38783696037479, - 48.8929836068586 - ], - [ - 2.39207, - 48.895076 - ], - [ - 2.39265457948577, - 48.895347452243 - ], - [ - 2.39229145433233, - 48.8955114590928 - ], - [ - 2.39258427969322, - 48.8956728296018 - ], - [ - 2.39252753567083, - 48.8958927579237 - ], - [ - 2.392231, - 48.8960973833691 - ], - [ - 2.39086845584181, - 48.8954339118546 - ], - [ - 2.389806, - 48.896479 - ], - [ - 2.38898052060733, - 48.8969599492909 - ], - [ - 2.38850150294439, - 48.8969899661303 - ], - [ - 2.3878509941121, - 48.8969889608189 - ], - [ - 2.38699047644872, - 48.896838426556 - ], - [ - 2.38618244995305, - 48.896825926685 - ], - [ - 2.38609293523365, - 48.8966419024162 - ], - [ - 2.38552667525519, - 48.8960844343442 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Villette + Cité des Sciences", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.396596, - 48.88299 - ], - [ - 2.396864, - 48.882471 - ], - [ - 2.396848, - 48.882094 - ], - [ - 2.397261, - 48.8816 - ], - [ - 2.397931, - 48.881212 - ], - [ - 2.398559, - 48.880862 - ], - [ - 2.39909680653912, - 48.8805538133278 - ], - [ - 2.39969762348607, - 48.8807735876482 - ], - [ - 2.39963425412273, - 48.8809485770645 - ], - [ - 2.3996784521343, - 48.8811625653139 - ], - [ - 2.39986211386072, - 48.8814071001851 - ], - [ - 2.40007283183621, - 48.8815865869406 - ], - [ - 2.40017355220741, - 48.8817510598271 - ], - [ - 2.40020975282131, - 48.8819014162273 - ], - [ - 2.40016327674928, - 48.8820348391018 - ], - [ - 2.40007484854447, - 48.8821804522917 - ], - [ - 2.39976457854112, - 48.8823478418772 - ], - [ - 2.3993165787387, - 48.8824479437507 - ], - [ - 2.39860152377344, - 48.882532098203 - ], - [ - 2.39799131478337, - 48.8826232982825 - ], - [ - 2.39772655155216, - 48.8826856834178 - ], - [ - 2.39749101013339, - 48.8827809490509 - ], - [ - 2.3972938211606, - 48.8828860343913 - ], - [ - 2.39716242280301, - 48.8829694877505 - ], - [ - 2.39705221022929, - 48.8830910399132 - ], - [ - 2.396596, - 48.88299 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parc de la Butte du Chapeau Rouge", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3077203, - 48.8283396 - ], - [ - 2.3077685, - 48.8283573 - ], - [ - 2.3074977, - 48.8285851 - ], - [ - 2.3074521, - 48.8285675 - ], - [ - 2.3077203, - 48.8283396 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39981611910244, - 48.865817592546 - ], - [ - 2.4004379943749, - 48.8650685582222 - ], - [ - 2.40072703499433, - 48.8651146529661 - ], - [ - 2.40001319225263, - 48.8659558745796 - ], - [ - 2.39981611910244, - 48.865817592546 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square Edouard Vaillant", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38811010827475, - 48.8517154973269 - ], - [ - 2.38812080827475, - 48.8516325973269 - ], - [ - 2.38890940827475, - 48.8516907973269 - ], - [ - 2.38883430827475, - 48.8517843973269 - ], - [ - 2.38811010827475, - 48.8517154973269 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Souzy - Cité Souzy", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40846160633566, - 48.834011769408 - ], - [ - 2.40475185028859, - 48.831993931863 - ], - [ - 2.40297507239291, - 48.8300402792307 - ], - [ - 2.40751303619922, - 48.8278827596603 - ], - [ - 2.41068783261082, - 48.8255806313086 - ], - [ - 2.41475651461201, - 48.8252747751131 - ], - [ - 2.41843947100548, - 48.8249163396363 - ], - [ - 2.41866365095956, - 48.8260127224341 - ], - [ - 2.41799111109611, - 48.8281000003033 - ], - [ - 2.41737845650729, - 48.8298992746792 - ], - [ - 2.41407859273588, - 48.832439684471 - ], - [ - 2.40846160633566, - 48.834011769408 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 20 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3378311, - 48.858978 - ], - [ - 2.3377697, - 48.8588602 - ], - [ - 2.3377399, - 48.858803 - ], - [ - 2.3377094, - 48.8587453 - ], - [ - 2.337305, - 48.8579534 - ], - [ - 2.3373131, - 48.8579499 - ], - [ - 2.3375724, - 48.8584632 - ], - [ - 2.3378364, - 48.858976 - ], - [ - 2.3378311, - 48.858978 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 105", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2777152861127, - 48.8576528132911 - ], - [ - 2.27881319630015, - 48.8569463813693 - ], - [ - 2.27886185924882, - 48.8569876050882 - ], - [ - 2.27845597962512, - 48.8572558052718 - ], - [ - 2.27805438890054, - 48.8575044860952 - ], - [ - 2.27776752037488, - 48.857691311153 - ], - [ - 2.2777152861127, - 48.8576528132911 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue l'Annonciation", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34995263985916, - 48.8448147308984 - ], - [ - 2.34994385485005, - 48.8447835764754 - ], - [ - 2.3518152, - 48.8445604 - ], - [ - 2.3518232, - 48.8445816 - ], - [ - 2.34995263985916, - 48.8448147308984 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Aire pietonne - Rue Rollin", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3558498970499, - 48.8436572582097 - ], - [ - 2.35661926268393, - 48.8417720805256 - ], - [ - 2.36329078879112, - 48.8435788706482 - ], - [ - 2.36299050339358, - 48.8446067766724 - ], - [ - 2.36080184230764, - 48.845925 - ], - [ - 2.3558498970499, - 48.8436572582097 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Musee National d'Histoire naturelle", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40668486311717, - 48.8613483550987 - ], - [ - 2.40679025432896, - 48.861046757235 - ], - [ - 2.4087215842864, - 48.861218 - ], - [ - 2.40867167722849, - 48.8615067102194 - ], - [ - 2.40668486311717, - 48.8613483550987 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Alquier Debrousse", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3555495456591, - 48.8553735433092 - ], - [ - 2.35540794785896, - 48.8554356539168 - ], - [ - 2.35537648168096, - 48.8554149503894 - ], - [ - 2.35550234639206, - 48.8553528397561 - ], - [ - 2.3555495456591, - 48.8553735433092 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 99", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.29382001713857, - 48.8299270637861 - ], - [ - 2.29393755557426, - 48.8293796351157 - ], - [ - 2.29462647004865, - 48.8297263408403 - ], - [ - 2.29382001713857, - 48.8299270637861 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 106", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3102233, - 48.8307975 - ], - [ - 2.3101777, - 48.8307745 - ], - [ - 2.3106121, - 48.8304744 - ], - [ - 2.3106497, - 48.8304937 - ], - [ - 2.3102233, - 48.8307975 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36726875860568, - 48.8893202290204 - ], - [ - 2.36551370084156, - 48.8863755384161 - ], - [ - 2.36563374278257, - 48.8863152375906 - ], - [ - 2.36613301339787, - 48.8872393592066 - ], - [ - 2.36733220940928, - 48.8892955847114 - ], - [ - 2.36726875860568, - 48.8893202290204 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin d'Eole", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37316418411973, - 48.8604784682496 - ], - [ - 2.37323557674719, - 48.8604516289029 - ], - [ - 2.37338856094854, - 48.8603509812245 - ], - [ - 2.37462773298051, - 48.8606462138408 - ], - [ - 2.37427586931716, - 48.8608072490796 - ], - [ - 2.37316418411973, - 48.8604784682496 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Trouillot", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37912534732431, - 48.8396135584505 - ], - [ - 2.37898716846281, - 48.8397214827502 - ], - [ - 2.37735, - 48.8388269993909 - ], - [ - 2.37723729476361, - 48.8384137419641 - ], - [ - 2.37804, - 48.83768 - ], - [ - 2.37842883104843, - 48.837373085614 - ], - [ - 2.37991766209692, - 48.8362628322154 - ], - [ - 2.38263662328636, - 48.8342077434626 - ], - [ - 2.38414272755422, - 48.8350418151044 - ], - [ - 2.38215, - 48.83668 - ], - [ - 2.38235337821704, - 48.8372158336133 - ], - [ - 2.38194337821789, - 48.8375378862704 - ], - [ - 2.38155, - 48.83732 - ], - [ - 2.38014, - 48.83831 - ], - [ - 2.38010264208695, - 48.8388693698274 - ], - [ - 2.37912534732431, - 48.8396135584505 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parc de Bercy", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.27292888061497, - 48.8413002190207 - ], - [ - 2.27429476123121, - 48.8407903870801 - ], - [ - 2.27544485815377, - 48.8403349237051 - ], - [ - 2.276274, - 48.839556 - ], - [ - 2.276939, - 48.840376 - ], - [ - 2.27607, - 48.841456 - ], - [ - 2.27379947784873, - 48.8423825961284 - ], - [ - 2.27292888061497, - 48.8413002190207 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 183", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.322122, - 48.863944 - ], - [ - 2.32968612678817, - 48.8615297699011 - ], - [ - 2.33109219018296, - 48.8634706800121 - ], - [ - 2.323689, - 48.865864 - ], - [ - 2.322122, - 48.863944 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin des Tuileries + Louvre", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32604933350323, - 48.8321812724102 - ], - [ - 2.32589622242057, - 48.8319280544037 - ], - [ - 2.32641448127226, - 48.8317821209057 - ], - [ - 2.32655999974471, - 48.8320514863891 - ], - [ - 2.32604933350323, - 48.8321812724102 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square Aspirant Dunand", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.41694112798899, - 48.8468920395335 - ], - [ - 2.41363247315704, - 48.8352056294805 - ], - [ - 2.40304477769263, - 48.8297607186561 - ], - [ - 2.40988266434704, - 48.825549581863 - ], - [ - 2.42907286237505, - 48.8212654761583 - ], - [ - 2.46094623726052, - 48.8141486946327 - ], - [ - 2.46855614337574, - 48.8200310048586 - ], - [ - 2.47230595218571, - 48.8365123200279 - ], - [ - 2.45675527447344, - 48.8459485175577 - ], - [ - 2.41694112798899, - 48.8468920395335 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "NGZ ESCOOTER/EBIKES BOIS DE VINCENNES", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.30499969731775, - 48.836323402156 - ], - [ - 2.30441429845052, - 48.8353159223072 - ], - [ - 2.30495033252501, - 48.8351689090371 - ], - [ - 2.30581890625692, - 48.8360575160023 - ], - [ - 2.30539702758753, - 48.8362143273595 - ], - [ - 2.30499969731775, - 48.836323402156 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin d'Alleray", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34133289934379, - 48.8426405642457 - ], - [ - 2.34131449919787, - 48.8422625660107 - ], - [ - 2.34136789927049, - 48.8422591531662 - ], - [ - 2.34138919934379, - 48.8426353642457 - ], - [ - 2.34133289934379, - 48.8426405642457 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux ecoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.353812, - 48.82003 - ], - [ - 2.353812, - 48.819981 - ], - [ - 2.353876, - 48.819677 - ], - [ - 2.35401768896492, - 48.818649785216 - ], - [ - 2.35402386257127, - 48.8180492907741 - ], - [ - 2.35614, - 48.817035 - ], - [ - 2.356612, - 48.817642 - ], - [ - 2.356119, - 48.818744 - ], - [ - 2.355099, - 48.819394 - ], - [ - 2.353812, - 48.82003 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 109", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.44003489213566, - 48.8435222069061 - ], - [ - 2.43921252341517, - 48.8394861234551 - ], - [ - 2.44544696405387, - 48.8352129060763 - ], - [ - 2.45117524481083, - 48.8361317610837 - ], - [ - 2.44689106844703, - 48.8425632742393 - ], - [ - 2.44003489213566, - 48.8435222069061 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3070441, - 48.8427364 - ], - [ - 2.3074799, - 48.8421 - ], - [ - 2.3075376, - 48.8421149 - ], - [ - 2.307092, - 48.8427496 - ], - [ - 2.3070441, - 48.8427364 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2871169, - 48.8553154 - ], - [ - 2.2858092, - 48.8543942 - ], - [ - 2.2840509, - 48.8531341 - ], - [ - 2.2805347, - 48.8506844 - ], - [ - 2.2806713, - 48.8506138 - ], - [ - 2.2840656, - 48.8530494 - ], - [ - 2.2858486, - 48.8542883 - ], - [ - 2.2872027, - 48.855259 - ], - [ - 2.2871169, - 48.8553154 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Aires piétonnes", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32405, - 48.8268811 - ], - [ - 2.3213249, - 48.8275486 - ], - [ - 2.3212873, - 48.8275133 - ], - [ - 2.3239963, - 48.8268422 - ], - [ - 2.32405, - 48.8268811 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39444373181129, - 48.8357768248988 - ], - [ - 2.39440234771639, - 48.8357384976569 - ], - [ - 2.39540227879205, - 48.8352150594923 - ], - [ - 2.3960821, - 48.8348876 - ], - [ - 2.39652410698132, - 48.8347074500405 - ], - [ - 2.39655690491331, - 48.8347428404691 - ], - [ - 2.39592420397651, - 48.8350339127324 - ], - [ - 2.3952237, - 48.8353961 - ], - [ - 2.3945156, - 48.8357739 - ], - [ - 2.39444373181129, - 48.8357768248988 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecole Privée Saint-Esprit - 56 rue Meunier", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34042208374026, - 48.8727271417794 - ], - [ - 2.34039523189675, - 48.8727338489411 - ], - [ - 2.34012394111533, - 48.8721909456136 - ], - [ - 2.34016752048594, - 48.8721882456828 - ], - [ - 2.34042208374026, - 48.8727271417794 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Mairie du 9eme", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3943193409828, - 48.8758594857299 - ], - [ - 2.3943193409828, - 48.8757236581175 - ], - [ - 2.39462156700512, - 48.8757335967358 - ], - [ - 2.3943193409828, - 48.8758594857299 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin du Regard de la Lanterne", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35548634117807, - 48.8564065946334 - ], - [ - 2.3553278, - 48.8560202 - ], - [ - 2.3553412, - 48.8560157 - ], - [ - 2.35549993790998, - 48.8564023687357 - ], - [ - 2.35548634117807, - 48.8564065946334 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 94", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40114077348832, - 48.854534709763 - ], - [ - 2.40079175476053, - 48.8542929758417 - ], - [ - 2.400831, - 48.854223 - ], - [ - 2.400611, - 48.854123 - ], - [ - 2.400649, - 48.854057 - ], - [ - 2.400442, - 48.853973 - ], - [ - 2.40086350941575, - 48.8534746585993 - ], - [ - 2.4010904150448, - 48.8535466584912 - ], - [ - 2.400976, - 48.853699 - ], - [ - 2.401148, - 48.85378 - ], - [ - 2.40128105649762, - 48.8536472409702 - ], - [ - 2.40180116970156, - 48.8538731262767 - ], - [ - 2.40166, - 48.854017 - ], - [ - 2.401885, - 48.854094 - ], - [ - 2.401754, - 48.854216 - ], - [ - 2.40192896212507, - 48.8542894059885 - ], - [ - 2.40180239610807, - 48.8544188494278 - ], - [ - 2.401601, - 48.854341 - ], - [ - 2.40114077348832, - 48.854534709763 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Casque d'Or", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38653061953447, - 48.8357157328809 - ], - [ - 2.38628661555941, - 48.8356041333787 - ], - [ - 2.38693249403686, - 48.8351080686476 - ], - [ - 2.38705474900595, - 48.835142067166 - ], - [ - 2.387105756956, - 48.8352183336567 - ], - [ - 2.38667087847749, - 48.8355652666206 - ], - [ - 2.38653061953447, - 48.8357157328809 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Lachambeaudie - Place Lachambeaudie/Rue de la Nativité", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.31333205969815, - 48.8383116249009 - ], - [ - 2.312536, - 48.837606 - ], - [ - 2.312542, - 48.837228 - ], - [ - 2.313974, - 48.838361 - ], - [ - 2.31333205969815, - 48.8383116249009 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Pierre-Adrien Dalpayrat", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.29759, - 48.855094 - ], - [ - 2.301346, - 48.852425 - ], - [ - 2.303534, - 48.853795 - ], - [ - 2.29965, - 48.856308 - ], - [ - 2.29759, - 48.855094 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 8", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33288029343429, - 48.851061294267 - ], - [ - 2.3327068, - 48.8502734 - ], - [ - 2.33269391313057, - 48.8497041612755 - ], - [ - 2.33275188686866, - 48.8497006544901 - ], - [ - 2.3327417, - 48.8502668 - ], - [ - 2.33293428686946, - 48.85104713231 - ], - [ - 2.33288029343429, - 48.851061294267 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue Bonaparte + Mairie du 6eme", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.30652996755816, - 48.8564795509542 - ], - [ - 2.3069531691302, - 48.855644210807 - ], - [ - 2.30703780944435, - 48.8556664867255 - ], - [ - 2.30660896518509, - 48.8564981139104 - ], - [ - 2.30652996755816, - 48.8564795509542 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue Cler 02", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.26431186400643, - 48.8758232315187 - ], - [ - 2.26523302805347, - 48.873528708543 - ], - [ - 2.27028963068884, - 48.8752173845538 - ], - [ - 2.26970165363886, - 48.8766224226746 - ], - [ - 2.26431186400643, - 48.8758232315187 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 20 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3496315, - 48.8414033 - ], - [ - 2.3496235, - 48.8412745 - ], - [ - 2.3496369, - 48.8408376 - ], - [ - 2.3497294, - 48.8404784 - ], - [ - 2.3497482, - 48.8404784 - ], - [ - 2.3496476, - 48.8408394 - ], - [ - 2.3496436, - 48.8409355 - ], - [ - 2.3496355, - 48.8411094 - ], - [ - 2.3496355, - 48.8412798 - ], - [ - 2.3496449, - 48.8414033 - ], - [ - 2.3496315, - 48.8414033 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 37", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3029879, - 48.8360267 - ], - [ - 2.3031877, - 48.836492 - ], - [ - 2.3031448, - 48.8365008 - ], - [ - 2.3029409, - 48.83604 - ], - [ - 2.3029879, - 48.8360267 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36135069256447, - 48.8726261927155 - ], - [ - 2.36131389696449, - 48.8725651350501 - ], - [ - 2.36190674241173, - 48.8723115896482 - ], - [ - 2.36239548649445, - 48.8720580442462 - ], - [ - 2.36243892564755, - 48.8721207553082 - ], - [ - 2.3619468597883, - 48.8723612469596 - ], - [ - 2.36135069256447, - 48.8726261927155 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux ecoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36027, - 48.865047 - ], - [ - 2.35998, - 48.864674 - ], - [ - 2.361545, - 48.863611 - ], - [ - 2.362162, - 48.864093 - ], - [ - 2.36027, - 48.865047 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square du Temple + parvis de la Mairie", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3261753, - 48.8414665 - ], - [ - 2.3261806, - 48.84144 - ], - [ - 2.327106, - 48.8415512 - ], - [ - 2.3270992, - 48.8415892 - ], - [ - 2.3261753, - 48.8414665 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.267752, - 48.831186 - ], - [ - 2.268056, - 48.8287 - ], - [ - 2.271529, - 48.828874 - ], - [ - 2.273803, - 48.829943 - ], - [ - 2.275306, - 48.830999 - ], - [ - 2.276037, - 48.832951 - ], - [ - 2.272423, - 48.833726 - ], - [ - 2.267752, - 48.831186 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parc Suzanne Lenglen", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37662745990223, - 48.8492732292231 - ], - [ - 2.3767061693361, - 48.8492778148041 - ], - [ - 2.3768309889188, - 48.8494848802043 - ], - [ - 2.37678362122785, - 48.8494892872671 - ], - [ - 2.37662745990223, - 48.8492732292231 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Charles Baudelaire - 16 rue Charles Baudelaire", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.30616989671348, - 48.8794049097172 - ], - [ - 2.306672, - 48.878648 - ], - [ - 2.30798047981152, - 48.8784426282122 - ], - [ - 2.30968494460224, - 48.878483972624 - ], - [ - 2.311565, - 48.879283 - ], - [ - 2.31143188920317, - 48.8803004702391 - ], - [ - 2.30906315868565, - 48.8799659307656 - ], - [ - 2.30616989671348, - 48.8794049097172 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 135", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33959040448523, - 48.8773919192263 - ], - [ - 2.34003392653057, - 48.8773068692614 - ], - [ - 2.34022671624166, - 48.8772734698558 - ], - [ - 2.34036488243983, - 48.877250714901 - ], - [ - 2.34046225892812, - 48.8774893978169 - ], - [ - 2.34033396571663, - 48.8775071177873 - ], - [ - 2.34010797971613, - 48.8775361599077 - ], - [ - 2.3396685038556, - 48.8776118632032 - ], - [ - 2.33959040448523, - 48.8773919192263 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecole polyvalente Milton", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.30602449406727, - 48.8573858624286 - ], - [ - 2.30637965455557, - 48.8567201759756 - ], - [ - 2.30650623479833, - 48.8567590936565 - ], - [ - 2.30615514624686, - 48.8574067743562 - ], - [ - 2.30602449406727, - 48.8573858624286 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue Cler", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39980881488588, - 48.8594090710926 - ], - [ - 2.39951846649821, - 48.8592139746653 - ], - [ - 2.40034146501242, - 48.8584959901971 - ], - [ - 2.40059944168814, - 48.8586513266033 - ], - [ - 2.40017479156151, - 48.8590991794613 - ], - [ - 2.40000704590735, - 48.859268179789 - ], - [ - 2.3998105116622, - 48.8594127214037 - ], - [ - 2.39980881488588, - 48.8594090710926 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle et élémentaire Lesseps", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33753124241889, - 48.8264333185335 - ], - [ - 2.33752374440202, - 48.8263963492068 - ], - [ - 2.33810670812585, - 48.8263169174779 - ], - [ - 2.33814507581585, - 48.8263448637503 - ], - [ - 2.33753124241889, - 48.8264333185335 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Marie-Thérèse Auffray", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37744604476564, - 48.867452498329 - ], - [ - 2.37787551380806, - 48.866957268671 - ], - [ - 2.37790800250401, - 48.8669810626598 - ], - [ - 2.37749263262725, - 48.8674661207661 - ], - [ - 2.37744604476564, - 48.867452498329 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Baleine - Impasse de la Baleine", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.31944000544711, - 48.8323734585811 - ], - [ - 2.31937962719018, - 48.8323164769227 - ], - [ - 2.3195806794965, - 48.8322250436039 - ], - [ - 2.3197824320836, - 48.8321366804346 - ], - [ - 2.31984392527229, - 48.8321978505509 - ], - [ - 2.3195450320836, - 48.8323273804346 - ], - [ - 2.31949718623434, - 48.8323541386541 - ], - [ - 2.31944000544711, - 48.8323734585811 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin des Thermopyles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.24030030877114, - 48.8630584170816 - ], - [ - 2.23978993962464, - 48.8622470099774 - ], - [ - 2.24442579270453, - 48.8593230373364 - ], - [ - 2.24931683035805, - 48.8664018351534 - ], - [ - 2.24030030877114, - 48.8630584170816 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.24554937101379, - 48.8570037084201 - ], - [ - 2.24336346717709, - 48.8536478081104 - ], - [ - 2.24449985427577, - 48.850179769958 - ], - [ - 2.25562627499863, - 48.8506312529383 - ], - [ - 2.26051066838113, - 48.8570356682939 - ], - [ - 2.24554937101379, - 48.8570037084201 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 20 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38859575994797, - 48.8872341956781 - ], - [ - 2.38907625240335, - 48.8863144079387 - ], - [ - 2.38936525240335, - 48.8863931225568 - ], - [ - 2.38882608825156, - 48.887298553525 - ], - [ - 2.38859575994797, - 48.8872341956781 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Georges Thill", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.32773, - 48.8255183 - ], - [ - 2.3287975, - 48.8248791 - ], - [ - 2.3288726, - 48.8249038 - ], - [ - 2.3277515, - 48.8255678 - ], - [ - 2.32773, - 48.8255183 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.35594620669187, - 48.8645937650918 - ], - [ - 2.35583065371764, - 48.8643885833787 - ], - [ - 2.35776312918109, - 48.8638570895306 - ], - [ - 2.35786650130112, - 48.8640968026664 - ], - [ - 2.35625708531531, - 48.8643557339971 - ], - [ - 2.35634913698912, - 48.8645366346506 - ], - [ - 2.35594620669187, - 48.8645937650918 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Zone piétonne Maire/Vertu", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3705734363645, - 48.8995703696371 - ], - [ - 2.37058794102068, - 48.899289288409 - ], - [ - 2.37060043946902, - 48.8990328932493 - ], - [ - 2.37066848603033, - 48.8990065357486 - ], - [ - 2.37081105897941, - 48.8990073904882 - ], - [ - 2.37088060088455, - 48.899039898865 - ], - [ - 2.37085110243743, - 48.8995833696552 - ], - [ - 2.3705734363645, - 48.8995703696371 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Anais Nin", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3206293, - 48.8303899 - ], - [ - 2.3206749, - 48.8303705 - ], - [ - 2.3208681, - 48.8305841 - ], - [ - 2.3208278, - 48.8306018 - ], - [ - 2.3206293, - 48.8303899 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.31890371107942, - 48.840479123842 - ], - [ - 2.31794479410897, - 48.8396874276902 - ], - [ - 2.31887164964935, - 48.8392309234119 - ], - [ - 2.3197941955117, - 48.8400574040659 - ], - [ - 2.31890371107942, - 48.840479123842 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardon Atlantique", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33314416299275, - 48.8510107965845 - ], - [ - 2.33311820374027, - 48.8508908106765 - ], - [ - 2.33312197283501, - 48.8507708247674 - ], - [ - 2.333479, - 48.850717 - ], - [ - 2.33373465197115, - 48.8507481752307 - ], - [ - 2.33384446181198, - 48.8507773066611 - ], - [ - 2.33391254330975, - 48.8508247371407 - ], - [ - 2.33394229882054, - 48.8508958247487 - ], - [ - 2.3339276519712, - 48.8509917527314 - ], - [ - 2.33385380984217, - 48.8510585337088 - ], - [ - 2.33373575551076, - 48.8510923146427 - ], - [ - 2.33353546181337, - 48.8510884022855 - ], - [ - 2.33328051102161, - 48.8510670955081 - ], - [ - 2.33314416299275, - 48.8510107965845 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Saint-Sulpice", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34522360593705, - 48.8525387862632 - ], - [ - 2.34544180593705, - 48.8527315862632 - ], - [ - 2.34549220593705, - 48.8527831862632 - ], - [ - 2.34551410593705, - 48.8528014862632 - ], - [ - 2.34554130593705, - 48.8528286862632 - ], - [ - 2.34561790593705, - 48.8529114862632 - ], - [ - 2.34559620593705, - 48.8529225862632 - ], - [ - 2.34557370593705, - 48.8528921862632 - ], - [ - 2.34539300593705, - 48.8527175862632 - ], - [ - 2.34519350593705, - 48.8525518862632 - ], - [ - 2.34522360593705, - 48.8525387862632 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Aire pietonne - Rue Xavier Privas", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34854755037178, - 48.85806300501 - ], - [ - 2.34846667955452, - 48.8579391734603 - ], - [ - 2.34895331784312, - 48.8578103043118 - ], - [ - 2.34900245223058, - 48.857932 - ], - [ - 2.34854755037178, - 48.85806300501 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square de la Tour Saint-Jacques", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.379909, - 48.880099 - ], - [ - 2.378884, - 48.878932 - ], - [ - 2.378841, - 48.877765 - ], - [ - 2.379029, - 48.877148 - ], - [ - 2.379736, - 48.876721 - ], - [ - 2.380616, - 48.876503 - ], - [ - 2.380573, - 48.876816 - ], - [ - 2.380789, - 48.877888 - ], - [ - 2.381294, - 48.878619 - ], - [ - 2.382044, - 48.879197 - ], - [ - 2.38353, - 48.879444 - ], - [ - 2.385045, - 48.879795 - ], - [ - 2.386575, - 48.8799 - ], - [ - 2.388609, - 48.879947 - ], - [ - 2.387541, - 48.880697 - ], - [ - 2.386531, - 48.881626 - ], - [ - 2.385218, - 48.882699 - ], - [ - 2.383011, - 48.882215 - ], - [ - 2.381265, - 48.881351 - ], - [ - 2.379909, - 48.880099 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Butte Chaumont", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39050768250046, - 48.8540367005813 - ], - [ - 2.39063872547455, - 48.8534715824527 - ], - [ - 2.39139160616431, - 48.8536743524936 - ], - [ - 2.39159381142268, - 48.8537026463352 - ], - [ - 2.39161572547455, - 48.8537965824527 - ], - [ - 2.39195870879347, - 48.8539257582552 - ], - [ - 2.39183634125081, - 48.8541536980084 - ], - [ - 2.39150872547455, - 48.8540575824527 - ], - [ - 2.39138472547455, - 48.8542235824527 - ], - [ - 2.39050768250046, - 48.8540367005813 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Emile Gallé", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.354749, - 48.862103 - ], - [ - 2.35473730869037, - 48.8621231427104 - ], - [ - 2.354186166498, - 48.8614064863974 - ], - [ - 2.355157, - 48.861055 - ], - [ - 2.35587, - 48.861757 - ], - [ - 2.354749, - 48.862103 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Anne Franck", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.44571571379089, - 48.8323943229453 - ], - [ - 2.44491745326795, - 48.8283337383575 - ], - [ - 2.45229531567855, - 48.8275693562219 - ], - [ - 2.44571571379089, - 48.8323943229453 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.351365, - 48.85738 - ], - [ - 2.351215, - 48.857123 - ], - [ - 2.351477, - 48.857095 - ], - [ - 2.350973, - 48.856219 - ], - [ - 2.351612, - 48.85599 - ], - [ - 2.352266, - 48.857133 - ], - [ - 2.351365, - 48.85738 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parvis de l'hotel de ville", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.29882371860861, - 48.8326591976213 - ], - [ - 2.29768176087844, - 48.8312667285697 - ], - [ - 2.30105484500608, - 48.8304063386612 - ], - [ - 2.30192888727821, - 48.831842 - ], - [ - 2.29882371860861, - 48.8326591976213 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 102", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.394976, - 48.874609 - ], - [ - 2.395217, - 48.874248 - ], - [ - 2.39560336722277, - 48.8743294210212 - ], - [ - 2.39550876175937, - 48.8744918947645 - ], - [ - 2.39545080078078, - 48.8744965789268 - ], - [ - 2.395314, - 48.874711 - ], - [ - 2.394976, - 48.874609 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Leon Zyguel", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40912085038733, - 48.8714440059573 - ], - [ - 2.40912401726723, - 48.8714050605788 - ], - [ - 2.41042022377974, - 48.8714591505009 - ], - [ - 2.41041385293735, - 48.8714967027849 - ], - [ - 2.40912085038733, - 48.8714440059573 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Pierre Foncin", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.41093265634134, - 48.8677505924203 - ], - [ - 2.41098482064535, - 48.867367615821 - ], - [ - 2.41112753497487, - 48.8673767696027 - ], - [ - 2.41107120515517, - 48.867755074583 - ], - [ - 2.41093265634134, - 48.8677505924203 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecoles Rue le Vau", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.377347, - 48.874549 - ], - [ - 2.377682, - 48.874633 - ], - [ - 2.377556, - 48.874944 - ], - [ - 2.377269, - 48.874901 - ], - [ - 2.377043, - 48.874831 - ], - [ - 2.376829, - 48.874732 - ], - [ - 2.376606, - 48.874612 - ], - [ - 2.376558, - 48.874564 - ], - [ - 2.376636, - 48.874407 - ], - [ - 2.377025, - 48.874482 - ], - [ - 2.37707517446595, - 48.8744301529878 - ], - [ - 2.37736303729588, - 48.8744988710937 - ], - [ - 2.377347, - 48.874549 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Rebeval", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.42057522181301, - 48.8428080133205 - ], - [ - 2.420062432587, - 48.8417955616031 - ], - [ - 2.42146094865728, - 48.839402412548 - ], - [ - 2.42248652710933, - 48.8365949188752 - ], - [ - 2.42439783240565, - 48.838159770824 - ], - [ - 2.42644898930882, - 48.8389268372581 - ], - [ - 2.42931594725371, - 48.8395404819481 - ], - [ - 2.42651891511227, - 48.8402461640477 - ], - [ - 2.42327901954903, - 48.8418569228963 - ], - [ - 2.42272863078475, - 48.8427605486262 - ], - [ - 2.42057522181301, - 48.8428080133205 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.281009, - 48.883169 - ], - [ - 2.285419, - 48.88657 - ], - [ - 2.291839, - 48.889782 - ], - [ - 2.294612, - 48.889634 - ], - [ - 2.305383, - 48.894936 - ], - [ - 2.307784, - 48.896032 - ], - [ - 2.315176, - 48.898653 - ], - [ - 2.318403, - 48.899705 - ], - [ - 2.320533, - 48.900719 - ], - [ - 2.333097, - 48.900871 - ], - [ - 2.340245, - 48.901271 - ], - [ - 2.352154, - 48.90134 - ], - [ - 2.357344, - 48.900877 - ], - [ - 2.360572, - 48.900861 - ], - [ - 2.370876, - 48.900299 - ], - [ - 2.376222, - 48.900189 - ], - [ - 2.378403, - 48.900084 - ], - [ - 2.380803, - 48.900208 - ], - [ - 2.382116, - 48.900007 - ], - [ - 2.383975, - 48.898568 - ], - [ - 2.386111, - 48.897893 - ], - [ - 2.393926, - 48.897325 - ], - [ - 2.397369, - 48.895357 - ], - [ - 2.397604, - 48.894655 - ], - [ - 2.399439, - 48.890423 - ], - [ - 2.399763, - 48.888177 - ], - [ - 2.399514, - 48.885921 - ], - [ - 2.400511, - 48.883809 - ], - [ - 2.402662, - 48.882022 - ], - [ - 2.404692, - 48.88139 - ], - [ - 2.410358, - 48.87959 - ], - [ - 2.412643, - 48.876734 - ], - [ - 2.414073, - 48.871022 - ], - [ - 2.414312, - 48.869298 - ], - [ - 2.414317, - 48.868645 - ], - [ - 2.414219, - 48.864595 - ], - [ - 2.414105, - 48.861859 - ], - [ - 2.415356, - 48.85549 - ], - [ - 2.416175, - 48.850674 - ], - [ - 2.416512, - 48.849127 - ], - [ - 2.41652513949317, - 48.8473141217407 - ], - [ - 2.41717720911277, - 48.8472056162446 - ], - [ - 2.41757585133407, - 48.8472116839449 - ], - [ - 2.41821672670113, - 48.847125642138 - ], - [ - 2.41927018806421, - 48.8467720101779 - ], - [ - 2.42109397780837, - 48.8463674454656 - ], - [ - 2.42326804666186, - 48.8462530214724 - ], - [ - 2.42775820468399, - 48.8460424916757 - ], - [ - 2.43306631911403, - 48.8455255327546 - ], - [ - 2.43621446522343, - 48.8452637759378 - ], - [ - 2.43844158393365, - 48.8451224710177 - ], - [ - 2.43985281166062, - 48.8463630851361 - ], - [ - 2.44652264796839, - 48.8461926359222 - ], - [ - 2.44873129557352, - 48.8449414113337 - ], - [ - 2.46068558083773, - 48.8435203386753 - ], - [ - 2.46494625149845, - 48.8424421493947 - ], - [ - 2.46856823491357, - 48.8396300684371 - ], - [ - 2.47115235155724, - 48.8347160767552 - ], - [ - 2.46623189306985, - 48.8299071867863 - ], - [ - 2.46348402160804, - 48.8210041037007 - ], - [ - 2.46460042536065, - 48.8196060753681 - ], - [ - 2.45883090579437, - 48.8162671736419 - ], - [ - 2.45189302561858, - 48.8175601081081 - ], - [ - 2.43999665894162, - 48.8180759018844 - ], - [ - 2.4327363198964, - 48.8206116675371 - ], - [ - 2.42858502300172, - 48.8230052387781 - ], - [ - 2.42335212296757, - 48.8234576681648 - ], - [ - 2.4170108142571, - 48.8239884363873 - ], - [ - 2.41134136563497, - 48.8239109925046 - ], - [ - 2.40343864361985, - 48.8282600208541 - ], - [ - 2.400213, - 48.828887 - ], - [ - 2.395023, - 48.827871 - ], - [ - 2.392858, - 48.826231 - ], - [ - 2.390347, - 48.824953 - ], - [ - 2.384004, - 48.822853 - ], - [ - 2.381636, - 48.821885 - ], - [ - 2.377129, - 48.819945 - ], - [ - 2.371485, - 48.818006 - ], - [ - 2.363807, - 48.815753 - ], - [ - 2.359829, - 48.815631 - ], - [ - 2.356662, - 48.815959 - ], - [ - 2.356007, - 48.816632 - ], - [ - 2.353634, - 48.81767 - ], - [ - 2.351493, - 48.817848 - ], - [ - 2.3469, - 48.815852 - ], - [ - 2.346599, - 48.815917 - ], - [ - 2.344933, - 48.81594 - ], - [ - 2.344266, - 48.815704 - ], - [ - 2.343084, - 48.816209 - ], - [ - 2.342038, - 48.816425 - ], - [ - 2.341278, - 48.816716 - ], - [ - 2.337662, - 48.816471 - ], - [ - 2.334824, - 48.81685 - ], - [ - 2.332165, - 48.818375 - ], - [ - 2.320597, - 48.820565 - ], - [ - 2.299589, - 48.825298 - ], - [ - 2.293774, - 48.826413 - ], - [ - 2.291817, - 48.827177 - ], - [ - 2.283341, - 48.830807 - ], - [ - 2.2793600167703, - 48.8320785164856 - ], - [ - 2.278225, - 48.83112 - ], - [ - 2.276829, - 48.83017 - ], - [ - 2.27394786344376, - 48.8280852322895 - ], - [ - 2.272604, - 48.827987 - ], - [ - 2.26748156424114, - 48.8279733503906 - ], - [ - 2.267184, - 48.831584 - ], - [ - 2.269716, - 48.832996 - ], - [ - 2.268225, - 48.834576 - ], - [ - 2.267491, - 48.834545 - ], - [ - 2.264096, - 48.834321 - ], - [ - 2.262764, - 48.834156 - ], - [ - 2.261601, - 48.834035 - ], - [ - 2.25530992371666, - 48.8347293880597 - ], - [ - 2.25059768326845, - 48.8382031098498 - ], - [ - 2.25038685660243, - 48.8420865332895 - ], - [ - 2.25045105275487, - 48.8431061138217 - ], - [ - 2.25092763832658, - 48.8443644557952 - ], - [ - 2.24981637519606, - 48.8449683056145 - ], - [ - 2.24186131901585, - 48.8469250031461 - ], - [ - 2.2397706714866, - 48.8483571128156 - ], - [ - 2.2361349099457, - 48.8498896832147 - ], - [ - 2.23167246115941, - 48.8505583731821 - ], - [ - 2.22963143546429, - 48.8508416481102 - ], - [ - 2.22791269348492, - 48.8510834812419 - ], - [ - 2.22927434288355, - 48.8607867682922 - ], - [ - 2.23247183324894, - 48.8667062482284 - ], - [ - 2.24296152828359, - 48.8713576752304 - ], - [ - 2.24760063059353, - 48.8761280765015 - ], - [ - 2.2545457100123, - 48.8747980447513 - ], - [ - 2.25793017239427, - 48.8808961994053 - ], - [ - 2.27887465230075, - 48.8783652844762 - ], - [ - 2.281274, - 48.883002 - ], - [ - 2.20788702732254, - 48.9046833261747 - ], - [ - 2.191048, - 48.883791 - ], - [ - 2.17365, - 48.86743 - ], - [ - 2.14753849600334, - 48.8106743757534 - ], - [ - 2.145105178052, - 48.7885413741402 - ], - [ - 2.16995436954963, - 48.7459543200043 - ], - [ - 2.30358613317564, - 48.7126366803249 - ], - [ - 2.47998895490593, - 48.7255604993531 - ], - [ - 2.617773, - 48.817298 - ], - [ - 2.580944, - 48.898508 - ], - [ - 2.481768, - 48.957833 - ], - [ - 2.383196, - 48.980508 - ], - [ - 2.318213, - 48.96536 - ], - [ - 2.273787, - 48.946002 - ], - [ - 2.208183, - 48.905269 - ], - [ - 2.281009, - 48.883169 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "OBA 2kmh", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 2 - }, - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 6 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.292099, - 48.862415 - ], - [ - 2.292046, - 48.862078 - ], - [ - 2.291932, - 48.861621 - ], - [ - 2.291853, - 48.861397 - ], - [ - 2.291856, - 48.861392 - ], - [ - 2.292644, - 48.86213 - ], - [ - 2.292215, - 48.862531 - ], - [ - 2.292099, - 48.862415 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardins du Trocadéro 2", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3469037, - 48.8420603 - ], - [ - 2.3468835, - 48.8420356 - ], - [ - 2.3476695, - 48.8418353 - ], - [ - 2.3476949, - 48.8418688 - ], - [ - 2.3469037, - 48.8420603 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux ecoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.26823141803048, - 48.8593379961526 - ], - [ - 2.26789521223943, - 48.858651826402 - ], - [ - 2.26938161644712, - 48.8586225056296 - ], - [ - 2.26928511678137, - 48.8586810620552 - ], - [ - 2.26826441803048, - 48.8593599961526 - ], - [ - 2.26823141803048, - 48.8593379961526 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin du Ranelagh 2", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.25453891831652, - 48.8408519579871 - ], - [ - 2.25438570823305, - 48.8408825742399 - ], - [ - 2.2543704, - 48.8408916 - ], - [ - 2.254416, - 48.8405315 - ], - [ - 2.25448698806732, - 48.8402117053969 - ], - [ - 2.25466635411588, - 48.8402164076996 - ], - [ - 2.2545957, - 48.8405897 - ], - [ - 2.2545635, - 48.8408739 - ], - [ - 2.25453891831652, - 48.8408519579871 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Parc des Princes", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38808, - 48.83361 - ], - [ - 2.38774136667039, - 48.8338543977534 - ], - [ - 2.38744635999599, - 48.834037075603 - ], - [ - 2.38737090666434, - 48.8339835003994 - ], - [ - 2.38727384998282, - 48.8339026772727 - ], - [ - 2.38713044665623, - 48.8337772467736 - ], - [ - 2.38670292996769, - 48.8334116822425 - ], - [ - 2.38630974996971, - 48.8330781055838 - ], - [ - 2.38607768661379, - 48.8328728876227 - ], - [ - 2.38579018327601, - 48.8326608615982 - ], - [ - 2.38552, - 48.83244 - ], - [ - 2.38556, - 48.83237 - ], - [ - 2.38562, - 48.83236 - ], - [ - 2.38568, - 48.83238 - ], - [ - 2.38573140049756, - 48.832342677472 - ], - [ - 2.38601342063037, - 48.8325866702893 - ], - [ - 2.38654661002526, - 48.8329746102713 - ], - [ - 2.38698457336904, - 48.8333147816016 - ], - [ - 2.3873218533791, - 48.8335749530541 - ], - [ - 2.38755775336799, - 48.8337419321539 - ], - [ - 2.388, - 48.83351 - ], - [ - 2.38812, - 48.83355 - ], - [ - 2.38808, - 48.83361 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Bercy Village", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39035055733296, - 48.8845757186891 - ], - [ - 2.39036155733296, - 48.8843977186891 - ], - [ - 2.39062455733296, - 48.8844367186891 - ], - [ - 2.39094055733296, - 48.8845317186891 - ], - [ - 2.39131855733296, - 48.8847027186891 - ], - [ - 2.39177455733296, - 48.8848797186891 - ], - [ - 2.39241055733296, - 48.8852407186891 - ], - [ - 2.39283955733296, - 48.8855957186891 - ], - [ - 2.39308355733296, - 48.8858497186891 - ], - [ - 2.39352655733296, - 48.8863887186891 - ], - [ - 2.39329855733296, - 48.8863657186891 - ], - [ - 2.39313255733296, - 48.8861227186891 - ], - [ - 2.39269255733296, - 48.8860817186891 - ], - [ - 2.39224155733296, - 48.8860257186891 - ], - [ - 2.39223855733296, - 48.8858067186891 - ], - [ - 2.39224455733296, - 48.8856037186891 - ], - [ - 2.39234655733296, - 48.8854857186891 - ], - [ - 2.39237255733296, - 48.8854257186891 - ], - [ - 2.39178855733296, - 48.8850807186891 - ], - [ - 2.39112355733296, - 48.8848017186891 - ], - [ - 2.39066755733296, - 48.8846377186891 - ], - [ - 2.39035055733296, - 48.8845757186891 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Darius Milhaud + Élémentaire Goubet +\nSquare du Petit Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34838645761914, - 48.8402603749459 - ], - [ - 2.34840756238808, - 48.840214073834 - ], - [ - 2.3485623306924, - 48.8402603749459 - ], - [ - 2.34854122592353, - 48.8402974158045 - ], - [ - 2.34838645761914, - 48.8402603749459 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Aire pietonne - Rue de l'Arbalete v2", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40415276435828, - 48.8536640904436 - ], - [ - 2.40410123564272, - 48.8536453480571 - ], - [ - 2.4042990944578, - 48.8534559556933 - ], - [ - 2.40405388413119, - 48.8534130344869 - ], - [ - 2.40407833690138, - 48.8533765386694 - ], - [ - 2.40436729697707, - 48.8534316847519 - ], - [ - 2.404619141184, - 48.8535318981277 - ], - [ - 2.40458719571835, - 48.8535715288665 - ], - [ - 2.40434211586881, - 48.8534740460747 - ], - [ - 2.40415276435828, - 48.8536640904436 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "École Privée La Providence", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.34284569232528, - 48.8854836125073 - ], - [ - 2.34293597635009, - 48.8846686589997 - ], - [ - 2.34377624252121, - 48.8846870247528 - ], - [ - 2.34377915371878, - 48.8852111102561 - ], - [ - 2.34420755610769, - 48.8855436402642 - ], - [ - 2.34467023069674, - 48.88589870614 - ], - [ - 2.34471550289707, - 48.8861206541588 - ], - [ - 2.34430534917827, - 48.8860270390971 - ], - [ - 2.34391570415074, - 48.8857133916307 - ], - [ - 2.34284569232528, - 48.8854836125073 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 148", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3331324, - 48.827726 - ], - [ - 2.3339236, - 48.8276024 - ], - [ - 2.3339505, - 48.8276695 - ], - [ - 2.3331565, - 48.8277931 - ], - [ - 2.3331324, - 48.827726 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36532833847609, - 48.85585871033 - ], - [ - 2.36517488884782, - 48.8554452011048 - ], - [ - 2.36565858401495, - 48.8553629144841 - ], - [ - 2.36581027137499, - 48.8557902436113 - ], - [ - 2.36532833847609, - 48.85585871033 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Place des Vosges", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3249733, - 48.8622724 - ], - [ - 2.3244154, - 48.8615189 - ], - [ - 2.3245307, - 48.8614713 - ], - [ - 2.3250886, - 48.8622353 - ], - [ - 2.3249733, - 48.8622724 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 106", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.26557522848, - 48.8716812213426 - ], - [ - 2.2655669350514, - 48.8705603440194 - ], - [ - 2.26616486678432, - 48.8693142614038 - ], - [ - 2.2674473145309, - 48.8699122598844 - ], - [ - 2.26869141554039, - 48.8704434152952 - ], - [ - 2.26972218707749, - 48.8711867302046 - ], - [ - 2.27018055009285, - 48.8722847269779 - ], - [ - 2.26733898153756, - 48.8725544007245 - ], - [ - 2.26557522848, - 48.8716812213426 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.30033845008631, - 48.8405830776286 - ], - [ - 2.30083069667202, - 48.8398249372156 - ], - [ - 2.3008986381801, - 48.8398470542949 - ], - [ - 2.30040293327523, - 48.8405971807365 - ], - [ - 2.30033845008631, - 48.8405830776286 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Square Adolphe-Chérioux", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.28399130911727, - 48.8423247568987 - ], - [ - 2.28378096199209, - 48.8421031884523 - ], - [ - 2.28356846114995, - 48.8418745327534 - ], - [ - 2.28399914866388, - 48.8417155235191 - ], - [ - 2.28440538176543, - 48.8421536512526 - ], - [ - 2.28399130911727, - 48.8423247568987 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Marguerite Boucicaut", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3279435, - 48.8327045 - ], - [ - 2.3277692, - 48.8324856 - ], - [ - 2.3278201, - 48.8324644 - ], - [ - 2.3280079, - 48.8326832 - ], - [ - 2.3279435, - 48.8327045 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.41195924531397, - 48.8445557694273 - ], - [ - 2.41198883846659, - 48.8445343308738 - ], - [ - 2.41219982562346, - 48.8448712077258 - ], - [ - 2.41215825127781, - 48.8448815362187 - ], - [ - 2.41195924531397, - 48.8445557694273 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Elémentaire A + B + maternelle Lamoricière - 8 et 10 avenue Lamoricièr", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.385162, - 48.848033 - ], - [ - 2.385454, - 48.847655 - ], - [ - 2.385516, - 48.847591 - ], - [ - 2.38587432662988, - 48.8477095463448 - ], - [ - 2.38569108479598, - 48.8479667121008 - ], - [ - 2.38546722864065, - 48.848305920982 - ], - [ - 2.38511774497269, - 48.8487453819911 - ], - [ - 2.384706, - 48.848657 - ], - [ - 2.385162, - 48.848033 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Martha Desrumaux", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38814552451809, - 48.8429635355495 - ], - [ - 2.386952, - 48.842489 - ], - [ - 2.38642042644438, - 48.8426017674481 - ], - [ - 2.38636712153989, - 48.8425135193799 - ], - [ - 2.38691915779319, - 48.8423887466525 - ], - [ - 2.38720894457112, - 48.841997505103 - ], - [ - 2.3875545436951, - 48.8418773081754 - ], - [ - 2.38802473774029, - 48.8417536999969 - ], - [ - 2.38830365245219, - 48.8418065304524 - ], - [ - 2.38855073774026, - 48.8420293496067 - ], - [ - 2.38899697013951, - 48.8419307772895 - ], - [ - 2.38903410446632, - 48.8420018834691 - ], - [ - 2.3886633049044, - 48.842093975827 - ], - [ - 2.38885691471057, - 48.842531 - ], - [ - 2.38839639019387, - 48.8429690226706 - ], - [ - 2.38876140297681, - 48.8431501712178 - ], - [ - 2.38868922600647, - 48.8432263813634 - ], - [ - 2.38814552451809, - 48.8429635355495 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de Reuilly - Paul Pernin", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37306538999319, - 48.8807438912374 - ], - [ - 2.37305386749444, - 48.8807085106421 - ], - [ - 2.37325022746533, - 48.8806807297147 - ], - [ - 2.37356661000778, - 48.88053891636 - ], - [ - 2.37389991490045, - 48.880401628758 - ], - [ - 2.37390670496651, - 48.8804427887454 - ], - [ - 2.37326846749444, - 48.880710382449 - ], - [ - 2.37306538999319, - 48.8807438912374 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Sadi Lecointe", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.23181375538351, - 48.8626437197461 - ], - [ - 2.23047843660498, - 48.8595352213875 - ], - [ - 2.23010180823223, - 48.8541061489552 - ], - [ - 2.23314907416082, - 48.8524615419464 - ], - [ - 2.23558003911583, - 48.8520109552553 - ], - [ - 2.23609362326047, - 48.8543539617661 - ], - [ - 2.23605938431749, - 48.8570798217245 - ], - [ - 2.23530612757079, - 48.8609768678203 - ], - [ - 2.23633329586252, - 48.8622157495483 - ], - [ - 2.23561427805879, - 48.8630491618206 - ], - [ - 2.23181375538351, - 48.8626437197461 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Slow speed Bois", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 15 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.31977669435658, - 48.8767089520537 - ], - [ - 2.32085420941538, - 48.8767584035409 - ], - [ - 2.32131175923446, - 48.8767787883943 - ], - [ - 2.32131271314777, - 48.8768191228294 - ], - [ - 2.32085267259022, - 48.8767996244378 - ], - [ - 2.31976182464773, - 48.8767542464828 - ], - [ - 2.31977669435658, - 48.8767089520537 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Ecole primaire Fénelon Ste Marie Bienfaisance", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3171824, - 48.8362382 - ], - [ - 2.3174452, - 48.8359628 - ], - [ - 2.3175498, - 48.8358402 - ], - [ - 2.3176248, - 48.8358463 - ], - [ - 2.3176007, - 48.8359205 - ], - [ - 2.3177215, - 48.835962 - ], - [ - 2.3176853, - 48.8359973 - ], - [ - 2.3176524, - 48.8360494 - ], - [ - 2.3176196, - 48.8361058 - ], - [ - 2.3175592, - 48.836233 - ], - [ - 2.3175123, - 48.8362197 - ], - [ - 2.3174224, - 48.8361685 - ], - [ - 2.3173446, - 48.8362048 - ], - [ - 2.3172574, - 48.8362594 - ], - [ - 2.3171824, - 48.8362382 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin du Cloître", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40248243967575, - 48.8673544602982 - ], - [ - 2.40250154326614, - 48.8673291364643 - ], - [ - 2.40338945780994, - 48.8677166888723 - ], - [ - 2.40336054667913, - 48.8677496168107 - ], - [ - 2.40248243967575, - 48.8673544602982 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Bretonneau", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.33777699198128, - 48.8694802044274 - ], - [ - 2.3377774939804, - 48.8694566296137 - ], - [ - 2.33806203321944, - 48.8694517359759 - ], - [ - 2.33857645921013, - 48.8694541514633 - ], - [ - 2.33857305738781, - 48.8694789724385 - ], - [ - 2.33806476800903, - 48.8694772939311 - ], - [ - 2.33777699198128, - 48.8694802044274 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue Ménars", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.337899, - 48.865872 - ], - [ - 2.33666330573596, - 48.8634855939043 - ], - [ - 2.33723848408154, - 48.8633504013242 - ], - [ - 2.33852515286795, - 48.8657169036742 - ], - [ - 2.337899, - 48.865872 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin + cour du Palais Royal", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.330039, - 48.838728 - ], - [ - 2.328415, - 48.836311 - ], - [ - 2.329923, - 48.835573 - ], - [ - 2.330889, - 48.837119 - ], - [ - 2.330889, - 48.83717 - ], - [ - 2.330039, - 48.838728 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Cimetiere Montparnasse 2", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38793654651027, - 48.8549373493067 - ], - [ - 2.387926, - 48.854878 - ], - [ - 2.38794432456975, - 48.8548615299106 - ], - [ - 2.38800922193943, - 48.8547182359576 - ], - [ - 2.388239, - 48.854742 - ], - [ - 2.388301, - 48.854594 - ], - [ - 2.38810795702596, - 48.8545629420301 - ], - [ - 2.38832564913721, - 48.8541489422375 - ], - [ - 2.389583, - 48.854417 - ], - [ - 2.389503, - 48.854675 - ], - [ - 2.388805, - 48.854562 - ], - [ - 2.38884, - 48.854423 - ], - [ - 2.388497, - 48.85437 - ], - [ - 2.388422, - 48.85461 - ], - [ - 2.388722, - 48.854656 - ], - [ - 2.388671, - 48.854825 - ], - [ - 2.388585, - 48.854825 - ], - [ - 2.388489, - 48.85506 - ], - [ - 2.388073, - 48.854989 - ], - [ - 2.388041, - 48.8549739388691 - ], - [ - 2.38798905965512, - 48.8549908806463 - ], - [ - 2.38796569211241, - 48.8549610553366 - ], - [ - 2.38793654651027, - 48.8549373493067 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Pierre Joseph Redouté", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3831474886627, - 48.8337924454068 - ], - [ - 2.3846535555495, - 48.8327419188533 - ], - [ - 2.38573002737374, - 48.8335572579843 - ], - [ - 2.38449292390118, - 48.8344646677687 - ], - [ - 2.3831474886627, - 48.8337924454068 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parc Cours Saint Emilion", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.36006519679492, - 48.8290198651277 - ], - [ - 2.35863678718114, - 48.8283785401915 - ], - [ - 2.35997543086034, - 48.8267682106152 - ], - [ - 2.36169574468946, - 48.82762930979 - ], - [ - 2.36006519679492, - 48.8290198651277 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygon 10", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.37075336401982, - 48.887238512101 - ], - [ - 2.370534, - 48.886967 - ], - [ - 2.370306, - 48.887013 - ], - [ - 2.37011, - 48.886695 - ], - [ - 2.369995, - 48.886718 - ], - [ - 2.369831, - 48.886579 - ], - [ - 2.370233, - 48.886357 - ], - [ - 2.370351, - 48.886454 - ], - [ - 2.370579, - 48.886369 - ], - [ - 2.370724, - 48.886439 - ], - [ - 2.370906, - 48.886685 - ], - [ - 2.371159, - 48.886868 - ], - [ - 2.37130397972793, - 48.8870670665923 - ], - [ - 2.37075336401982, - 48.887238512101 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Luc Hoffman", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40079461926635, - 48.8643230378458 - ], - [ - 2.4008261121904, - 48.864298867491 - ], - [ - 2.40118828081481, - 48.8643506610941 - ], - [ - 2.40118828081481, - 48.8643817372304 - ], - [ - 2.40079461926635, - 48.8643230378458 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Maternelle Cour des Noues", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.40562718038738, - 48.8718282520247 - ], - [ - 2.40576033725426, - 48.8715561256881 - ], - [ - 2.40599380914929, - 48.8715236884957 - ], - [ - 2.40624750588011, - 48.871481274127 - ], - [ - 2.40595884313562, - 48.8718992865969 - ], - [ - 2.40562718038738, - 48.8718282520247 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Paule Minck", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.3359713724024, - 48.8362280005191 - ], - [ - 2.33631417931453, - 48.8351892483834 - ], - [ - 2.3366043724024, - 48.8356420005191 - ], - [ - 2.33695239677893, - 48.8362618119136 - ], - [ - 2.3359713724024, - 48.8362280005191 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin de l'Observatoire", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.335274, - 48.861538 - ], - [ - 2.335124, - 48.861168 - ], - [ - 2.334888, - 48.860809 - ], - [ - 2.338874, - 48.859856 - ], - [ - 2.339245, - 48.860572 - ], - [ - 2.335277, - 48.86155 - ], - [ - 2.335274, - 48.861538 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Polygone 124", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.39852344654416, - 48.8589137343641 - ], - [ - 2.39917676962306, - 48.8581956096714 - ], - [ - 2.399978, - 48.858664 - ], - [ - 2.399098, - 48.859335 - ], - [ - 2.39852344654416, - 48.8589137343641 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Jardin Naturel Pierre Emmanuel", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.38310053681268, - 48.8710540930053 - ], - [ - 2.38298377576853, - 48.8709394694135 - ], - [ - 2.38287647791287, - 48.8708307159762 - ], - [ - 2.38275599999875, - 48.8707352576314 - ], - [ - 2.382696058901, - 48.8707156937996 - ], - [ - 2.38262349263723, - 48.8706761166128 - ], - [ - 2.38265094109897, - 48.8706611300659 - ], - [ - 2.3827742536814, - 48.870686270981 - ], - [ - 2.38299018005599, - 48.8707065419542 - ], - [ - 2.38322052208707, - 48.8707303305398 - ], - [ - 2.38338404417543, - 48.8706107181677 - ], - [ - 2.38365831258124, - 48.870459235849 - ], - [ - 2.38374392637464, - 48.8705165176121 - ], - [ - 2.38384491164906, - 48.8705995176143 - ], - [ - 2.38360030120992, - 48.8707466123972 - ], - [ - 2.3834986874176, - 48.8708021762086 - ], - [ - 2.38340901472552, - 48.8708521872862 - ], - [ - 2.38331152208713, - 48.8709144341298 - ], - [ - 2.38319934203112, - 48.8709923749749 - ], - [ - 2.38310053681268, - 48.8710540930053 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Parc de Belleville 1", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": false, - "ride_start_allowed": false, - "ride_end_allowed": false, - "maximum_speed_kph": 2 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.2872674, - 48.8504406 - ], - [ - 2.287246, - 48.8504125 - ], - [ - 2.2875906, - 48.8502775 - ], - [ - 2.2876134, - 48.8503048 - ], - [ - 2.2872674, - 48.8504406 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Rue aux écoles", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.379683, - 48.8653898 - ], - [ - 2.3801739, - 48.8648199 - ], - [ - 2.3802785, - 48.8648587 - ], - [ - 2.379844, - 48.8653916 - ], - [ - 2.38040627684481, - 48.8655403451292 - ], - [ - 2.38030797745671, - 48.8656167798625 - ], - [ - 2.3796535, - 48.865418 - ], - [ - 2.379683, - 48.8653898 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "Élémentaire Privée École Plus - Rue Dranem/Vla Gaudet", - "language": "en" - } - ], - "rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ], - "ride_through_allowed": true, - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10 - } - ] - } - }, - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [ - 2.21456409041527, - 48.8429963083781 - ], - [ - 2.21456518889016, - 48.8414866267407 - ], - [ - 2.21471771606928, - 48.8393060567452 - ], - [ - 2.21511624230321, - 48.8364481921475 - ], - [ - 2.22072471026459, - 48.8256966600211 - ], - [ - 2.22440761209312, - 48.8219136974886 - ], - [ - 2.24847429921914, - 48.8112664398499 - ], - [ - 2.25506974700164, - 48.8104652556422 - ], - [ - 2.25902430041904, - 48.8105194591848 - ], - [ - 2.27062322485242, - 48.803894192757 - ], - [ - 2.27710532705646, - 48.804266881847 - ], - [ - 2.27894381701165, - 48.8048123425926 - ], - [ - 2.28277961899005, - 48.8036747095931 - ], - [ - 2.29450065019645, - 48.8011614310373 - ], - [ - 2.30822347273745, - 48.7980170215032 - ], - [ - 2.31031191411705, - 48.7975842180654 - ], - [ - 2.3151741334161, - 48.7966813033998 - ], - [ - 2.32075059898458, - 48.7955278273951 - ], - [ - 2.32754436964088, - 48.7933101925124 - ], - [ - 2.33002622529665, - 48.7929924316223 - ], - [ - 2.33931984265208, - 48.792601443155 - ], - [ - 2.34248527378613, - 48.7927359320787 - ], - [ - 2.34241689287041, - 48.7920597440687 - ], - [ - 2.34448505764888, - 48.7919689546119 - ], - [ - 2.35225318536435, - 48.7932651786769 - ], - [ - 2.35496558048178, - 48.791930037472 - ], - [ - 2.36296246570887, - 48.7917484583751 - ], - [ - 2.37986504235855, - 48.7940610687244 - ], - [ - 2.39131049999836, - 48.7976473040212 - ], - [ - 2.39533335442516, - 48.7991195527751 - ], - [ - 2.40124061554103, - 48.8016152323517 - ], - [ - 2.40521825262907, - 48.8027728512983 - ], - [ - 2.41381076731349, - 48.806620373404 - ], - [ - 2.41499521618407, - 48.8069106344688 - ], - [ - 2.42479132070917, - 48.8105275210839 - ], - [ - 2.4318043419611, - 48.8141539871649 - ], - [ - 2.43272186873322, - 48.8145817013479 - ], - [ - 2.4459056789162, - 48.8259531813342 - ], - [ - 2.4481151376478, - 48.8299475601515 - ], - [ - 2.4497862059864, - 48.8340846885213 - ], - [ - 2.45213749294651, - 48.8430716179215 - ], - [ - 2.45261828899011, - 48.8459127165423 - ], - [ - 2.4528271450403, - 48.8485904799302 - ], - [ - 2.45254845795741, - 48.8530231517255 - ], - [ - 2.45151625380055, - 48.8580616567545 - ], - [ - 2.45074640267583, - 48.8628102190055 - ], - [ - 2.45075081897249, - 48.8688724622036 - ], - [ - 2.45067533151455, - 48.870426424519 - ], - [ - 2.45033300324875, - 48.8739197800021 - ], - [ - 2.44976114956159, - 48.8768760460919 - ], - [ - 2.44852260254621, - 48.8811405833166 - ], - [ - 2.44480280558958, - 48.8880206052598 - ], - [ - 2.44245907259722, - 48.8908789424263 - ], - [ - 2.43484377854071, - 48.8955990794331 - ], - [ - 2.43460854753492, - 48.8964062719657 - ], - [ - 2.43276627828644, - 48.9011082803521 - ], - [ - 2.42267163991295, - 48.9124439649134 - ], - [ - 2.41909613146525, - 48.9146942047501 - ], - [ - 2.39774008232813, - 48.9212166401622 - ], - [ - 2.39570186380672, - 48.9213596554837 - ], - [ - 2.39045565915548, - 48.9233001646123 - ], - [ - 2.38930393834198, - 48.9234771577561 - ], - [ - 2.3801616180296, - 48.9241007288077 - ], - [ - 2.3767150373998, - 48.9240488665959 - ], - [ - 2.37224641197368, - 48.9242378116884 - ], - [ - 2.36407186918684, - 48.9247371194508 - ], - [ - 2.36069776545345, - 48.9248399084529 - ], - [ - 2.3603293022583, - 48.9248399132023 - ], - [ - 2.35881752822775, - 48.9250030886981 - ], - [ - 2.3548227686115, - 48.925286908803 - ], - [ - 2.35336115189187, - 48.9253374775482 - ], - [ - 2.35076218328524, - 48.925366452726 - ], - [ - 2.34049238475405, - 48.9252400309011 - ], - [ - 2.33784396147292, - 48.9251439448978 - ], - [ - 2.33121911859666, - 48.9247442554298 - ], - [ - 2.31983014886547, - 48.924608478298 - ], - [ - 2.30303825346749, - 48.9216900995412 - ], - [ - 2.29357792729551, - 48.9183020270077 - ], - [ - 2.29119557451113, - 48.9173697938318 - ], - [ - 2.2830048305792, - 48.9138804101863 - ], - [ - 2.28079170208673, - 48.912858906802 - ], - [ - 2.27484571839115, - 48.9098918352158 - ], - [ - 2.27015180342324, - 48.9090855786565 - ], - [ - 2.26397708609231, - 48.9060678322469 - ], - [ - 2.25752695832707, - 48.9020224407742 - ], - [ - 2.25295121995678, - 48.8983503354349 - ], - [ - 2.2455892333944, - 48.8884338521791 - ], - [ - 2.24471304901611, - 48.8858800789076 - ], - [ - 2.24381899206766, - 48.8846099434862 - ], - [ - 2.24349070814468, - 48.8838410389798 - ], - [ - 2.24073754983672, - 48.8819288722543 - ], - [ - 2.23969071589594, - 48.8801962638986 - ], - [ - 2.23903282962716, - 48.8784013067277 - ], - [ - 2.23738852579003, - 48.8764731235232 - ], - [ - 2.23662129234505, - 48.8755241341724 - ], - [ - 2.23356472537334, - 48.8715296010617 - ], - [ - 2.23241968854458, - 48.8698805722762 - ], - [ - 2.22976003018131, - 48.8656317111714 - ], - [ - 2.22972126066153, - 48.8655695228531 - ], - [ - 2.2263876568149, - 48.8602002003706 - ], - [ - 2.21775426461411, - 48.8531432121227 - ], - [ - 2.21650967029912, - 48.8507386263945 - ], - [ - 2.21456409041527, - 48.8429963083781 - ] - ], - [ - [ - 2.25100380935558, - 48.8414923712981 - ], - [ - 2.25140028258116, - 48.8386343814817 - ], - [ - 2.25508181965373, - 48.8348504414872 - ], - [ - 2.26168026686793, - 48.8340488805675 - ], - [ - 2.26391750862814, - 48.8343844192571 - ], - [ - 2.26824666771864, - 48.8346081104682 - ], - [ - 2.26977592157959, - 48.832967685056 - ], - [ - 2.26714220659702, - 48.8315322687583 - ], - [ - 2.26745372127229, - 48.8277850791765 - ], - [ - 2.27393889042318, - 48.8281579464159 - ], - [ - 2.27674252250154, - 48.8299103852768 - ], - [ - 2.27926295942083, - 48.8322965864515 - ], - [ - 2.28936334811021, - 48.8282948783222 - ], - [ - 2.29405341618079, - 48.8264786363884 - ], - [ - 2.30612344430321, - 48.8238903778911 - ], - [ - 2.32019364851507, - 48.8206662198217 - ], - [ - 2.32557343247848, - 48.8196671428364 - ], - [ - 2.33194018149973, - 48.818350147294 - ], - [ - 2.33449213030298, - 48.8168514551005 - ], - [ - 2.33697510751628, - 48.8165335449355 - ], - [ - 2.341251346051, - 48.8167152081337 - ], - [ - 2.34414815280115, - 48.8157160523965 - ], - [ - 2.3448378686939, - 48.8159885513903 - ], - [ - 2.34690701637132, - 48.8158977185571 - ], - [ - 2.35139016967497, - 48.8177597587484 - ], - [ - 2.35387314688825, - 48.817668929124 - ], - [ - 2.35573537979874, - 48.8168514551005 - ], - [ - 2.35621818092355, - 48.8158977185571 - ], - [ - 2.3642188852792, - 48.8157160523965 - ], - [ - 2.37566816909882, - 48.8193038371786 - ], - [ - 2.38394475980681, - 48.8228009278113 - ], - [ - 2.39049706078688, - 48.8247081200699 - ], - [ - 2.39546301521543, - 48.8279320181257 - ], - [ - 2.39987719692806, - 48.8287947162308 - ], - [ - 2.40229120255765, - 48.8293863454994 - ], - [ - 2.41001602055536, - 48.8333817590024 - ], - [ - 2.41167133869789, - 48.8341535635276 - ], - [ - 2.41387842955518, - 48.8381485968768 - ], - [ - 2.41622346359051, - 48.8471362570454 - ], - [ - 2.41643037835848, - 48.8498140863037 - ], - [ - 2.41532683293104, - 48.8551818887268 - ], - [ - 2.41429225909135, - 48.8615348055902 - ], - [ - 2.41429225909408, - 48.8688782082629 - ], - [ - 2.41394740114816, - 48.8723714562076 - ], - [ - 2.41270591254155, - 48.8766356101133 - ], - [ - 2.41036087850625, - 48.8794932970686 - ], - [ - 2.40249811732861, - 48.8818972564765 - ], - [ - 2.40047880393499, - 48.8837961821435 - ], - [ - 2.39928700210456, - 48.8857175109951 - ], - [ - 2.39974834474779, - 48.8880432313689 - ], - [ - 2.39928700210456, - 48.8904193991615 - ], - [ - 2.39744163152838, - 48.8951208452066 - ], - [ - 2.39386622603712, - 48.897370305476 - ], - [ - 2.38629933097542, - 48.8979010622403 - ], - [ - 2.38403106297451, - 48.898684550021 - ], - [ - 2.38214724717869, - 48.8999482141126 - ], - [ - 2.3809960349522, - 48.900125124536 - ], - [ - 2.37595971108868, - 48.9000493058597 - ], - [ - 2.3693855784104, - 48.9003273071101 - ], - [ - 2.36069695861414, - 48.9008580324764 - ], - [ - 2.35735222444504, - 48.9008580324764 - ], - [ - 2.35290403294928, - 48.9013382077177 - ], - [ - 2.351443114576, - 48.9013887522114 - ], - [ - 2.34117824074647, - 48.9012623908817 - ], - [ - 2.33322008013633, - 48.9007822149161 - ], - [ - 2.32049471220446, - 48.9006305794421 - ], - [ - 2.31103718800142, - 48.8972439339912 - ], - [ - 2.30284835606909, - 48.8937559548075 - ], - [ - 2.29454788289758, - 48.8896147128963 - ], - [ - 2.29191416791502, - 48.8898381573961 - ], - [ - 2.28574051343938, - 48.8868215723981 - ], - [ - 2.28116409382656, - 48.8831505828541 - ], - [ - 2.27969147899805, - 48.8788671499768 - ], - [ - 2.27892685206714, - 48.8781221676814 - ], - [ - 2.27816222513707, - 48.8763341649029 - ], - [ - 2.27683120788512, - 48.8737389158208 - ], - [ - 2.27462228564193, - 48.8730683635164 - ], - [ - 2.273574463552, - 48.8713360617975 - ], - [ - 2.27331958791129, - 48.8695824301719 - ], - [ - 2.26918493858392, - 48.8647378957565 - ], - [ - 2.26612643086395, - 48.8607442231418 - ], - [ - 2.26346439636512, - 48.8564961370991 - ], - [ - 2.25958462267977, - 48.8502537777007 - ], - [ - 2.25675267108522, - 48.8455575197499 - ], - [ - 2.25309945352888, - 48.8457438875843 - ], - [ - 2.25224986805668, - 48.8454062678643 - ], - [ - 2.25100380935558, - 48.8430020533527 - ], - [ - 2.25100380935558, - 48.8414923712981 - ] - ] - ] - ] - }, - "properties": { - "name": [ - { - "text": "PARIS-outer-constrained#1", - "language": "en" - } - ], - "rules": [ - { - "ride_start_allowed": false, - "ride_end_allowed": false, - "ride_through_allowed": true, - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" - ] - } - ] - } - } + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 60, + "version": "3.0", + "data": { + "geofencing_zones": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + -122.578067, + 45.562982 + ], + [ + -122.661838, + 45.562741 + ], + [ + -122.661151, + 45.504542 + ], + [ + -122.578926, + 45.5046625 + ], + [ + -122.578067, + 45.562982 + ] + ] + ] ] - }, - "global_rules": [ - { - "vehicle_type_id": [ - "ebicycle_paris", - "escooter_paris" + }, + "properties": { + "name": [ + { + "text": "NE 24th/NE Knott", + "language": "en" + } + ], + "start": "2023-07-17T13:34:13+02:00", + "end": "2024-07-18T13:34:13+02:00", + "rules": [ + { + "vehicle_type_ids": [ + "moped1", + "car1" ], - "ride_start_allowed": false, - "ride_end_allowed": false, + "ride_start_allowed": true, + "ride_end_allowed": true, + "maximum_speed_kph": 10, + "station_parking": true, "ride_through_allowed": false - } - ] - } + } + ] + } + } + ] + }, + "global_rules": [ + { + "ride_start_allowed": false, + "ride_end_allowed": false, + "ride_through_allowed": true + } + ] + } } \ No newline at end of file diff --git a/testFixtures/v3.0/manifest.json b/testFixtures/v3.0/manifest.json index 690f9095..dd84efc4 100644 --- a/testFixtures/v3.0/manifest.json +++ b/testFixtures/v3.0/manifest.json @@ -1,156 +1,35 @@ { - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 60, - "version": "3.0", - "data": { - "datasets": [ - { - "system_id": "example_berlin", - "versions": [ - { - "url": "https://berlin.example.com/gbfs/2.1", - "version": "2.1" - }, - { - "url": "https://berlin.example.com/gbfs/2.2", - "version": "2.2" - }, - { - "url": "https://berlin.example.com/gbfs/2.3", - "version": "2.3" - }, - { - "url": "https://berlin.example.com/gbfs/3.0", - "version": "3.0" - } - ] - }, - { - "system_id": "example_rome", - "versions": [ - { - "url": "https://berlin.example.com/data-sharing/tier_tier_mainz/gbfs/2.1", - "version": "2.1" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_mainz/gbfs/2.2", - "version": "2.2" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_mainz/gbfs/2.3", - "version": "2.3" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_mainz/gbfs/3.0", - "version": "3.0" - } - ] - }, - { - "system_id": "example_london", - "versions": [ - { - "url": "https://berlin.example.com/data-sharing/tier_tier_boras/gbfs/2.1", - "version": "2.1" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_boras/gbfs/2.2", - "version": "2.2" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_boras/gbfs/2.3", - "version": "2.3" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_boras/gbfs/3.0", - "version": "3.0" - } - ] - }, - { - "system_id": "example_toronto", - "versions": [ - { - "url": "https://berlin.example.com/data-sharing/tier_tier_rabka-zdroj/gbfs/2.1", - "version": "2.1" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_rabka-zdroj/gbfs/2.2", - "version": "2.2" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_rabka-zdroj/gbfs/2.3", - "version": "2.3" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_rabka-zdroj/gbfs/3.0", - "version": "3.0" - } - ] - }, - { - "system_id": "example_montreal", - "versions": [ - { - "url": "https://berlin.example.com/data-sharing/tier_tier_osnabrueck/gbfs/2.1", - "version": "2.1" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_osnabrueck/gbfs/2.2", - "version": "2.2" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_osnabrueck/gbfs/2.3", - "version": "2.3" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_osnabrueck/gbfs/3.0", - "version": "3.0" - } - ] - }, - { - "system_id": "example_los_angeles", - "versions": [ - { - "url": "https://berlin.example.com/data-sharing/tier_tier_dornbirn/gbfs/2.1", - "version": "2.1" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_dornbirn/gbfs/2.2", - "version": "2.2" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_dornbirn/gbfs/2.3", - "version": "2.3" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_dornbirn/gbfs/3.0", - "version": "3.0" - } - ] - }, - { - "system_id": "example_las_vegas", - "versions": [ - { - "url": "https://berlin.example.com/data-sharing/tier_tier_trnava/gbfs/2.1", - "version": "2.1" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_trnava/gbfs/2.2", - "version": "2.2" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_trnava/gbfs/2.3", - "version": "2.3" - }, - { - "url": "https://berlin.example.com/data-sharing/tier_tier_trnava/gbfs/3.0", - "version": "3.0" - } - ] - } + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl":0, + "version":"3.0", + "data":{ + "datasets":[ + { + "system_id":"example_berlin", + "versions":[ + { + "version":"2.0", + "url":"https://berlin.example.com/gbfs/2/gbfs" + }, + { + "version":"3.0", + "url":"https://berlin.example.com/gbfs/3/gbfs" + } ] - } + }, + { + "system_id":"example_paris", + "versions":[ + { + "version":"2.0", + "url":"https://paris.example.com/gbfs/2/gbfs" + }, + { + "version":"3.0", + "url":"https://paris.example.com/gbfs/3/gbfs" + } + ] + } + ] + } } \ No newline at end of file diff --git a/testFixtures/v3.0/station_information.json b/testFixtures/v3.0/station_information.json deleted file mode 100644 index c034ab0a..00000000 --- a/testFixtures/v3.0/station_information.json +++ /dev/null @@ -1,1243 +0,0 @@ -{ - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 60, - "version": "3.0", - "data": { - "stations": [ - { - "station_id": "6efbec5a-6b8c-455b-bed2-8d66be6d6a4b", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8456017931977, - "lon": 2.38465095280482, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.38458854960718, 48.8456006733178], - [2.38466244972491, 48.8456422097982], - [2.3846667924427, 48.8456442008744], - [2.38467164273782, 48.8456455949874], - [2.38467681352961, 48.845646338365], - [2.38468210537548, 48.8456464023343], - [2.3846873141637, 48.845645784428], - [2.38469223898614, 48.8456445084794], - [2.38469668988753, 48.8456426237029], - [2.38470049519219, 48.8456402027962], - [2.38471639691169, 48.845627877954], - [2.38471940034936, 48.8456250255281], - [2.3847215022302, 48.8456218428093], - [2.38472262207705, 48.8456184516579], - [2.38472271701307, 48.845614981915], - [2.3847217834033, 48.8456115664305], - [2.38471985699397, 48.8456083359771], - [2.38471701154371, 48.8456054142429], - [2.38471335599958, 48.8456029130958], - [2.38463945588665, 48.8455613766025], - [2.38463511317159, 48.8455593855248], - [2.38463026287997, 48.8455579914103], - [2.38462509209207, 48.8455572480314], - [2.38461980025003, 48.845557184061], - [2.38461459146514, 48.8455578019664], - [2.38460966664511, 48.8455590779145], - [2.38460521574486, 48.8455609626907], - [2.38460141043976, 48.8455633835973], - [2.38458550871546, 48.8455757084358], - [2.38458250527254, 48.8455785608641], - [2.38458040338688, 48.845581743586], - [2.38457928353587, 48.8455851347409], - [2.38457918859658, 48.8455886044875], - [2.38458012220407, 48.8455920199754], - [2.3845820486122, 48.8455952504319], - [2.38458489406228, 48.8455981721687], - [2.38458854960718, 48.8456006733178] - ] - ] - ] - } - }, - { - "station_id": "42105087-bd41-4a5b-893a-5d8e65c3f05d", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8571286473809, - "lon": 2.35395732117579, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.35391920536986, 48.8571267805432], - [2.35392899447433, 48.8571455416821], - [2.35393119436881, 48.857148706202], - [2.3539342912803, 48.8571515270911], - [2.35393816592782, 48.8571538957], - [2.35394266907504, 48.857155720799], - [2.35394762727824, 48.8571569320926], - [2.35395284956675, 48.8571574829265], - [2.35395813479834, 48.8571573520847], - [2.35396327940646, 48.8571565446067], - [2.35397874332561, 48.8571530315916], - [2.35398353882951, 48.8571515825498], - [2.35398781320991, 48.8571495464364], - [2.35399140257476, 48.8571470013218], - [2.35399416929751, 48.8571440447929], - [2.35399600729402, 48.8571407902115], - [2.35399684609024, 48.8571373623675], - [2.35399665352429, 48.8571338926944], - [2.35399543697971, 48.8571305142294], - [2.35398564787033, 48.8571117530873], - [2.35398344797545, 48.8571085885661], - [2.35398035106401, 48.8571057676753], - [2.35397647641693, 48.8571033990649], - [2.35397197327048, 48.8571015739645], - [2.35396701506826, 48.8571003626699], - [2.35396179278083, 48.8570998118354], - [2.3539565075503, 48.8570999426771], - [2.35395136294309, 48.8571007501555], - [2.35393589902885, 48.8571042631717], - [2.35393110352488, 48.8571057122144], - [2.35392682914425, 48.8571077483291], - [2.35392323977898, 48.8571102934452], - [2.35392047305567, 48.8571132499757], - [2.35391863505842, 48.8571165045586], - [2.35391779626134, 48.8571199324037], - [2.35391798882632, 48.8571234020777], - [2.35391920536986, 48.8571267805432] - ] - ] - ] - } - }, - { - "station_id": "dba20483-5fdb-42ba-9955-d883df3195ee", - "name": [ - { - "language": "en", - "text": "73 rue de Lourmel 75015 Fantasmo" - } - ], - "is_virtual_station": true, - "lat": 48.845714, - "lon": 2.2880865, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.288068, 48.845709], - [2.288089, 48.845701], - [2.288105, 48.845718], - [2.288084, 48.845727], - [2.288068, 48.845709] - ] - ] - ] - }, - "capacity": 10, - "vehicle_type_area_capacity": [ - { - "vehicle_type_id": "escooter_paris", - "count": 10 - } - ] - }, - { - "station_id": "0b101ae7-3185-4c05-81a6-82e6a214c9d0", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8467436943588, - "lon": 2.30246522326395, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.30249756661188, 48.8467272031906], - [2.30247868381164, 48.8467182541459], - [2.302474106332, 48.8467165061803], - [2.30246909801972, 48.8467153806199], - [2.30246385201943, 48.8467149208717], - [2.30245857064217, 48.8467151446659], - [2.30245345756328, 48.846716043372], - [2.30244870996769, 48.8467175823313], - [2.30244451094554, 48.8467197021942], - [2.30244102243135, 48.8467223212085], - [2.3024267167961, 48.8467354701447], - [2.30242408102814, 48.8467384761056], - [2.30242238530911, 48.8467417623118], - [2.30242169457537, 48.8467452029203], - [2.30242203527807, 48.8467486661755], - [2.30242339437025, 48.8467520194544], - [2.30242571980643, 48.8467551343456], - [2.3024289225357, 48.8467578915666], - [2.30243287991179, 48.8467601855318], - [2.30245176271424, 48.8467691345735], - [2.30245634019468, 48.8467708825382], - [2.30246134850811, 48.846772008098], - [2.30246659450975, 48.8467724678459], - [2.30247187588841, 48.8467722440519], - [2.3024769889686, 48.8467713453465], - [2.30248173656521, 48.8467698063881], - [2.30248593558796, 48.8467676865263], - [2.30248942410224, 48.8467650675131], - [2.30250372973529, 48.8467519185803], - [2.3025063655021, 48.8467489126199], - [2.30250806121995, 48.846745626414], - [2.30250875195252, 48.8467421858055], - [2.30250841124871, 48.84673872255], - [2.30250705215552, 48.8467353692706], - [2.30250472671847, 48.8467322543785], - [2.3025015239885, 48.8467294971565], - [2.30249756661188, 48.8467272031906] - ] - ] - ] - } - }, - { - "station_id": "50fd7b37-94aa-4ac5-a7a3-3d7b36371180", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.836969961809, - "lon": 2.35312292762613, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.35309813071313, 48.8369446882883], - [2.35307739576973, 48.8369723773864], - [2.35307553783183, 48.8369756271226], - [2.35307467730913, 48.8369790528289], - [2.35307484717433, 48.8369825232424], - [2.35307604091869, 48.836985905387], - [2.35307821280143, 48.8369890696688], - [2.35308127960238, 48.836991894842], - [2.35308512381071, 48.8369942726541], - [2.35308959812762, 48.8369961119946], - [2.35311158163724, 48.8370032855153], - [2.35311652961718, 48.837004518573], - [2.35312174825037, 48.8370050915822], - [2.35312703640032, 48.8370049824578], - [2.35313219025122, 48.8370041954057], - [2.35313701116341, 48.8370027607605], - [2.35314131332937, 48.8370007338163], - [2.35314493093507, 48.8369981926952], - [2.35314772455079, 48.8369952353373], - [2.35316845948536, 48.8369675462441], - [2.35317031742187, 48.8369642965072], - [2.35317117794314, 48.8369608707997], - [2.3531710080765, 48.8369574003848], - [2.35316981433076, 48.8369540182385], - [2.35316764244674, 48.8369508539549], - [2.35316457564467, 48.83694802878], - [2.35316073143542, 48.8369456509663], - [2.35315625711781, 48.8369438116248], - [2.35313427361702, 48.8369366381032], - [2.35312932563834, 48.836935405045], - [2.3531241070068, 48.8369348320358], - [2.35311881885868, 48.8369349411606], - [2.35311366500958, 48.8369357282136], - [2.35310884409894, 48.83693716286], - [2.35310454193412, 48.8369391898059], - [2.35310092432899, 48.8369417309286], - [2.35309813071313, 48.8369446882883] - ] - ] - ] - } - }, - { - "station_id": "bfe1c452-7c8a-4d4b-aeb7-6f46ffd62ef1", - "name": [ - { - "language": "en", - "text": "1280-BIKE" - } - ], - "is_virtual_station": true, - "lat": 48.8842375458768, - "lon": 2.33049288758706, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.3305114331079, 48.8842056311299], - [2.33051655651759, 48.884204767049], - [2.33052183790298, 48.8842045776485], - [2.33052707382552, 48.8842050702239], - [2.33053206259791, 48.8842062258013], - [2.33053661205302, 48.884207999868], - [2.33054054694621, 48.8842103240869], - [2.3305437157057, 48.8842131089293], - [2.33054599627113, 48.8842162471232], - [2.33055437670743, 48.8842314620975], - [2.33055567935062, 48.884234824638], - [2.33055596059323, 48.8842382896386], - [2.33055520965268, 48.8842417242546], - [2.33055345531934, 48.884244996806], - [2.33055076485268, 48.8842479818263], - [2.33054724140267, 48.8842505648727], - [2.33054302005506, 48.8842526469138], - [2.33053826265234, 48.884254148126], - [2.33047434205192, 48.8842694606246], - [2.33046921863934, 48.884270324705], - [2.33046393725088, 48.8842705141052], - [2.33045870132544, 48.8842700215295], - [2.33045371255068, 48.8842688659519], - [2.33044916309404, 48.8842670918852], - [2.33044522820042, 48.8842647676662], - [2.33044205944179, 48.8842619828237], - [2.33043977887862, 48.8842588446298], - [2.33043139845853, 48.8842436296549], - [2.33043009581982, 48.8842402671159], - [2.3304298145809, 48.8842368021168], - [2.33043056552418, 48.8842333675023], - [2.33043231985923, 48.8842300949522], - [2.33043501032656, 48.8842271099328], - [2.33043853377628, 48.8842245268871], - [2.33044275512276, 48.8842224448465], - [2.3304475125237, 48.8842209436344], - [2.3305114331079, 48.8842056311299] - ] - ] - ] - } - }, - { - "station_id": "4e503339-6c70-4566-8fae-713b60a96533", - "name": [ - { - "language": "en", - "text": "1173-BIKE" - } - ], - "is_virtual_station": true, - "lat": 48.8606340759798, - "lon": 2.35987429750945, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.35992902478709, 48.8606389743333], - [2.35993177082677, 48.8606419363207], - [2.35993358749841, 48.8606451934247], - [2.35993440523705, 48.8606486209225], - [2.35993419272941, 48.8606520875665], - [2.35993295811294, 48.8606554606101], - [2.35993074866423, 48.860658610891], - [2.35992764898869, 48.8606614177768], - [2.35992377778077, 48.860663773785], - [2.35990420325957, 48.8606735331213], - [2.35989969173096, 48.8606753534747], - [2.35989472644178, 48.8606765586557], - [2.35988949888633, 48.8606771021846], - [2.3598842106736, 48.8606769630995], - [2.35987906575196, 48.8606761467643], - [2.35987426254351, 48.8606746846622], - [2.35986998629164, 48.8606726331816], - [2.35986640191683, 48.8606700714409], - [2.35981957022839, 48.8606291776444], - [2.35981682418932, 48.8606262156551], - [2.35981500751882, 48.8606229585487], - [2.35981418978185, 48.8606195310482], - [2.35981440229163, 48.8606160644012], - [2.35981563691062, 48.8606126913546], - [2.35981784636212, 48.8606095410709], - [2.35982094604057, 48.8606067341826], - [2.35982481725138, 48.8606043781727], - [2.35984439176598, 48.8605946188381], - [2.35984890329369, 48.8605927984844], - [2.35985386858103, 48.8605915933034], - [2.35985909613399, 48.8605910497749], - [2.35986438434386, 48.860591188861], - [2.35986952926263, 48.8605920051976], - [2.3598743324685, 48.8605934673013], - [2.35987860871838, 48.8605955187839], - [2.35988219309206, 48.8605980805265], - [2.35992902478709, 48.8606389743333] - ] - ] - ] - } - }, - { - "station_id": "56f5ddd7-f550-4455-af9b-1f6251abbf5a", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8379721984624, - "lon": 2.32252327533574, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.32254000860494, 48.8380316529814], - [2.32258236792217, 48.837925929238], - [2.3225832075633, 48.8379224994123], - [2.32258301540591, 48.8379190276512], - [2.32258179882103, 48.837915647129], - [2.32257960447606, 48.8379124875206], - [2.32257651654466, 48.8379096700265], - [2.32257265347787, 48.837907302724], - [2.32256816346043, 48.8379054764213], - [2.3225632187265, 48.8379042611744], - [2.32253951008512, 48.8379001220073], - [2.32253429064557, 48.8378995640313], - [2.32252900614368, 48.8378996876131], - [2.32252386003051, 48.837900487995], - [2.32251905042924, 48.8379019343626], - [2.32251476250747, 48.8379039710312], - [2.32251116134837, 48.8379065195899], - [2.32250838559504, 48.8379094819202], - [2.32250654211279, 48.8379127439736], - [2.32246418275084, 48.838018467728], - [2.32246334310819, 48.8380218975464], - [2.32246353526373, 48.8380253692999], - [2.32246475184651, 48.8380287498145], - [2.3224669461892, 48.8380319094157], - [2.32247003411828, 48.8380347269034], - [2.32247389718281, 48.8380370942007], - [2.3224783871982, 48.8380389204997], - [2.32248333193041, 48.8380401357449], - [2.32250704061652, 48.8380442749172], - [2.32251226005842, 48.8380448328936], - [2.3225175445632, 48.8380447093134], - [2.32252269067944, 48.8380439089343], - [2.32252750028364, 48.8380424625706], - [2.3225317882079, 48.8380404259068], - [2.32253538936877, 48.8380378773534], - [2.32253816512293, 48.8380349150289], - [2.32254000860494, 48.8380316529814] - ] - ] - ] - } - }, - { - "station_id": "fd23f951-5240-4991-816c-3440d8403012", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8448541377892, - "lon": 2.38048574075893, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.38045684821106, 48.8448998627648], - [2.38056069493118, 48.8448502226499], - [2.38056463810915, 48.8448479180498], - [2.38056782379354, 48.8448451521992], - [2.38057012999164, 48.8448420310136], - [2.38057146838979, 48.8448386740156], - [2.38057178773532, 48.8448352097583], - [2.38057107579919, 48.8448317709022], - [2.38056935984432, 48.8448284891348], - [2.38056670558155, 48.8448254901285], - [2.38055231954341, 48.8448123794395], - [2.3805488149062, 48.8448097696492], - [2.3805446028387, 48.8448076609249], - [2.38053984577958, 48.8448061345898], - [2.38053472718512, 48.8448052495072], - [2.38052944445424, 48.8448050398103], - [2.3805242013158, 48.8448055135862], - [2.38051919997175, 48.8448066525636], - [2.38051463329926, 48.8448084128178], - [2.38041078659156, 48.8448580529492], - [2.38040684341555, 48.8448603575464], - [2.38040365773178, 48.8448631233933], - [2.3804013515328, 48.8448662445746], - [2.38040001313216, 48.8448696015677], - [2.38039969378255, 48.84487306582], - [2.38040040571314, 48.8448765046713], - [2.38040212166129, 48.8448797864344], - [2.38040477591648, 48.8448827854375], - [2.3804191619422, 48.844895896133], - [2.38042266657789, 48.8448985059241], - [2.38042687864607, 48.8449006146494], - [2.38043163570773, 48.8449021409857], - [2.38043675430616, 48.8449030260697], - [2.3804420370419, 48.844903235768], - [2.38044728018552, 48.8449027619936], - [2.38045228153448, 48.8449016230176], - [2.38045684821106, 48.8448998627648] - ] - ] - ] - } - }, - { - "station_id": "3a2f2fef-e87e-43a4-b4dd-f0a0049a5134", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8703495036315, - "lon": 2.37690410947908, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.37694115537524, 48.8703321871502], - [2.37689934617586, 48.8703197564954], - [2.37689433479567, 48.8703186413495], - [2.37688908877247, 48.8703181916573], - [2.37688381027057, 48.8703184247485], - [2.37687870270587, 48.8703193316404], - [2.37687396290695, 48.8703208773845], - [2.37686977352989, 48.8703230024129], - [2.37686629601935, 48.8703256248339], - [2.37686366438704, 48.8703286435881], - [2.37685358220045, 48.8703434013977], - [2.37685190117766, 48.8703466906616], - [2.3768512265996, 48.8703501323161], - [2.37685158431767, 48.8703535944691], - [2.37685296062328, 48.8703569444426], - [2.37685530277318, 48.8703600538579], - [2.37685852101069, 48.8703628035549], - [2.3768624920054, 48.8703650881589], - [2.37686706357948, 48.8703668201186], - [2.3769088727883, 48.8703792507686], - [2.37691388417042, 48.8703803659139], - [2.37691913019578, 48.8703808156058], - [2.37692440869984, 48.8703805825145], - [2.37692951626643, 48.8703796756228], - [2.37693425606675, 48.8703781298791], - [2.3769384454445, 48.8703760048513], - [2.37694192295486, 48.870373382431], - [2.37694455458602, 48.8703703636773], - [2.37695463676317, 48.8703556058687], - [2.37695631778303, 48.8703523166057], - [2.37695699235856, 48.870348874952], - [2.37695663463847, 48.8703454127997], - [2.37695525833142, 48.8703420628266], - [2.37695291618069, 48.8703389534114], - [2.37694969794296, 48.8703362037143], - [2.37694572694856, 48.8703339191101], - [2.37694115537524, 48.8703321871502] - ] - ] - ] - } - }, - { - "station_id": "4c20a7f1-a2ff-439e-9127-6f46b77ffb1a", - "name": [ - { - "language": "en", - "text": "2 Rue Marcel Renault 75017 Fantasmo" - } - ], - "is_virtual_station": true, - "lat": 48.8795505, - "lon": 2.293557, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.293558, 48.879537], - [2.293577, 48.879548], - [2.293556, 48.879564], - [2.293537, 48.879553], - [2.293558, 48.879537] - ] - ] - ] - }, - "capacity": 10, - "vehicle_type_area_capacity": [ - { - "vehicle_type_id": "escooter_paris", - "count": 10 - } - ] - }, - { - "station_id": "88f19d88-cef4-4390-887c-6f908000dd42", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8465782215937, - "lon": 2.3875454913537, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.38756118109326, 48.8466029187688], - [2.38758585554492, 48.8465814092777], - [2.38758860585436, 48.8465784481714], - [2.3875904272204, 48.8465751912851], - [2.38759124989824, 48.8465717633333], - [2.3875910423854, 48.846568295581], - [2.3875898126281, 48.8465649208176], - [2.38758760771691, 48.8465617682714], - [2.38758451208359, 48.8465589586616], - [2.38758064426795, 48.8465565995756], - [2.38756760790729, 48.8465500853553], - [2.38756309900618, 48.8465482616777], - [2.38755813545948, 48.8465470530617], - [2.38755290869395, 48.8465465061195], - [2.38754762028778, 48.8465466419448], - [2.38754247419643, 48.8465474552991], - [2.38753766888677, 48.8465489148144], - [2.38753338968291, 48.846550964202], - [2.38752980161889, 48.8465535244242], - [2.38750512716483, 48.846575033922], - [2.38750237685484, 48.8465779950279], - [2.38750055548801, 48.8465812519135], - [2.38749973280916, 48.8465846798642], - [2.38749994032078, 48.8465881476151], - [2.38750117007672, 48.8465915223768], - [2.38750337498645, 48.8465946749213], - [2.3875064706183, 48.8465974845294], - [2.38751033843254, 48.846599843614], - [2.38752337479559, 48.8466063578331], - [2.38752788369728, 48.84660818151], - [2.38753284724507, 48.8466093901256], - [2.38753807401203, 48.8466099370678], - [2.38754336241981, 48.8466098012431], - [2.38754850851274, 48.8466089878896], - [2.3875533138238, 48.8466075283756], - [2.38755759302869, 48.8466054789894], - [2.38756118109326, 48.8466029187688] - ] - ] - ] - } - }, - { - "station_id": "9b63c40d-b6df-4b56-a00f-db5f75dbc16f", - "name": [ - { - "language": "en", - "text": "1 RUE LUCIEN ET SACHA GUITRY 75020 Fantasmo" - } - ], - "is_virtual_station": true, - "lat": 48.848053, - "lon": 2.4041095, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.404121, 48.848063], - [2.404102, 48.848065], - [2.404098, 48.848042], - [2.404117, 48.848041], - [2.404121, 48.848063] - ] - ] - ] - }, - "capacity": 10, - "vehicle_type_area_capacity": [ - { - "vehicle_type_id": "escooter_paris", - "count": 10 - } - ] - }, - { - "station_id": "2bb57d9c-f571-4dc5-8761-e87e59a34d78", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8752228735542, - "lon": 2.37011996796517, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.37014258071795, 48.8751952478591], - [2.37008871782635, 48.8751991760238], - [2.37008355134536, 48.8751998952014], - [2.37007869730045, 48.8752012632286], - [2.37007434208235, 48.8752032275745], - [2.37007065292728, 48.8752057128101], - [2.37006777149531, 48.8752086235045], - [2.37006580843066, 48.8752118478899], - [2.37006483911318, 48.8752152621528], - [2.37006490076371, 48.8752187351887], - [2.37006759797828, 48.8752348249831], - [2.37006868949506, 48.8752382260629], - [2.37007076926142, 48.8752414216315], - [2.3700737572899, 48.8752442887878], - [2.37007753866138, 48.8752467172615], - [2.3700819679449, 48.875248613654], - [2.37008687479094, 48.8752499050303], - [2.37009207048296, 48.8752505417245], - [2.37009735519546, 48.8752504992494], - [2.3701512181035, 48.8752465710862], - [2.37015638458653, 48.8752458519088], - [2.3701612386331, 48.8752444838818], - [2.37016559385229, 48.875242519536], - [2.37016928300767, 48.8752400343004], - [2.37017216443908, 48.8752371236059], - [2.37017412750218, 48.8752338992202], - [2.37017509681716, 48.8752304849568], - [2.37017503516322, 48.8752270119203], - [2.37017233793222, 48.8752109221258], - [2.37017124641265, 48.8752075210461], - [2.37016916664457, 48.8752043254776], - [2.37016617861546, 48.8752014583212], - [2.37016239724433, 48.8751990298473], - [2.37015796796201, 48.8751971334546], - [2.37015306111782, 48.8751958420781], - [2.37014786542806, 48.8751952053839], - [2.37014258071795, 48.8751952478591] - ] - ] - ] - } - }, - { - "station_id": "e08a404c-17f8-4da4-98c9-17962c51b274", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8503771243029, - "lon": 2.31959830444308, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.31956688859565, 48.8503570468597], - [2.31955502586931, 48.8503814527667], - [2.31955391806404, 48.8503848480558], - [2.3195538370624, 48.8503883203083], - [2.31955478597059, 48.8503917363721], - [2.3195567284004, 48.8503949652498], - [2.31955958986454, 48.8503978831222], - [2.3195632606331, 48.8504003780962], - [2.31956759994141, 48.8504023544962], - [2.31957244138796, 48.8504037365321], - [2.31959579881657, 48.850408680932], - [2.31960096799947, 48.850409416461], - [2.31960625594415, 48.8504094735329], - [2.3196114590039, 48.8504088499498], - [2.31961637680102, 48.850407569727], - [2.31962081994373, 48.8504056821675], - [2.3196246173199, 48.8504032599642], - [2.31962762268683, 48.8504003963996], - [2.31962972030332, 48.8503972017539], - [2.31964158301985, 48.85037279585], - [2.31964269082354, 48.8503694005601], - [2.31964277182376, 48.8503659283066], - [2.31964182291436, 48.8503625122416], - [2.3196398804836, 48.8503592833623], - [2.31963701901877, 48.8503563654884], - [2.3196333482498, 48.8503538705128], - [2.31962900894136, 48.8503518941116], - [2.31962416749493, 48.850350512075], - [2.31960081007613, 48.8503455676739], - [2.31959564089455, 48.8503448321446], - [2.31959035295135, 48.8503447750729], - [2.31958514989309, 48.8503453986566], - [2.31958023209727, 48.8503466788805], - [2.31957578895552, 48.8503485664414], - [2.31957199157985, 48.8503509886463], - [2.31956898621285, 48.8503538522125], - [2.31956688859565, 48.8503570468597] - ] - ] - ] - } - }, - { - "station_id": "43b42ee0-6e59-4412-a8d8-713845d9cbdd", - "name": [ - { - "language": "en", - "text": "499" - } - ], - "is_virtual_station": true, - "lat": 48.837133, - "lon": 2.3837305000001, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.383712466582, 48.8370979100188], - [2.38371945365215, 48.8370953162195], - [2.38372707442765, 48.8370936677806], - [2.38373503704189, 48.8370930278352], - [2.38374303653628, 48.8370934208924], - [2.38375076653975, 48.8370948318987], - [2.3837579310024, 48.8370972068142], - [2.38376425553374, 48.8371004546824], - [2.38376949791155, 48.8371044511139], - [2.38378449791626, 48.8371184511096], - [2.38378846850895, 48.8371230595635], - [2.38379099430789, 48.8371280898833], - [2.38379197791727, 48.8371333480989], - [2.38379138140839, 48.8371386314523], - [2.38378922778231, 48.837143736216], - [2.38378560008293, 48.837148465549], - [2.38378063819491, 48.837152637087], - [2.38377453344974, 48.8371560899744], - [2.38374853344391, 48.8371680899797], - [2.38374154636624, 48.83717068378], - [2.3837339255809, 48.8371723322195], - [2.38372596295555, 48.8371729721649], - [2.38371796345006, 48.8371725791069], - [2.38371023343675, 48.8371711680992], - [2.38370306896663, 48.8371687931818], - [2.38369674443095, 48.8371655453116], - [2.38369150205226, 48.8371615488782], - [2.38367650205697, 48.8371475488739], - [2.38367253147069, 48.8371429404163], - [2.38367000568113, 48.8371379100936], - [2.38366902208294, 48.8371326518765], - [2.38366961860344, 48.8371273685232], - [2.38367177224017, 48.837122263761], - [2.38367539994794, 48.8371175344308], - [2.38368036184114, 48.8371133628965], - [2.38368646658783, 48.8371099100135], - [2.383712466582, 48.8370979100188] - ] - ] - ] - } - }, - { - "station_id": "5854076f-9d51-4851-80e9-8294aab58a79", - "name": [ - { - "language": "en", - "text": "168" - } - ], - "is_virtual_station": true, - "lat": 48.878093490061, - "lon": 2.3293310088441, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.32935127843014, 48.8780591675175], - [2.32935902224769, 48.8780602049391], - [2.32936631990717, 48.8780621996431], - [2.3293729005848, 48.8780650776039], - [2.32937852006462, 48.8780687320175], - [2.3293829698016, 48.8780730272648], - [2.32938608466097, 48.8780778039445], - [2.32938774904657, 48.878082884789], - [2.32938790119081, 48.8780880812427], - [2.32938590120463, 48.8781050812434], - [2.32938446476296, 48.8781103662946], - [2.32938146554865, 48.8781153596468], - [2.32937702232772, 48.8781198635674], - [2.32937131104783, 48.8781236997046], - [2.32936455787094, 48.8781267161504], - [2.32935703021744, 48.8781287934559], - [2.32934902617656, 48.8781298493613], - [2.32934086270217, 48.8781298420537], - [2.32931086268624, 48.8781278420527], - [2.32930290855175, 48.8781267810692], - [2.32929542768587, 48.878124710996], - [2.32928871289536, 48.8781217128571], - [2.32928302700207, 48.878117904002], - [2.3292785925559, 48.8781134335122], - [2.32927558312403, 48.8781084763661], - [2.32927411649739, 48.8781032265898], - [2.32927425008032, 48.8780978896635], - [2.32927725009398, 48.8780808896646], - [2.3292789383848, 48.8780757565652], - [2.32928210679609, 48.878070935826], - [2.3292866352702, 48.878066610114], - [2.32929235221419, 48.8780629433388], - [2.32929904100186, 48.8780600744415], - [2.32930644818213, 48.8780581121302], - [2.32931429308276, 48.8780571307606], - [2.32932227844553, 48.8780571675186], - [2.32935127843014, 48.8780591675175] - ] - ] - ] - } - }, - { - "station_id": "80ee3ba1-8ad5-403d-b221-664c8ac7013b", - "name": [ - { - "language": "en", - "text": "294" - } - ], - "is_virtual_station": true, - "lat": 48.8812710269959, - "lon": 2.37044449909975, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.37043199999353, 48.8813089796109], - [2.37042384595714, 48.8813084413587], - [2.37041601727232, 48.8813068480802], - [2.37040882630861, 48.8813042633485], - [2.37040255998992, 48.8813007902958], - [2.37039746834614, 48.8812965674992], - [2.37039375453668, 48.8812917634509], - [2.37039156674442, 48.8812865698354], - [2.37039099226309, 48.8812811938811], - [2.37039199228111, 48.8812591938815], - [2.37039305813798, 48.881253838569], - [2.37039572467026, 48.881248730177], - [2.37039988501587, 48.8812440734249], - [2.3704053724481, 48.8812400549327], - [2.37041196705722, 48.8812368357418], - [2.37041940456346, 48.8812345448616], - [2.37042738690801, 48.8812332740993], - [2.37043559419768, 48.8812330743809], - [2.37045959418482, 48.8812340743803], - [2.37046737356141, 48.8812348971007], - [2.3704747703009, 48.8812366826484], - [2.37048151156858, 48.881239365162], - [2.37048734870723, 48.8812428456949], - [2.37049206640906, 48.8812469958648], - [2.37049549065745, 48.8812516625892], - [2.37049749514579, 48.8812566737322], - [2.3704980059364, 48.8812618444535], - [2.3704970059536, 48.8812828444539], - [2.37049600344851, 48.8812879862124], - [2.37049352411063, 48.8812929069745], - [2.37048965947084, 48.8812974250771], - [2.37048455220223, 48.8813013737225], - [2.37047839085293, 48.881304607136], - [2.37047140288545, 48.8813070059474], - [2.37046384627918, 48.8813084815983], - [2.37045600000648, 48.8813089796109], - [2.37043199999353, 48.8813089796109] - ] - ] - ] - } - }, - { - "station_id": "d771f9db-c756-42a7-954b-60db23c2b75f", - "name": [ - { - "language": "en", - "text": "446-BIKE" - } - ], - "is_virtual_station": true, - "lat": 48.8779533365545, - "lon": 2.34490936038419, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.34491133259207, 48.8779268233871], - [2.34491659880532, 48.8779265191359], - [2.34492185400864, 48.8779268968559], - [2.34492689598163, 48.8779279420125], - [2.344931530709, 48.877929614388], - [2.34493557984627, 48.8779318496292], - [2.34493888758251, 48.877934561724], - [2.34494132663592, 48.8779376463107], - [2.34494280315162, 48.8779409846943], - [2.34494732615923, 48.8779568952901], - [2.34494778340139, 48.8779603544136], - [2.34494720642081, 48.8779638057859], - [2.34494561736137, 48.8779671169474], - [2.34494307720937, 48.8779701608195], - [2.34493968345299, 48.8779728205818], - [2.34493556634078, 48.8779749941558], - [2.34493088388288, 48.877976598122], - [2.34492581578673, 48.8779775709223], - [2.34490738817232, 48.8779798497219], - [2.34490212195812, 48.877980153973], - [2.34489686675384, 48.8779797762534], - [2.34489182477997, 48.8779787310976], - [2.34488719005193, 48.8779770587232], - [2.34488314091427, 48.8779748234833], - [2.34487983317801, 48.8779721113899], - [2.344877394125, 48.8779690268045], - [2.34487591761011, 48.8779656884219], - [2.34487139460793, 48.8779497778275], - [2.34487093736699, 48.8779463187036], - [2.34487151434855, 48.8779428673305], - [2.34487310340871, 48.8779395561679], - [2.34487564356114, 48.8779365122946], - [2.34487903731768, 48.877933852531], - [2.3448831544298, 48.8779316789558], - [2.34488783688741, 48.8779300749885], - [2.34489290498309, 48.8779291021876], - [2.34491133259207, 48.8779268233871] - ] - ] - ] - } - }, - { - "station_id": "42d3db60-2b17-4a61-9129-6a6c3390efb4", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8715319874527, - "lon": 2.35790892876738, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.35794711917897, 48.87157622468], - [2.35796639059518, 48.871566200604], - [2.35797021633306, 48.8715637705691], - [2.35797324203712, 48.8715608936778], - [2.35797534986851, 48.8715576819731], - [2.3579764577358, 48.8715542605379], - [2.35797652249209, 48.8715507626229], - [2.35797554161536, 48.8715473244578], - [2.35797355330678, 48.8715440799452], - [2.35797063500285, 48.8715411554455], - [2.35790841562659, 48.8714905126812], - [2.35790473561176, 48.8714880520352], - [2.35790040037133, 48.8714861071278], - [2.35789557428171, 48.8714847517027], - [2.35789044033053, 48.8714840371527], - [2.35788519317839, 48.8714839905711], - [2.35788003177807, 48.8714846137239], - [2.35787515183093, 48.8714858829836], - [2.35787073836667, 48.8714877502243], - [2.35785146695722, 48.8714977742963], - [2.35784764121525, 48.8715002043333], - [2.35784461550717, 48.8715030812278], - [2.35784250767205, 48.8715062929362], - [2.35784139980153, 48.8715097143755], - [2.35784133504267, 48.8715132122945], - [2.35784231591757, 48.8715166504634], - [2.35784430422513, 48.8715198949794], - [2.35784722252883, 48.8715228194819], - [2.35790944189833, 48.8715734622331], - [2.3579131219149, 48.8715759228769], - [2.35791745715804, 48.8715778677823], - [2.35792228325099, 48.8715792232056], - [2.35792741720576, 48.8715799377539], - [2.35793266436137, 48.8715799843343], - [2.35793782576465, 48.8715793611807], - [2.35794270571386, 48.8715780919207], - [2.35794711917897, 48.87157622468] - ] - ] - ] - } - }, - { - "station_id": "a2579865-45c9-4bc0-8121-30faad5b5d3b", - "name": [ - { - "language": "en", - "text": "8 RUE CARDAN 75017 Fantasmo" - } - ], - "is_virtual_station": true, - "lat": 48.893354, - "lon": 2.317264, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.317273, 48.893342], - [2.317284, 48.893356], - [2.317255, 48.893366], - [2.317244, 48.893351], - [2.317273, 48.893342] - ] - ] - ] - }, - "capacity": 10, - "vehicle_type_area_capacity": [ - { - "vehicle_type_id": "escooter_paris", - "count": 10 - } - ] - }, - { - "station_id": "2ae9b83a-e1ec-4022-8fb0-502110cd7b04", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8877328843548, - "lon": 2.35993787831018, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.35997959603219, 48.8877543285096], - [2.35997439553752, 48.8877076635086], - [2.35997349446675, 48.8877042396448], - [2.35997159458268, 48.8877009972267], - [2.35996876893761, 48.8876980609282], - [2.35996512618015, 48.8876955436527], - [2.35996080637764, 48.8876935421918], - [2.35995597563043, 48.8876921335037], - [2.35995081968514, 48.8876913717536], - [2.35994553679258, 48.8876912862316], - [2.35992105663171, 48.8876924728822], - [2.35991585278317, 48.8876930663565], - [2.35991092490347, 48.8876943157941], - [2.35990646226241, 48.8876961732065], - [2.35990263626093, 48.8876985672544], - [2.35989959384793, 48.887701405987], - [2.35989745187628, 48.8877045803745], - [2.35989629261474, 48.887707968495], - [2.35989616058818, 48.8877114402177], - [2.35990136106103, 48.8877581052174], - [2.35990226213053, 48.8877615290785], - [2.35990416201387, 48.8877647714937], - [2.35990698765877, 48.8877677077894], - [2.35991063041655, 48.8877702250622], - [2.3599149502198, 48.8877722265208], - [2.35991978096806, 48.8877736352072], - [2.35992493691457, 48.8877743969562], - [2.3599302198084, 48.8877744824779], - [2.35995469999109, 48.8877732958271], - [2.35995990384036, 48.8877727023533], - [2.3599648317206, 48.8877714529172], - [2.35996929436193, 48.8877695955068], - [2.35997312036337, 48.8877672014616], - [2.35997616277596, 48.8877643627318], - [2.3599783047468, 48.8877611883473], - [2.35997946400716, 48.8877578002297], - [2.35997959603219, 48.8877543285096] - ] - ] - ] - } - }, - { - "station_id": "00db7813-543a-421a-9907-2792b103a933", - "name": [ - { - "language": "en", - "text": "2 ROUES" - } - ], - "is_virtual_station": true, - "lat": 48.8336519978336, - "lon": 2.3186653493312, - "station_area": { - "type": "MultiPolygon", - "coordinates": [ - [ - [ - [2.31863178354372, 48.8337086611241], - [2.31875294290669, 48.8336327823058], - [2.31875638934432, 48.833630155149], - [2.31875899259865, 48.8336271365125], - [2.31876065299786, 48.8336238419721], - [2.31876130696962, 48.8336203976669], - [2.31876092947503, 48.8336169354705], - [2.3187595349674, 48.8336135879413], - [2.31875717683877, 48.8336104832475], - [2.31875394537573, 48.8336077402598], - [2.31873706967282, 48.8335959963547], - [2.31873307257921, 48.833593712616], - [2.31872847448312, 48.8335919871594], - [2.31872345274113, 48.833590886539], - [2.31871820105056, 48.8335904532077], - [2.31871292197826, 48.8335907038797], - [2.31870781914723, 48.8335916288862], - [2.31870308938256, 48.8335931925482], - [2.31869891511948, 48.8335953345522], - [2.31857775575925, 48.8336712133932], - [2.31857430932332, 48.833673840545], - [2.31857170606906, 48.8336768591753], - [2.31857004566811, 48.8336801537088], - [2.31856939169277, 48.8336835980067], - [2.31856976918202, 48.8336870601958], - [2.3185711636828, 48.8336904077183], - [2.3185735218034, 48.8336935124066], - [2.31857675325771, 48.8336962553904], - [2.31859362895789, 48.833707999306], - [2.31859762605098, 48.8337102830458], - [2.31860222414898, 48.8337120085038], - [2.31860724589487, 48.833713109126], - [2.31861249759074, 48.8337135424595], - [2.31861777666908, 48.8337132917897], - [2.3186228795062, 48.8337123667855], - [2.31862760927637, 48.8337108031259], - [2.31863178354372, 48.8337086611241] - ] - ] - ] - } - } - ] - } - } \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/station_information.json b/testFixtures/v3.0/station_information_physical_station_limited_hours_of_operation.json similarity index 96% rename from testFixtures/v3.1-RC2/station_information.json rename to testFixtures/v3.0/station_information_physical_station_limited_hours_of_operation.json index 2b956991..a410648d 100644 --- a/testFixtures/v3.1-RC2/station_information.json +++ b/testFixtures/v3.0/station_information_physical_station_limited_hours_of_operation.json @@ -1,7 +1,7 @@ { "last_updated": "2023-07-17T13:34:13+02:00", "ttl": 0, - "version": "3.1-RC2", + "version": "3.0", "data": { "stations": [ { diff --git a/testFixtures/v3.0/station_information_virtual_station.json b/testFixtures/v3.0/station_information_virtual_station.json new file mode 100644 index 00000000..040ee866 --- /dev/null +++ b/testFixtures/v3.0/station_information_virtual_station.json @@ -0,0 +1,64 @@ +{ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 0, + "version": "3.0", + "data": { + "stations": [ + { + "station_id": "station12", + "name": [ + { + "text": "SE Belmont & SE 10th", + "language": "en" + } + ], + "lat": 45.516445, + "lon": -122.655775, + "is_valet_station": false, + "is_virtual_station": true, + "is_charging_station": false, + "station_area": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + -122.655775, + 45.516445 + ], + [ + -122.655705, + 45.516445 + ], + [ + -122.655705, + 45.516495 + ], + [ + -122.655775, + 45.516495 + ], + [ + -122.655775, + 45.516445 + ] + ] + ] + ] + }, + "capacity": 16, + "vehicle_types_capacity": [ + { + "vehicle_type_ids": ["abc123", "def456"], + "count": 15 + }, + { + "vehicle_type_ids": ["def456"], + "count": 1 + } + + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.0/station_status.json b/testFixtures/v3.0/station_status.json index aad7bb81..e8074b7f 100644 --- a/testFixtures/v3.0/station_status.json +++ b/testFixtures/v3.0/station_status.json @@ -1,27 +1,71 @@ { - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 60, - "version": "3.0", - "data": { - "stations": [ - { - "station_id": "6efbec5a-6b8c-455b-bed2-8d66be6d6a4b", - "is_installed": true, - "is_renting": true, - "is_returning": true, - "last_reported": "2019-07-04T13:33:03.969Z", - "vehicle_types_available": [ - { - "vehicle_type_id": "ebicycle_paris", - "count": 0 - }, - { - "vehicle_type_id": "escooter_paris", - "count": 0 - } - ], - "num_vehicles_available": 0 - } - ] - } - } \ No newline at end of file + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 0, + "version": "3.0", + "data": { + "stations": [ + { + "station_id": "station1", + "is_installed": true, + "is_renting": true, + "is_returning": true, + "last_reported": "2023-07-17T13:34:13+02:00", + "num_docks_available": 3, + "num_docks_disabled" : 1, + "vehicle_docks_available": [ + { + "vehicle_type_ids": [ "abc123", "def456" ], + "count": 2 + }, + { + "vehicle_type_ids": [ "def456" ], + "count": 1 + } + ], + "num_vehicles_available": 1, + "num_vehicles_disabled": 2, + "vehicle_types_available": [ + { + "vehicle_type_id": "abc123", + "count": 1 + }, + { + "vehicle_type_id": "def456", + "count": 0 + } + ] + }, + { + "station_id": "station2", + "is_installed": true, + "is_renting": true, + "is_returning": true, + "last_reported": "2023-07-17T13:34:13+02:00", + "num_docks_available": 8, + "num_docks_disabled" : 1, + "vehicle_docks_available": [ + { + "vehicle_type_ids": [ "abc123" ], + "count": 6 + }, + { + "vehicle_type_ids": [ "def456" ], + "count": 2 + } + ], + "num_vehicles_available": 6, + "num_vehicles_disabled": 1, + "vehicle_types_available": [ + { + "vehicle_type_id": "abc123", + "count": 2 + }, + { + "vehicle_type_id": "def456", + "count": 4 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.0/system_alerts.json b/testFixtures/v3.0/system_alerts.json index 3e506946..768b0acf 100644 --- a/testFixtures/v3.0/system_alerts.json +++ b/testFixtures/v3.0/system_alerts.json @@ -1,19 +1,43 @@ { - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 3600, - "version": "3.0", - "data": { - "alerts": [ - { - "alert_id": "1", - "summary": [ - { - "language": "en", - "text": "High Wind Warning" - } - ], - "type": "station_closure" - } - ] - } -} + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 60, + "version": "3.0", + "data": { + "alerts": [ + { + "alert_id": "21", + "type": "station_closure", + "station_ids": [ + "123", + "456", + "789" + ], + "times": [ + { + "start": "2023-07-17T13:34:13+02:00", + "end": "2023-07-18T13:34:13+02:00" + } + ], + "url": [ + { + "text": "https://example.com/more-info", + "language": "en" + } + ], + "summary": [ + { + "text": "Disruption of Service", + "language": "en" + } + ], + "description": [ + { + "text": "The three stations on Broadway will be out of service from 12:00am Nov 3 to 3:00pm Nov 6th to accommodate road work", + "language": "en" + } + ], + "last_updated": "2023-07-17T13:34:13+02:00" + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.0/system_information.json b/testFixtures/v3.0/system_information.json index 173b0527..703e3c58 100644 --- a/testFixtures/v3.0/system_information.json +++ b/testFixtures/v3.0/system_information.json @@ -1,28 +1,68 @@ { - "data": { - "feed_contact_email": "emailaddress@email.app", - "languages": [ - "en" - ], - "manifest_url": "https://api.berlin.example.app/gbfs/v3/manifest.json", - "name": [ - { - "language": "en", - "text": "Check Technologies" - } - ], - "opening_hours": "Mo,Tu,We,Th,Fr,Sa,Su 00:00-23:59", - "system_id": "example_london", - "terms_last_updated": "2012-04-23", - "terms_url": [ - { - "language": "en", - "text": "https://berlin.example.app" - } - ], - "timezone": "Europe/Amsterdam" + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 1800, + "version": "3.0", + "data": { + "system_id": "example_cityname", + "languages": ["en"], + "name": [ + { + "text": "Example Bike Rental", + "language": "en" + } + ], + "short_name": [ + { + "text": "Example Bike", + "language": "en" + } + ], + "operator": [ + { + "text": "Example Sharing, Inc", + "language": "en" + } + ], + "opening_hours": "Apr 1-Nov 3 00:00-24:00", + "start_date": "2010-06-10", + "url": "https://www.example.com", + "purchase_url": "https://www.example.com", + "phone_number": "+18005551234", + "email": "customerservice@example.com", + "feed_contact_email": "datafeed@example.com", + "timezone": "America/Chicago", + "license_url": "https://www.example.com/data-license.html", + "terms_url": [ + { + "text": "https://www.example.com/en/terms", + "language": "en" + } + ], + "terms_last_updated": "2021-06-21", + "privacy_url": [ + { + "text": "https://www.example.com/en/privacy-policy", + "language": "en" + } + ], + "privacy_last_updated": "2019-01-13", + "rental_apps": { + "android": { + "discovery_uri": "com.example.android://", + "store_uri": "https://play.google.com/store/apps/details?id=com.example.android" + }, + "ios": { + "store_uri": "https://apps.apple.com/app/apple-store/id123456789", + "discovery_uri": "com.example.ios://" + } }, - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 3600, - "version": "3.0" + "brand_assets": { + "brand_last_modified": "2021-06-15", + "brand_image_url": "https://www.example.com/assets/brand_image.svg", + "brand_image_url_dark": "https://www.example.com/assets/brand_image_dark.svg", + "color": "#C2D32C", + "brand_terms_url": "https://www.example.com/assets/brand.pdf" + } + + } } \ No newline at end of file diff --git a/testFixtures/v3.0/system_pricing_plans.json b/testFixtures/v3.0/system_pricing_plans.json deleted file mode 100644 index 8493c819..00000000 --- a/testFixtures/v3.0/system_pricing_plans.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 60, - "version": "3.0", - "data": { - "plans": [ - { - "plan_id": "87c7ed6e-aecf-4900-9a85-2a78efbba65b", - "name": [ - { - "text": "bike-standard-pricing-paris", - "language": "en" - } - ], - "currency": "EUR", - "price": 1, - "is_taxable": false, - "description": [ - { - "text": "Standard pricing for bikes, 1.00 EUR to unlock, 0.28 EUR per minute to rent", - "language": "en" - } - ], - "per_min_pricing": [ - { - "start": 0, - "rate": 0.28, - "interval": 1 - } - ] - }, - { - "plan_id": "e1df7c5c-3232-422f-bf38-94cabb55fb99", - "name": [ - { - "text": "scooter-standard-pricing-paris", - "language": "en" - } - ], - "currency": "EUR", - "price": 1.2, - "is_taxable": false, - "description": [ - { - "text": "Standard pricing for scooters, 1.20 EUR to unlock, 0.28 EUR per minute to rent", - "language": "en" - } - ], - "per_min_pricing": [ - { - "start": 0, - "rate": 0.28, - "interval": 1 - } - ] - } - ] - } -} \ No newline at end of file diff --git a/testFixtures/v3.0/system_pricing_plans_a.json b/testFixtures/v3.0/system_pricing_plans_a.json new file mode 100644 index 00000000..fe338e2a --- /dev/null +++ b/testFixtures/v3.0/system_pricing_plans_a.json @@ -0,0 +1,45 @@ +{ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 0, + "version": "3.0", + "data": { + "plans": [ + { + "plan_id": "plan2", + "name": [ + { + "text": "One-Way", + "language": "en" + } + ], + "currency": "USD", + "price": 2.00, + "is_taxable": false, + "description": [ + { + "text": "Includes 10km, overage fees apply after 10km.", + "language": "en" + } + ], + "per_km_pricing": [ + { + "start": 10, + "rate": 1.00, + "interval": 1, + "end": 25 + }, + { + "start": 25, + "rate": 0.50, + "interval": 1 + }, + { + "start": 25, + "rate": 3.00, + "interval": 5 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.0/system_pricing_plans_b.json b/testFixtures/v3.0/system_pricing_plans_b.json new file mode 100644 index 00000000..5726c1cb --- /dev/null +++ b/testFixtures/v3.0/system_pricing_plans_b.json @@ -0,0 +1,41 @@ +{ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 0, + "version": "3.0", + "data": { + "plans": [ + { + "plan_id": "plan3", + "name": [ + { + "text": "Simple Rate", + "language": "en" + } + ], + "currency": "CAD", + "price": 3.00, + "is_taxable": true, + "description": [ + { + "text": "$3 unlock fee, $0.25 per kilometer and 0.50 per minute.", + "language": "en" + } + ], + "per_km_pricing": [ + { + "start": 0, + "rate": 0.25, + "interval": 1 + } + ], + "per_min_pricing": [ + { + "start": 0, + "rate": 0.50, + "interval": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.0/system_regions.json b/testFixtures/v3.0/system_regions.json index 5f5cb889..b27b367d 100644 --- a/testFixtures/v3.0/system_regions.json +++ b/testFixtures/v3.0/system_regions.json @@ -1,18 +1,45 @@ { - "last_updated": "2024-04-18T09:37:59.000+00:00", - "ttl": 21600, - "version": "3.0", - "data": { - "regions": [ - { - "region_id": "YVO:Region:5", - "name": [ - { - "text": "Gothenburg", - "language": "en" - } - ] - } - ] - } + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 86400, + "version": "3.0", + "data": { + "regions": [ + { + "name": [ + { + "text": "North", + "language": "en" + } + ], + "region_id": "3" + }, + { + "name": [ + { + "text": "East", + "language": "en" + } + ], + "region_id": "4" + }, + { + "name": [ + { + "text": "South", + "language": "en" + } + ], + "region_id": "5" + }, + { + "name": [ + { + "text": "West", + "language": "en" + } + ], + "region_id": "6" + } + ] + } } \ No newline at end of file diff --git a/testFixtures/v3.0/vehicle_status.json b/testFixtures/v3.0/vehicle_status.json deleted file mode 100644 index 2466ad1e..00000000 --- a/testFixtures/v3.0/vehicle_status.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 60, - "version": "3.0", - "data": { - "vehicles": [ - { - "lat": 48.84627, - "lon": 2.332335, - "is_reserved": false, - "is_disabled": false, - "vehicle_type_id": "ebicycle_paris", - "current_range_meters": 16000, - "pricing_plan_id": "87c7ed6e-aecf-4900-9a85-2a78efbba65b", - "rental_uris": { - "android": "https://berlin.example.page.link/Vbaff", - "ios": "https://berlin.example.page.link/Vbaff" - }, - "vehicle_id": "2b6488755477b6803d3e21072a3dbcff52fb8f806283fc73591c8053e6ad6125" - }, - { - "lat": 48.855835, - "lon": 2.356319, - "is_reserved": false, - "is_disabled": false, - "vehicle_type_id": "ebicycle_paris", - "current_range_meters": 12000, - "pricing_plan_id": "87c7ed6e-aecf-4900-9a85-2a78efbba65b", - "rental_uris": { - "android": "https://berlin.example.page.link/Vbaff", - "ios": "https://berlin.example.page.link/Vbaff" - }, - "vehicle_id": "654178e18313c008c3e7b662e094228ce0bc513894b5739dd15895e6c57b1336" - }, - { - "lat": 48.855303, - "lon": 2.401388, - "is_reserved": false, - "is_disabled": false, - "vehicle_type_id": "ebicycle_paris", - "current_range_meters": 19000, - "pricing_plan_id": "87c7ed6e-aecf-4900-9a85-2a78efbba65b", - "rental_uris": { - "android": "https://berlin.example.page.link/Vbaff", - "ios": "https://berlin.example.page.link/Vbaff" - }, - "vehicle_id": "3b76e14b223fedaba66179669872f9167025e0e821151ef3a0a0f67460a42b13" - }, - { - "lat": 48.834514, - "lon": 2.363719, - "is_reserved": false, - "is_disabled": false, - "vehicle_type_id": "ebicycle_paris", - "current_range_meters": 37000, - "pricing_plan_id": "87c7ed6e-aecf-4900-9a85-2a78efbba65b", - "rental_uris": { - "android": "https://berlin.example.page.link/Vbaff", - "ios": "https://berlin.example.page.link/Vbaff" - }, - "vehicle_id": "12b8d6baf647e3c87b5c790aed7cd8ebd4308ac53e9a54736724c0de5b479d69" - }, - { - "lat": 48.890163, - "lon": 2.39539, - "is_reserved": false, - "is_disabled": false, - "vehicle_type_id": "ebicycle_paris", - "current_range_meters": 6000, - "pricing_plan_id": "87c7ed6e-aecf-4900-9a85-2a78efbba65b", - "rental_uris": { - "android": "https://berlin.example.page.link/Vbaff", - "ios": "https://berlin.example.page.link/Vbaff" - }, - "vehicle_id": "1b3b711140409665782be31bd1b9de1a783d85ac0465594de706348c5fdfd986" - }, - { - "lat": 48.845467, - "lon": 2.396471, - "is_reserved": false, - "is_disabled": false, - "vehicle_type_id": "ebicycle_paris", - "current_range_meters": 10000, - "pricing_plan_id": "87c7ed6e-aecf-4900-9a85-2a78efbba65b", - "rental_uris": { - "android": "https://berlin.example.page.link/Vbaff", - "ios": "https://berlin.example.page.link/Vbaff" - }, - "vehicle_id": "b0f808a0c90e120e3239c1ffaf8b58888dcdf70fae5644f07273db1d869261cd" - }, - { - "lat": 48.865226, - "lon": 2.371542, - "is_reserved": false, - "is_disabled": false, - "vehicle_type_id": "ebicycle_paris", - "current_range_meters": 12000, - "pricing_plan_id": "87c7ed6e-aecf-4900-9a85-2a78efbba65b", - "rental_uris": { - "android": "https://berlin.example.page.link/Vbaff", - "ios": "https://berlin.example.page.link/Vbaff" - }, - "vehicle_id": "299f744dfd91d63fde6ceeb1e938bae3a64d475d8311a1e439dbca4c4a692f2f" - } - ] - } - } \ No newline at end of file diff --git a/testFixtures/v3.0/vehicle_status_carsharing.json b/testFixtures/v3.0/vehicle_status_carsharing.json new file mode 100644 index 00000000..a99b060d --- /dev/null +++ b/testFixtures/v3.0/vehicle_status_carsharing.json @@ -0,0 +1,41 @@ + + { + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl":0, + "version":"3.0", + "data":{ + "vehicles":[ + { + "vehicle_id":"45bd3fb7-a2d5-4def-9de1-c645844ba962", + "last_reported": "2023-07-17T13:34:13+02:00", + "lat":12.345678, + "lon":56.789012, + "is_reserved":false, + "is_disabled":false, + "vehicle_type_id":"abc123", + "current_range_meters":400000.0, + "available_until":"2021-05-17T15:00:00Z", + "home_station_id":"station1", + "vehicle_equipment":[ + "child_seat_a", + "winter_tires" + ] + }, + { + "vehicle_id":"d4521def-7922-4e46-8e1d-8ac397239bd0", + "last_reported": "2023-07-17T13:34:13+02:00", + "is_reserved":false, + "is_disabled":false, + "vehicle_type_id":"def456", + "current_fuel_percent":0.7, + "current_range_meters":6543.0, + "station_id":"86", + "pricing_plan_id":"plan3", + "home_station_id":"146", + "vehicle_equipment":[ + "child_seat_a" + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/vehicle_status.json b/testFixtures/v3.0/vehicle_status_micromobility.json similarity index 97% rename from testFixtures/v3.1-RC2/vehicle_status.json rename to testFixtures/v3.0/vehicle_status_micromobility.json index c372b0d7..473eb98d 100644 --- a/testFixtures/v3.1-RC2/vehicle_status.json +++ b/testFixtures/v3.0/vehicle_status_micromobility.json @@ -1,7 +1,7 @@ { "last_updated": "2023-07-17T13:34:13+02:00", "ttl":0, - "version": "3.1-RC2", + "version":"3.0", "data":{ "vehicles":[ { diff --git a/testFixtures/v3.0/vehicle_types.json b/testFixtures/v3.0/vehicle_types.json index e8f93611..8774a443 100644 --- a/testFixtures/v3.0/vehicle_types.json +++ b/testFixtures/v3.0/vehicle_types.json @@ -1,22 +1,141 @@ { - "last_updated": "2019-07-04T13:33:03.969Z", - "ttl": 60, - "version": "3.0", - "data": { - "vehicle_types": [ - { - "vehicle_type_id": "ebicycle_paris", - "form_factor": "bicycle", - "propulsion_type": "electric_assist", - "max_range_meters": 90000, - "name": [ - { - "text": "Electric Bicycle", - "language": "en" - } - ], - "default_pricing_plan_id": "87c7ed6e-aecf-4900-9a85-2a78efbba65b" - } - ] - } - } \ No newline at end of file + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 0, + "version": "3.0", + "data": { + "vehicle_types": [ + { + "vehicle_type_id": "abc123", + "form_factor": "bicycle", + "propulsion_type": "human", + "name": [ + { + "text": "Example Basic Bike", + "language": "en" + } + ], + "wheel_count": 2, + "default_reserve_time": 30, + "return_constraint": "any_station", + "vehicle_assets": { + "icon_url": "https://www.example.com/assets/icon_bicycle.svg", + "icon_url_dark": "https://www.example.com/assets/icon_bicycle_dark.svg", + "icon_last_modified": "2021-06-15" + }, + "default_pricing_plan_id": "bike_plan_1", + "pricing_plan_ids": [ + "bike_plan_1", + "bike_plan_2", + "bike_plan_3" + ] + }, + { + "vehicle_type_id": "cargo123", + "form_factor": "cargo_bicycle", + "propulsion_type": "human", + "name": [ + { + "text": "Example Cargo Bike", + "language": "en" + } + ], + "description": [ + { + "text": "Extra comfortable seat with additional suspension.\n\nPlease be aware of the cargo box lock: you need to press it down before pulling it up again!", + "language": "en" + } + ], + "wheel_count": 3, + "default_reserve_time": 30, + "return_constraint": "roundtrip_station", + "vehicle_assets": { + "icon_url": "https://www.example.com/assets/icon_cargobicycle.svg", + "icon_url_dark": "https://www.example.com/assets/icon_cargobicycle_dark.svg", + "icon_last_modified": "2021-06-15" + }, + "default_pricing_plan_id": "cargo_plan_1", + "pricing_plan_ids": [ + "cargo_plan_1", + "cargo_plan_2", + "cargo_plan_3" + ] + }, + { + "vehicle_type_id": "def456", + "form_factor": "scooter_standing", + "propulsion_type": "electric", + "name": [ + { + "text": "Example E-scooter V2", + "language": "en" + } + ], + "wheel_count": 2, + "max_permitted_speed": 25, + "rated_power": 350, + "default_reserve_time": 30, + "max_range_meters": 12345, + "return_constraint": "free_floating", + "vehicle_assets": { + "icon_url": "https://www.example.com/assets/icon_escooter.svg", + "icon_url_dark": "https://www.example.com/assets/icon_escooter_dark.svg", + "icon_last_modified": "2021-06-15" + }, + "default_pricing_plan_id": "scooter_plan_1" + }, + { + "vehicle_type_id": "car1", + "form_factor": "car", + "rider_capacity": 5, + "cargo_volume_capacity": 200, + "propulsion_type": "combustion_diesel", + "eco_labels": [ + { + "country_code": "FR", + "eco_sticker": "critair_1" + }, + { + "country_code": "DE", + "eco_sticker": "euro_2" + } + ], + "name": [ + { + "text": "Four-door Sedan", + "language": "en" + } + ], + "wheel_count": 4, + "default_reserve_time": 0, + "max_range_meters": 523992, + "return_constraint": "roundtrip_station", + "vehicle_accessories": [ + "doors_4", + "automatic", + "cruise_control" + ], + "g_CO2_km": 120, + "vehicle_image": "https://www.example.com/assets/renault-clio.jpg", + "make": [ + { + "text": "Renault", + "language": "en" + } + ], + "model": [ + { + "text": "Clio", + "language": "en" + } + ], + "color": "white", + "vehicle_assets": { + "icon_url": "https://www.example.com/assets/icon_car.svg", + "icon_url_dark": "https://www.example.com/assets/icon_car_dark.svg", + "icon_last_modified": "2021-06-15" + }, + "default_pricing_plan_id": "car_plan_1" + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/gbfs.json b/testFixtures/v3.1-RC2/gbfs.json index e99c4639..354848ab 100644 --- a/testFixtures/v3.1-RC2/gbfs.json +++ b/testFixtures/v3.1-RC2/gbfs.json @@ -1,17 +1,17 @@ { - "last_updated": "2023-07-17T13:34:13+02:00", - "ttl": 0, - "version": "3.1-RC2", - "data": { - "feeds": [ - { - "name": "system_information", - "url": "https://www.example.com/gbfs/1/system_information" - }, - { - "name": "station_information", - "url": "https://www.example.com/gbfs/1/station_information" - } - ] - } - } \ No newline at end of file + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "feeds": [ + { + "name": "system_information", + "url": "https://www.example.com/gbfs/1/system_information" + }, + { + "name": "station_information", + "url": "https://www.example.com/gbfs/1/station_information" + } + ] + } +} diff --git a/testFixtures/v3.1-RC2/gbfs_versions.json b/testFixtures/v3.1-RC2/gbfs_versions.json index 0ceb61a3..ea4725a8 100644 --- a/testFixtures/v3.1-RC2/gbfs_versions.json +++ b/testFixtures/v3.1-RC2/gbfs_versions.json @@ -1,17 +1,17 @@ { - "last_updated": "2023-07-17T13:34:13+02:00", - "ttl": 0, - "version": "3.1-RC2", - "data": { - "versions": [ - { - "version": "2.0", - "url": "https://www.example.com/gbfs/2/gbfs" - }, - { - "version": "3.1-RC2", - "url": "https://www.example.com/gbfs/3.1-RC2/gbfs" - } - ] - } - } \ No newline at end of file + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "versions": [ + { + "version": "2.0", + "url": "https://www.example.com/gbfs/2/gbfs" + }, + { + "version": "3.1-RC2", + "url": "https://www.example.com/gbfs/3.1-RC/gbfs" + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/geofencing_zones.json b/testFixtures/v3.1-RC2/geofencing_zones.json index 7e57069f..1aceb1e2 100644 --- a/testFixtures/v3.1-RC2/geofencing_zones.json +++ b/testFixtures/v3.1-RC2/geofencing_zones.json @@ -1,74 +1,74 @@ { - "last_updated": "2023-07-17T13:34:13+02:00", - "ttl": 60, - "version": "3.1-RC2", - "data": { - "geofencing_zones": { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "geofencing_zones": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ - [ - -122.578067, - 45.562982 - ], - [ - -122.661838, - 45.562741 - ], - [ - -122.661151, - 45.504542 - ], - [ - -122.578926, - 45.5046625 - ], - [ - -122.578067, - 45.562982 - ] + -122.578067, + 45.562982 + ], + [ + -122.661838, + 45.562741 + ], + [ + -122.661151, + 45.504542 + ], + [ + -122.578926, + 45.5046625 + ], + [ + -122.578067, + 45.562982 ] ] ] - }, - "properties": { - "name": [ - { - "text": "NE 24th/NE Knott", - "language": "en" - } - ], - "start": "2023-07-17T13:34:13+02:00", - "end": "2024-07-18T13:34:13+02:00", - "rules": [ - { - "vehicle_type_ids": [ - "moped1", - "car1" - ], - "ride_start_allowed": true, - "ride_end_allowed": true, - "maximum_speed_kph": 10, - "station_parking": true, - "ride_through_allowed": false - } - ] - } + ] + }, + "properties": { + "name": [ + { + "text": "NE 24th/NE Knott", + "language": "en" + } + ], + "start": "2023-07-17T13:34:13+02:00", + "end": "2024-07-18T13:34:13+02:00", + "rules": [ + { + "vehicle_type_ids": [ + "moped1", + "car1" + ], + "ride_start_allowed": true, + "ride_end_allowed": true, + "maximum_speed_kph": 10, + "station_parking": true, + "ride_through_allowed": false + } + ] } - ] - }, - "global_rules": [ - { - "ride_start_allowed": false, - "ride_end_allowed": false, - "ride_through_allowed": true } ] - } - } \ No newline at end of file + }, + "global_rules": [ + { + "ride_start_allowed": false, + "ride_end_allowed": false, + "ride_through_allowed": true + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/manifest.json b/testFixtures/v3.1-RC2/manifest.json index 68b4be3d..308cb8ed 100644 --- a/testFixtures/v3.1-RC2/manifest.json +++ b/testFixtures/v3.1-RC2/manifest.json @@ -1,115 +1,115 @@ { - "last_updated": "2023-07-17T13:34:13+02:00", - "ttl":0, - "version": "3.1-RC2", - "data":{ - "datasets":[ - { - "system_id":"example_berlin", - "versions":[ - { - "version": "2.0", - "url":"https://berlin.example.com/gbfs/2/gbfs" - }, - { - "version": "3.1-RC2", - "url":"https://berlin.example.com/gbfs/3.1-RC2/gbfs" - } - ], - "area": { - "type": "MultiPolygon", - "coordinates": [ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "datasets": [ + { + "system_id": "example_berlin", + "versions": [ + { + "version": "2.0", + "url": "https://berlin.example.com/gbfs/2/gbfs" + }, + { + "version": "3.1-RC2", + "url": "https://berlin.example.com/gbfs/3.1-RC/gbfs" + } + ], + "area": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ - [ - 13.10821, - 52.58563 - ], - [ - 13.29743, - 52.67046 - ], - [ - 13.48451, - 52.6855 - ], - [ - 13.77993, - 52.43458 - ], - [ - 13.65355, - 52.33048 - ], - [ - 13.08165, - 52.38793 - ], - [ - 13.10821, - 52.58563 - ] + 13.10821, + 52.58563 + ], + [ + 13.29743, + 52.67046 + ], + [ + 13.48451, + 52.6855 + ], + [ + 13.77993, + 52.43458 + ], + [ + 13.65355, + 52.33048 + ], + [ + 13.08165, + 52.38793 + ], + [ + 13.10821, + 52.58563 ] ] ] - }, - "country_code": "DE" + ] }, - { - "system_id":"example_paris", - "versions":[ - { - "version": "2.0", - "url":"https://paris.example.com/gbfs/2/gbfs" - }, - { - "version": "3.1-RC2", - "url":"https://paris.example.com/gbfs/3.1-RC2/gbfs" - } - ], - "area": { - "type": "MultiPolygon", - "coordinates": [ + "country_code": "DE" + }, + { + "system_id": "example_paris", + "versions": [ + { + "version": "2.0", + "url": "https://paris.example.com/gbfs/2/gbfs" + }, + { + "version": "3.1-RC2", + "url": "https://paris.example.com/gbfs/3.1-RC/gbfs" + } + ], + "area": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ - [ - 2.14306, - 48.89971 - ], - [ - 2.36707, - 48.99455 - ], - [ - 2.60219, - 49.01987 - ], - [ - 2.615, - 48.69025 - ], - [ - 2.52167, - 48.6867 - ], - [ - 2.26838, - 48.73275 - ], - [ - 2.13103, - 48.80833 - ], - [ - 2.14306, - 48.89971 - ] + 2.14306, + 48.89971 + ], + [ + 2.36707, + 48.99455 + ], + [ + 2.60219, + 49.01987 + ], + [ + 2.615, + 48.69025 + ], + [ + 2.52167, + 48.6867 + ], + [ + 2.26838, + 48.73275 + ], + [ + 2.13103, + 48.80833 + ], + [ + 2.14306, + 48.89971 ] ] ] - }, - "country_code": "FR" - } - ] - } - } \ No newline at end of file + ] + }, + "country_code": "FR" + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/station_information_physical_station_limited_hours_of_operation.json b/testFixtures/v3.1-RC2/station_information_physical_station_limited_hours_of_operation.json new file mode 100644 index 00000000..8246ef7d --- /dev/null +++ b/testFixtures/v3.1-RC2/station_information_physical_station_limited_hours_of_operation.json @@ -0,0 +1,33 @@ +{ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "stations": [ + { + "station_id": "pga", + "name": [ + { + "text": "Parking garage A", + "language": "en" + } + ], + "lat": 12.345678, + "lon": 45.678901, + "station_opening_hours": "Su-Th 05:00-22:00; Fr-Sa 05:00-01:00", + "parking_type": "underground_parking", + "parking_hoop": false, + "contact_phone": "+33109874321", + "is_charging_station": true, + "vehicle_docks_capacity": [ + { + "vehicle_type_ids": [ + "abc123" + ], + "count": 7 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/station_information_virtual_station.json b/testFixtures/v3.1-RC2/station_information_virtual_station.json new file mode 100644 index 00000000..389a3f0e --- /dev/null +++ b/testFixtures/v3.1-RC2/station_information_virtual_station.json @@ -0,0 +1,69 @@ +{ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "stations": [ + { + "station_id": "station12", + "name": [ + { + "text": "SE Belmont & SE 10th", + "language": "en" + } + ], + "lat": 45.516445, + "lon": -122.655775, + "city": "Portland, OR", + "is_valet_station": false, + "is_virtual_station": true, + "is_charging_station": false, + "station_area": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + -122.655775, + 45.516445 + ], + [ + -122.655705, + 45.516445 + ], + [ + -122.655705, + 45.516495 + ], + [ + -122.655775, + 45.516495 + ], + [ + -122.655775, + 45.516445 + ] + ] + ] + ] + }, + "capacity": 16, + "vehicle_types_capacity": [ + { + "vehicle_type_ids": [ + "abc123", + "def456" + ], + "count": 15 + }, + { + "vehicle_type_ids": [ + "def456" + ], + "count": 1 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/station_status.json b/testFixtures/v3.1-RC2/station_status.json index 2f95a934..bd2a4b77 100644 --- a/testFixtures/v3.1-RC2/station_status.json +++ b/testFixtures/v3.1-RC2/station_status.json @@ -11,14 +11,19 @@ "is_returning": true, "last_reported": "2023-07-17T13:34:13+02:00", "num_docks_available": 3, - "num_docks_disabled" : 1, + "num_docks_disabled": 1, "vehicle_docks_available": [ { - "vehicle_type_ids": [ "abc123", "def456" ], + "vehicle_type_ids": [ + "abc123", + "def456" + ], "count": 2 }, { - "vehicle_type_ids": [ "def456" ], + "vehicle_type_ids": [ + "def456" + ], "count": 1 } ], @@ -42,19 +47,23 @@ "is_returning": true, "last_reported": "2023-07-17T13:34:13+02:00", "num_docks_available": 8, - "num_docks_disabled" : 1, + "num_docks_disabled": 1, "vehicle_docks_available": [ { - "vehicle_type_ids": [ "abc123" ], + "vehicle_type_ids": [ + "abc123" + ], "count": 6 }, { - "vehicle_type_ids": [ "def456" ], + "vehicle_type_ids": [ + "def456" + ], "count": 2 } ], "num_vehicles_available": 6, - "num_vehicles_disabled": 1, + "num_vehicles_disabled": 1, "vehicle_types_available": [ { "vehicle_type_id": "abc123", diff --git a/testFixtures/v3.1-RC2/system_alerts.json b/testFixtures/v3.1-RC2/system_alerts.json index 8f629cca..4d6e7818 100644 --- a/testFixtures/v3.1-RC2/system_alerts.json +++ b/testFixtures/v3.1-RC2/system_alerts.json @@ -1,43 +1,43 @@ { - "last_updated": "2023-07-17T13:34:13+02:00", - "ttl": 60, - "version": "3.1-RC2", - "data": { - "alerts": [ - { - "alert_id": "21", - "type": "station_closure", - "station_ids": [ - "123", - "456", - "789" - ], - "times": [ - { - "start": "2023-07-17T13:34:13+02:00", - "end": "2023-07-18T13:34:13+02:00" - } - ], - "url": [ - { - "text": "https://example.com/more-info", - "language": "en" - } - ], - "summary": [ - { - "text": "Disruption of Service", - "language": "en" - } - ], - "description": [ - { - "text": "The three stations on Broadway will be out of service from 12:00am Nov 3 to 3:00pm Nov 6th to accommodate road work", - "language": "en" - } - ], - "last_updated": "2023-07-17T13:34:13+02:00" - } - ] - } - } \ No newline at end of file + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 60, + "version": "3.1-RC2", + "data": { + "alerts": [ + { + "alert_id": "21", + "type": "station_closure", + "station_ids": [ + "123", + "456", + "789" + ], + "times": [ + { + "start": "2023-07-17T13:34:13+02:00", + "end": "2023-07-18T13:34:13+02:00" + } + ], + "url": [ + { + "text": "https://example.com/more-info", + "language": "en" + } + ], + "summary": [ + { + "text": "Disruption of Service", + "language": "en" + } + ], + "description": [ + { + "text": "The three stations on Broadway will be out of service from 12:00am Nov 3 to 3:00pm Nov 6th to accommodate road work", + "language": "en" + } + ], + "last_updated": "2023-07-17T13:34:13+02:00" + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/system_information.json b/testFixtures/v3.1-RC2/system_information.json index 71d1d507..72b33e94 100644 --- a/testFixtures/v3.1-RC2/system_information.json +++ b/testFixtures/v3.1-RC2/system_information.json @@ -1,68 +1,69 @@ { - "last_updated": "2023-07-17T13:34:13+02:00", - "ttl": 1800, - "version": "3.1-RC2", - "data": { - "system_id": "example_cityname", - "languages": ["en"], - "name": [ - { - "text": "Example Bike Rental", - "language": "en" - } - ], - "short_name": [ - { - "text": "Example Bike", - "language": "en" - } - ], - "operator": [ - { - "text": "Example Sharing, Inc", - "language": "en" - } - ], - "opening_hours": "Apr 1-Nov 3 00:00-24:00", - "start_date": "2010-06-10", - "url": "https://www.example.com", - "purchase_url": "https://www.example.com", - "phone_number": "+18005551234", - "email": "customerservice@example.com", - "feed_contact_email": "datafeed@example.com", - "timezone": "America/Chicago", - "license_url": "https://www.example.com/data-license.html", - "terms_url": [ - { - "text": "https://www.example.com/en/terms", - "language": "en" - } - ], - "terms_last_updated": "2021-06-21", - "privacy_url": [ - { - "text": "https://www.example.com/en/privacy-policy", - "language": "en" - } - ], - "privacy_last_updated": "2019-01-13", - "rental_apps": { - "android": { - "discovery_uri": "com.example.android://", - "store_uri": "https://play.google.com/store/apps/details?id=com.example.android" - }, - "ios": { - "store_uri": "https://apps.apple.com/app/apple-store/id123456789", - "discovery_uri": "com.example.ios://" - } + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "system_id": "example_cityname", + "languages": [ + "en" + ], + "name": [ + { + "text": "Example Bike Rental", + "language": "en" + } + ], + "short_name": [ + { + "text": "Example Bike", + "language": "en" + } + ], + "operator": [ + { + "text": "Example Sharing, Inc", + "language": "en" + } + ], + "opening_hours": "Apr 1-Nov 3 00:00-24:00", + "start_date": "2010-06-10", + "url": "https://www.example.com", + "purchase_url": "https://www.example.com", + "phone_number": "+18005551234", + "email": "customerservice@example.com", + "feed_contact_email": "datafeed@example.com", + "timezone": "America/Chicago", + "license_url": "https://www.example.com/data-license.html", + "terms_url": [ + { + "text": "https://www.example.com/en/terms", + "language": "en" + } + ], + "terms_last_updated": "2021-06-21", + "privacy_url": [ + { + "text": "https://www.example.com/en/privacy-policy", + "language": "en" + } + ], + "privacy_last_updated": "2019-01-13", + "rental_apps": { + "android": { + "discovery_uri": "com.example.android://", + "store_uri": "https://play.google.com/store/apps/details?id=com.example.android" }, - "brand_assets": { - "brand_last_modified": "2021-06-15", - "brand_image_url": "https://www.example.com/assets/brand_image.svg", - "brand_image_url_dark": "https://www.example.com/assets/brand_image_dark.svg", - "color": "#C2D32C", - "brand_terms_url": "https://www.example.com/assets/brand.pdf" - } - + "ios": { + "store_uri": "https://apps.apple.com/app/apple-store/id123456789", + "discovery_uri": "com.example.ios://" + } + }, + "brand_assets": { + "brand_last_modified": "2021-06-15", + "brand_image_url": "https://www.example.com/assets/brand_image.svg", + "brand_image_url_dark": "https://www.example.com/assets/brand_image_dark.svg", + "color": "#C2D32C", + "brand_terms_url": "https://www.example.com/assets/brand.pdf" } - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/system_pricing_plans.json b/testFixtures/v3.1-RC2/system_pricing_plans.json deleted file mode 100644 index 53f1edeb..00000000 --- a/testFixtures/v3.1-RC2/system_pricing_plans.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "last_updated": "2023-07-17T13:34:13+02:00", - "ttl": 0, - "version": "3.1-RC2", - "data": { - "plans": [ - { - "plan_id": "plan2", - "name": [ - { - "text": "One-Way", - "language": "en" - } - ], - "currency": "USD", - "price": 2.00, - "reservation_price_per_min": 0.15, - "is_taxable": false, - "description": [ - { - "text": "Includes 10km, overage fees apply after 10km.", - "language": "en" - } - ], - "per_km_pricing": [ - { - "start": 10, - "rate": 1.00, - "interval": 1, - "end": 25 - }, - { - "start": 25, - "rate": 0.50, - "interval": 1 - }, - { - "start": 25, - "rate": 3.00, - "interval": 5 - } - ] - } - ] - } - } \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/system_pricing_plans_a.json b/testFixtures/v3.1-RC2/system_pricing_plans_a.json new file mode 100644 index 00000000..6c19f635 --- /dev/null +++ b/testFixtures/v3.1-RC2/system_pricing_plans_a.json @@ -0,0 +1,46 @@ +{ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "plans": [ + { + "plan_id": "plan2", + "name": [ + { + "text": "One-Way", + "language": "en" + } + ], + "currency": "USD", + "price": 2.00, + "reservation_price_per_min": 0.15, + "is_taxable": false, + "description": [ + { + "text": "Includes 10km, overage fees apply after 10km.", + "language": "en" + } + ], + "per_km_pricing": [ + { + "start": 10, + "rate": 1.00, + "interval": 1, + "end": 25 + }, + { + "start": 25, + "rate": 0.50, + "interval": 1 + }, + { + "start": 25, + "rate": 3.00, + "interval": 5 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/system_pricing_plans_b.json b/testFixtures/v3.1-RC2/system_pricing_plans_b.json new file mode 100644 index 00000000..92179578 --- /dev/null +++ b/testFixtures/v3.1-RC2/system_pricing_plans_b.json @@ -0,0 +1,45 @@ +{ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "plans": [ + { + "plan_id": "plan3", + "name": [ + { + "text": "Simple Rate", + "language": "en" + } + ], + "currency": "CAD", + "price": 3.00, + "is_taxable": true, + "description": [ + { + "text": "$3 unlock fee, $0.25 per kilometer and 0.50 per minute, capped at $15 per 12-hour period.", + "language": "en" + } + ], + "per_km_pricing": [ + { + "start": 0, + "rate": 0.25, + "interval": 1 + } + ], + "per_min_pricing": [ + { + "start": 0, + "rate": 0.50, + "interval": 1 + } + ], + "fare_capping": { + "duration": 720, + "price": 15.00 + } + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/system_regions.json b/testFixtures/v3.1-RC2/system_regions.json index 5b02c548..636722b8 100644 --- a/testFixtures/v3.1-RC2/system_regions.json +++ b/testFixtures/v3.1-RC2/system_regions.json @@ -1,45 +1,45 @@ { - "last_updated": "2023-07-17T13:34:13+02:00", - "ttl": 86400, - "version": "3.1-RC2", - "data": { - "regions": [ - { - "name": [ - { - "text": "North", - "language": "en" - } - ], - "region_id": "3" - }, - { - "name": [ - { - "text": "East", - "language": "en" - } - ], - "region_id": "4" - }, - { - "name": [ - { - "text": "South", - "language": "en" - } - ], - "region_id": "5" - }, - { - "name": [ - { - "text": "West", - "language": "en" - } - ], - "region_id": "6" - } - ] - } - } \ No newline at end of file + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 300, + "version": "3.1-RC2", + "data": { + "regions": [ + { + "name": [ + { + "text": "North", + "language": "en" + } + ], + "region_id": "3" + }, + { + "name": [ + { + "text": "East", + "language": "en" + } + ], + "region_id": "4" + }, + { + "name": [ + { + "text": "South", + "language": "en" + } + ], + "region_id": "5" + }, + { + "name": [ + { + "text": "West", + "language": "en" + } + ], + "region_id": "6" + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/vehicle_availability.json b/testFixtures/v3.1-RC2/vehicle_availability.json index e171001a..8451167d 100644 --- a/testFixtures/v3.1-RC2/vehicle_availability.json +++ b/testFixtures/v3.1-RC2/vehicle_availability.json @@ -1,27 +1,37 @@ { - "last_updated": "2025-07-17T13:34:13+02:00", + "last_updated": "2023-07-17T13:34:13+02:00", "ttl": 0, "version": "3.1-RC2", "data": { "vehicles": [ { - "vehicle_id": "vehicle_id_1", + "vehicle_id": "45bd3fb7-a2d5-4def-9de1-c645844ba962", "vehicle_type_id": "abc123", - "station_id": "pga", - "pricing_plan_id": "plan2", + "station_id": "station1", + "pricing_plan_id": "plan3", "vehicle_equipment": [ "child_seat_a" ], "availabilities": [ { - "from": "2025-05-24T00:00:00+02:00", - "until": "2025-07-24T23:59:00+02:00" + "from": "2024-12-24T08:15:00Z", + "until": "2024-12-24T09:15:00Z" }, { - "from": "2025-10-25T00:00:00+02:00" + "from": "2024-12-25T10:30:00Z" + } + ] + }, + { + "vehicle_id": "987fd100-b822-4347-86a4-b3eef8ca8b53", + "vehicle_type_id": "def456", + "station_id": "86", + "availabilities": [ + { + "from": "2024-12-24T08:45:00Z" } ] } ] } -} +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/vehicle_status_carsharing.json b/testFixtures/v3.1-RC2/vehicle_status_carsharing.json new file mode 100644 index 00000000..df23f3c5 --- /dev/null +++ b/testFixtures/v3.1-RC2/vehicle_status_carsharing.json @@ -0,0 +1,40 @@ +{ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 0, + "version": "3.1-RC2", + "data": { + "vehicles": [ + { + "vehicle_id": "45bd3fb7-a2d5-4def-9de1-c645844ba962", + "last_reported": "2023-07-17T13:34:13+02:00", + "lat": 12.345678, + "lon": 56.789012, + "is_reserved": false, + "is_disabled": false, + "vehicle_type_id": "abc123", + "current_range_meters": 400000.0, + "available_until": "2021-05-17T15:00:00Z", + "home_station_id": "station1", + "vehicle_equipment": [ + "child_seat_a", + "winter_tires" + ] + }, + { + "vehicle_id": "d4521def-7922-4e46-8e1d-8ac397239bd0", + "last_reported": "2023-07-17T13:34:13+02:00", + "is_reserved": false, + "is_disabled": false, + "vehicle_type_id": "def456", + "current_fuel_percent": 0.7, + "current_range_meters": 6543.0, + "station_id": "86", + "pricing_plan_id": "plan3", + "home_station_id": "146", + "vehicle_equipment": [ + "child_seat_a" + ] + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/vehicle_status_micromobility.json b/testFixtures/v3.1-RC2/vehicle_status_micromobility.json new file mode 100644 index 00000000..e695d3b8 --- /dev/null +++ b/testFixtures/v3.1-RC2/vehicle_status_micromobility.json @@ -0,0 +1,32 @@ +{ + "last_updated": "2023-07-17T13:34:13+02:00", + "ttl": 0, + "version": "3.1-RC2", + "data": { + "vehicles": [ + { + "vehicle_id": "973a5c94-c288-4a2b-afa6-de8aeb6ae2e5", + "last_reported": "2023-07-17T13:34:13+02:00", + "lat": 12.345678, + "lon": 56.789012, + "is_reserved": false, + "is_disabled": false, + "vehicle_type_id": "abc123", + "rental_uris": { + "android": "https://www.example.com/app?vehicle_id=973a5c94-c288-4a2b-afa6-de8aeb6ae2e5&platform=android&", + "ios": "https://www.example.com/app?vehicle_id=973a5c94-c288-4a2b-afa6-de8aeb6ae2e5&platform=ios" + } + }, + { + "vehicle_id": "987fd100-b822-4347-86a4-b3eef8ca8b53", + "last_reported": "2023-07-17T13:34:13+02:00", + "is_reserved": false, + "is_disabled": false, + "vehicle_type_id": "def456", + "current_range_meters": 6543.0, + "station_id": "86", + "pricing_plan_id": "plan3" + } + ] + } +} \ No newline at end of file diff --git a/testFixtures/v3.1-RC2/vehicle_types.json b/testFixtures/v3.1-RC2/vehicle_types.json index 9d4c8d35..5c6e46ca 100644 --- a/testFixtures/v3.1-RC2/vehicle_types.json +++ b/testFixtures/v3.1-RC2/vehicle_types.json @@ -44,7 +44,7 @@ "text": "Extra comfortable seat with additional suspension.\n\nPlease be aware of the cargo box lock: you need to press it down before pulling it up again!", "language": "en" } - ], + ], "wheel_count": 3, "default_reserve_time": 30, "return_constraint": "roundtrip_station", diff --git a/v3.1-RC2/vehicle_availability.json b/v3.1-RC2/vehicle_availability.json index ab28b6a4..74ba4ba5 100644 --- a/v3.1-RC2/vehicle_availability.json +++ b/v3.1-RC2/vehicle_availability.json @@ -60,12 +60,12 @@ "from": { "type": "string", "description": "Start date and time of available time slot.", - "format": "date-time" + "format": "^(?:\\d{4}(?:-?\\d{2}(?:-?\\d{2})?)?)T(?:\\d{2}(?::?\\d{2}(?::?\\d{2}(?:\\.\\d+)?)?)?|\\d{2}(?::?\\d{2}(?:\\.\\d+)?)?|\\d{2}(?:\\.\\d+)?)(?:Z|[+-]\\d{2}(?::?\\d{2})?)?$" }, "until": { "type": "string", "description": "End date and time of available time slot.", - "format": "date-time" + "format": "^(?:\\d{4}(?:-?\\d{2}(?:-?\\d{2})?)?)T(?:\\d{2}(?::?\\d{2}(?::?\\d{2}(?:\\.\\d+)?)?)?|\\d{2}(?::?\\d{2}(?:\\.\\d+)?)?|\\d{2}(?:\\.\\d+)?)(?:Z|[+-]\\d{2}(?::?\\d{2})?)?$" } }, "required": ["from"], diff --git a/v3.1-RC2/vehicle_status.json b/v3.1-RC2/vehicle_status.json index 6cefa91d..7cda537a 100644 --- a/v3.1-RC2/vehicle_status.json +++ b/v3.1-RC2/vehicle_status.json @@ -121,7 +121,7 @@ "available_until": { "description": "The date and time when any rental of the vehicle must be completed. Added in v2.3.", "type": "string", - "pattern": "^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(([+-]([0-9]{2}):([0-9]{2}))|Z)$" + "pattern": "^(?:\\d{4}(?:-?\\d{2}(?:-?\\d{2})?)?)T(?:\\d{2}(?::?\\d{2}(?::?\\d{2}(?:\\.\\d+)?)?)?|\\d{2}(?::?\\d{2}(?:\\.\\d+)?)?|\\d{2}(?:\\.\\d+)?)(?:Z|[+-]\\d{2}(?::?\\d{2})?)?$" } }, "anyOf": [