Data Overlay

Use grid data in NetCDF format to populate the graph. Also provides custom route endpoint parameters for the data "penalty" and "threshold". This allows route planning to be based on the custom data calculated penalties. Data examples: air quality, environmental, and other data types that are tied to certain geographical locations.

Contact Info

Developed and maintained by Metatavu OY, Finland.


Katja Danilova -\ Simeon Platonov -\ Daniil Smirnov -

In case of any questions please contact any of the people above by emails. We would like to continue developing and improving this feature and would love to hear any ideas from the community.

Company email:



We have been working with OTP since version 1 mainly for producing the Air Quality affected routing for the city of Helsinki, Finland. That project required us to modify the original OTP quite a lot so we didn't propose our efforts for the community.

With the OTP2 release we decided to create a dedicated layer on top of OTP2 which not only leaves the initial structure of the OpenTripPlanner intact, but also brings some additional features for those, who actually need them. This layer's main feature is populating the graph with a grid data ( i.e air quality, temperature, humidity, pressure, wind speed and direction, and e.t.c). For this to work two files are required: the actual data file (i.e in NetCDF format) and a .json settings file which describes the contents of the data file. Please refer to the diagram for more information.

It is a sandbox feature.

Please see the configuration part for setup instructions and examples.


Enable the feature by including it to the otp-config.json:

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

Plugin configuration should explain the NetCDF data file and request parameters that use the data file.

Example of build-config.json that includes the dataOverlay plugin configuration:

// build-config.json
  "dataOverlay" :
    "fileName": "graphs/data-file.nc4",
    "latitudeVariable": "lat",
    "longitudeVariable": "lon",
    "timeVariable": "time",
    "timeFormat": "HOURS",
    "indexVariables": [
        "name": "harmfulMicroparticlesPM2_5",
        "displayName": "Harmful micro particles pm 2.5",
        "variable": "cnc_PM2_5"
        "name": "harmfulMicroparticlesPM10",
        "displayName": "Harmful micro particles pm 10",
        "variable": "cnc_PM10"
    "requestParameters": [
        "name": "PARTICULATE_MATTER_2_5",
        "variable": "harmfulMicroparticlesPM2_5",
        "formula": "(VALUE + 1 - THRESHOLD) * PENALTY"
        "name": "PARTICULATE_MATTER_10",
        "variable": "harmfulMicroparticlesPM10",
        "formula": "(VALUE + 1 - THRESHOLD) * PENALTY"


Default values for Data overlay plugin can also be included in router-config instead of being sent with each request. If any Data overlay parameters are passed in user query, all the default values from router-config are ignored.

// router-config.json
  "routingDefaults": {
    "dataOverlay" : {
      "particulate_matter_10_threshold" : 100,
      "particulate_matter_10_penalty" : 19