Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/dev-2.x' into upstream-merge-2…
Browse files Browse the repository at this point in the history
…024-01-27
  • Loading branch information
leonardehrenfried committed Jan 27, 2024
2 parents f2be944 + 5e05d21 commit bd9b8e8
Show file tree
Hide file tree
Showing 171 changed files with 3,338 additions and 2,438 deletions.
2 changes: 1 addition & 1 deletion client-next/src/components/MapView/MapView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ export function MapView({
}}
// it's unfortunate that you have to list these layers here.
// maybe there is a way around it: https://github.com/visgl/react-map-gl/discussions/2343
interactiveLayerIds={['regular-stop', 'vertex', 'edge', 'link']}
interactiveLayerIds={['regular-stop', 'area-stop', 'vertex', 'edge', 'link']}
onClick={showFeaturePropPopup}
// put lat/long in URL and pan to it on page reload
hash={true}
Expand Down
194 changes: 194 additions & 0 deletions doc-templates/sandbox/MapboxVectorTilesApi.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
# Mapbox Vector Tiles API

## Contact Info

- HSL, Finland
- Arcadis, US

## Documentation

This API produces [Mapbox vector tiles](https://docs.mapbox.com/vector-tiles/reference/), which are
used by [Digitransit-ui](https://github.com/HSLdevcom/digitransit-ui) and
[`otp-react-redux`](https://github.com/opentripplanner/otp-react-redux) to show information about
public transit entities on the map.

The tiles can be fetched from `/otp/routers/{routerId}/vectorTiles/{layers}/{z}/{x}/{y}.pbf`,
where `layers` is a comma separated list of layer names from the configuration.

Maplibre/Mapbox GL JS also requires a tilejson.json endpoint which is available at
`/otp/routers/{routerId}/vectorTiles/{layers}/tilejson.json`.

Translatable fields in the tiles are translated based on the `accept-language` header in requests.
Currently, only the language with the highest priority from the header is used.

### Configuration

To enable this you need to add the feature `otp-config.json`.

```json
// otp-config.json
{
"otpFeatures": {
"SandboxAPIMapboxVectorTilesApi": true
}
}
```

The feature must be configured in `router-config.json` as follows

```JSON
{
"vectorTiles": {
"basePath": "/only/configure/if/required",
"layers": [
{
"name": "stops",
"type": "Stop",
"mapper": "Digitransit",
"maxZoom": 20,
"minZoom": 14,
"cacheMaxSeconds": 600
},
{
"name": "stations",
"type": "Station",
"mapper": "Digitransit",
"maxZoom": 20,
"minZoom": 12,
"cacheMaxSeconds": 600
},
// all rental places: stations and free-floating vehicles
{
"name": "citybikes",
"type": "VehicleRental",
"mapper": "Digitransit",
"maxZoom": 20,
"minZoom": 14,
"cacheMaxSeconds": 60,
"expansionFactor": 0.25
},
// just free-floating vehicles
{
"name": "rentalVehicles",
"type": "VehicleRentalVehicle",
"mapper": "DigitransitRealtime",
"maxZoom": 20,
"minZoom": 14,
"cacheMaxSeconds": 60
},
// just rental stations
{
"name": "rentalStations",
"type": "VehicleRentalStation",
"mapper": "Digitransit",
"maxZoom": 20,
"minZoom": 14,
"cacheMaxSeconds": 600
},
// Contains just stations and real-time information for them
{
"name": "realtimeRentalStations",
"type": "VehicleRentalStation",
"mapper": "DigitransitRealtime",
"maxZoom": 20,
"minZoom": 14,
"cacheMaxSeconds": 60
},
// This exists for backwards compatibility. At some point, we might want
// to add a new real-time parking mapper with better translation support
// and less unnecessary fields.
{
"name": "stadtnaviVehicleParking",
"type": "VehicleParking",
"mapper": "Stadtnavi",
"maxZoom": 20,
"minZoom": 14,
"cacheMaxSeconds": 60,
"expansionFactor": 0.25
},
// no real-time, translatable fields are translated based on accept-language header
// and contains less fields than the Stadtnavi mapper
{
"name": "vehicleParking",
"type": "VehicleParking",
"mapper": "Digitransit",
"maxZoom": 20,
"minZoom": 14,
"cacheMaxSeconds": 600,
"expansionFactor": 0.25
},
{
"name": "vehicleParkingGroups",
"type": "VehicleParkingGroup",
"mapper": "Digitransit",
"maxZoom": 17,
"minZoom": 14,
"cacheMaxSeconds": 600,
"expansionFactor": 0.25
}
]
}
}
```

For each layer, the configuration includes:

- `name` which is used in the url to fetch tiles, and as the layer name in the vector tiles.
- `type` which tells the type of the layer. Currently supported:
- `Stop`
- `Station`
- `VehicleRental`: all rental places: stations and free-floating vehicles
- `VehicleRentalVehicle`: free-floating rental vehicles
- `VehicleRentalStation`: rental stations
- `VehicleParking`
- `VehicleParkingGroup`

<!-- INSERT: parameters -->

### Extending

If more generic layers are created for this API, the code should be moved out from the sandbox, into
the core, perhaps potentially leaving specific property mappers in place.

#### Creating a new layer

In order to create a new type of layer, you need to create a new class extending `LayerBuilder<T>`.
You need to implement two methods, `List<Geometry> getGeometries(Envelope query)`, which returns a
list of geometries, with an object of type `T` as their userData in the geometry,
and `double getExpansionFactor()`, which describes how much information outside the tile bounds
should be included. This layer then needs to be added into `VectorTilesResource.layers`, with a
new `LayerType` enum as the key, and the class constructor as the value.

A new mapper needs to be added every time a new layer is added. See below for information.

#### Creating a new mapper

The mapping contains information of what data to include in the vector tiles. The mappers are
defined per layer.

In order to create a new mapper for a layer, you need to create a new class
extending `PropertyMapper<T>`. In that class, you need to implement the
method `Collection<KeyValue<String, Object>> map(T input)`. The type T is dependent on the layer for which
you implement the mapper for. It needs to return a list of attributes, as key-value pairs which will
be written into the vector tile.

The mapper needs to be added to the `mappers` map in the layer, with a new `MapperType` enum as the
key, and a function to create the mapper, with a `Graph` object as a parameter, as the value.

## Changelog

- 2020-07-09: Initial version of Mapbox vector tiles API
- 2021-05-12: Make expansion factor configurable
- 2021-09-07: Rename `BikeRental` to `VehicleRental`
- 2021-10-13: Correctly serialize the vehicle rental name [#3648](https://github.com/opentripplanner/OpenTripPlanner/pull/3648)
- 2022-01-03: Add support for VehicleParking entities
- 2022-04-27: Read the headsign for frequency-only patterns correctly [#4122](https://github.com/opentripplanner/OpenTripPlanner/pull/4122)
- 2022-08-23: Remove patterns and add route gtfsTypes to stop layer [#4404](https://github.com/opentripplanner/OpenTripPlanner/pull/4404)
- 2022-10-11: Added layer for VehicleParkingGroups [#4510](https://github.com/opentripplanner/OpenTripPlanner/pull/4510)
- 2022-10-14: Add separate layers for vehicle rental place types [#4516](https://github.com/opentripplanner/OpenTripPlanner/pull/4516)
- 2022-10-19 [#4529](https://github.com/opentripplanner/OpenTripPlanner/pull/4529):
* Translatable fields are now translated based on accept-language header
* Added DigitransitRealtime for vehicle rental stations
* Changed old vehicle parking mapper to be Stadtnavi
* Added a new Digitransit vehicle parking mapper with no real-time information and less fields
- 2024-01-22: Make `basePath` configurable [#5627](https://github.com/opentripplanner/OpenTripPlanner/pull/5627)
4 changes: 4 additions & 0 deletions docs/Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@ based on merged pull requests. Search GitHub issues and pull requests for smalle
- Add new path for GTFS GraphQL API, remove batch feature [#5581](https://github.com/opentripplanner/OpenTripPlanner/pull/5581)
- Restructure walk/bicycle/car preferences in router-config.json [#5582](https://github.com/opentripplanner/OpenTripPlanner/pull/5582)
- Revert REST API spelling change of real-time [#5629](https://github.com/opentripplanner/OpenTripPlanner/pull/5629)
- Remove `FareComponent` [#5613](https://github.com/opentripplanner/OpenTripPlanner/pull/5613)
- Add AreaStop layer to new debug frontend [#5636](https://github.com/opentripplanner/OpenTripPlanner/pull/5636)
- Allow configuration of vector tiles base path [#5627](https://github.com/opentripplanner/OpenTripPlanner/pull/5627)
- Change Transmodel API path to `/otp/transmodel/v3` [#5637](https://github.com/opentripplanner/OpenTripPlanner/pull/5637)
[](AUTOMATIC_CHANGELOG_PLACEHOLDER_DO_NOT_REMOVE)

## 2.4.0 (2023-09-13)
Expand Down
109 changes: 56 additions & 53 deletions docs/RouterConfiguration.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ A full list of them can be found in the [RouteRequest](RouteRequest.md).
|    [hideFeedId](#transmodelApi_hideFeedId) | `boolean` | Hide the FeedId in all API output, and add it to input. | *Optional* | `false` | na |
|    [tracingHeaderTags](#transmodelApi_tracingHeaderTags) | `string[]` | Used to group requests when monitoring OTP. | *Optional* | | na |
| [updaters](UpdaterConfig.md) | `object[]` | Configuration for the updaters that import various types of data into OTP. | *Optional* | | 1.5 |
| [vectorTileLayers](sandbox/MapboxVectorTilesApi.md) | `object[]` | Configuration of the individual layers for the Mapbox vector tiles. | *Optional* | | 2.0 |
| [vectorTiles](sandbox/MapboxVectorTilesApi.md) | `object` | Vector tile configuration | *Optional* | | na |
| [vehicleRentalServiceDirectory](sandbox/VehicleRentalServiceDirectory.md) | `object` | Configuration for the vehicle rental service directory. | *Optional* | | 2.0 |

<!-- PARAMETERS-TABLE END -->
Expand Down Expand Up @@ -625,58 +625,61 @@ Used to group requests when monitoring OTP.
"transmodelApi" : {
"hideFeedId" : true
},
"vectorTileLayers" : [
{
"name" : "stops",
"type" : "Stop",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 600
},
{
"name" : "stations",
"type" : "Station",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 12,
"cacheMaxSeconds" : 600
},
{
"name" : "rentalPlaces",
"type" : "VehicleRental",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 60,
"expansionFactor" : 0.25
},
{
"name" : "rentalVehicle",
"type" : "VehicleRentalVehicle",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 60
},
{
"name" : "rentalStation",
"type" : "VehicleRentalStation",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 600
},
{
"name" : "vehicleParking",
"type" : "VehicleParking",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 60,
"expansionFactor" : 0.25
}
],
"vectorTiles" : {
"basePath" : "/otp_ct/vectorTiles",
"layers" : [
{
"name" : "stops",
"type" : "Stop",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 600
},
{
"name" : "stations",
"type" : "Station",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 12,
"cacheMaxSeconds" : 600
},
{
"name" : "rentalPlaces",
"type" : "VehicleRental",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 60,
"expansionFactor" : 0.25
},
{
"name" : "rentalVehicle",
"type" : "VehicleRentalVehicle",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 60
},
{
"name" : "rentalStation",
"type" : "VehicleRentalStation",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 600
},
{
"name" : "vehicleParking",
"type" : "VehicleParking",
"mapper" : "Digitransit",
"maxZoom" : 20,
"minZoom" : 14,
"cacheMaxSeconds" : 60,
"expansionFactor" : 0.25
}
]
},
"timetableUpdates" : {
"purgeExpiredData" : false,
"maxSnapshotFrequency" : "2s"
Expand Down
8 changes: 5 additions & 3 deletions docs/apis/TransmodelApi.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ Transmodel (NeTEx) with some limitations/simplification. It provides both a rout
Entur provides a [GraphQL explorer](https://api.entur.io/graphql-explorer) where you may browse the GraphQL schema and try your own
queries.

When running OTP locally the endpoint is available at: `http://localhost:8080/otp/routers/default/transmodel/index/graphql`
When running OTP locally the endpoint is available at: `http://localhost:8080/otp/transmodel/v3`

### Configuration
**Note!** Versions `v1` and `v2` do not exist in the main OTP git repository, but in
the [Entur fork](https://github.com/entur/OpenTripPlanner) from which this code originates from.

To turn this API off, add the feature `TransmodelGraphQlApi : false` in _otp-config.json_.
### Configuration

To turn this API off, add the feature `TransmodelGraphQlApi : false` in `otp-config.json`.

## Changelog - old

Expand Down
2 changes: 1 addition & 1 deletion docs/examples/ibi/portland/build-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"transitFeeds": [
{
"type": "gtfs",
"feedId": "trimet",
"feedId": "TriMet",
"source": "https://developer.trimet.org/schedule/gtfs.zip"
}
]
Expand Down
Loading

0 comments on commit bd9b8e8

Please sign in to comment.