No description, website, or topics provided.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Understanding subway stations

In large subway networks, it is sometimes very hard to understand how the tunnels, platforms, entrances and stairs are laid out.

The user just follows the arrows and is completely disoriented.

On the street level, we can combine signs and maps, to either follow directions, or understand how the streets are laid out and find our own path.

This projects tries to give some kind of representation of the many layers of a subway station.

A demonstration runs at:

Data sources

We only use data from OpenStreetMap.

The sources come in different formats, depending on our needs.

  • Vector tiles by Mapzen,
  • GeoJSON, hand curated for our needs.

Specifics extracts

Some tags are removed in the vector tiles provided by Mapzen.

That is why we generated our own GeoJSON for some specifc stations using Imposm3 to import it in a PostGIS spatial database and extract them with ogr2ogr as GeoJSON files.

Once the data is in the PostGIS database, it could be a good moment to modify the data if needed, for instance using QGis. Obviously, do not forget to add the modifications upstream in OpenStreetMap.

Here is a cheat sheet of the used commands:

  • ./imposm3 import -mapping mapping.yaml -read idf.osm.pbf -overwritecache -write -srid 4326 -connection postgis://osm:osm@localhost/osm?prefix=NONE
  • ./imposm3 import -mapping mapping.yaml -deployproduction -connection postgis://osm:osm@localhost/osm?prefix=NONE
  • ogr2ogr -f GeoJSON subway.geojson PG:dbname=osm -sql "select *from routes JOIN route_members ON routes.osm_id = route_members.osm_id JOIN roads ON roads.osm_id = route_members.member WHERE route='subway';"
  • ogr2ogr -f GeoJSON areas.geojson PG:dbname=osm -sql "select * from transport_areas"


Mapzen’s Tangram is the main rendering tool used. It is based on Leaflet.

The map style is widely ripped off from the Refill style, itself inspired by Stamen’s Toner style.

In order to be able to tilt the camera, we used an interesting hack described on

Further work

Technical stack

Tangram was not designed to move the camera around. It might change in the future.

An alternative would be to explore tools better suited for 3D rendering in a browser like three.js, but the design of each feature will not be as easy.

One frustrating limitation is to render slopes:

  • stairs, escalators,
  • the subway switching from tunnel to aerial segment.

Better data

So far, the data in OpenStreetMap is generally not detailed enough to represent different levels. Subway stations are not as nicely organized as a shopping mall. For instance some corridors go only one meter deeper to pass below a subway tunnel.

Mapping the detailed depths from the street level would significantly simplify and improve the quality of the mapping.

For subways, setting the depth at the beginning and the end of a way would allow to represent the slopes.

Using the actual elevation would be a step even further. It would show how a subway follows or not some hill in the city.

Better styling

Making a nice and legible representation is difficult. Adding the third dimension makes it worth.