No description
Find a file
Edward Betts ceea5706b3 Fix mobile panel visibility with floating button and iOS CSS fixes
Replace the unreliable peek-strip approach with a floating '☰ Controls'
button on the map. The button is always clearly visible, hides when the
panel is open, and reappears when the panel closes.

Also fix two iOS Safari issues that were hiding the sidebar entirely:
- overflow:hidden on body clips position:fixed elements in mobile Safari;
  reset to overflow:visible in the mobile media query
- Add viewport-fit=cover and env(safe-area-inset-bottom) padding so the
  sidebar clears the home indicator / browser toolbar
- Use 100dvh instead of 100vh to avoid iOS address-bar overflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 10:22:53 +00:00
homepage Add homepage for openstreetmap.tools 2026-02-27 19:37:06 +00:00
src/osm_geojson Set page title server-side for link preview compatibility 2026-02-27 21:01:25 +00:00
tests Add web frontend and refactor core to use OsmError 2026-02-27 18:59:21 +00:00
web Fix mobile panel visibility with floating button and iOS CSS fixes 2026-02-28 10:22:53 +00:00
.gitignore Add web frontend and refactor core to use OsmError 2026-02-27 18:59:21 +00:00
AGENTS.md Add web optional dependency and update docs 2026-02-27 20:05:14 +00:00
pyproject.toml Add web optional dependency and update docs 2026-02-27 20:05:14 +00:00
README.md Add web optional dependency and update docs 2026-02-27 20:05:14 +00:00

openstreetmap-tools

A collection of tools for working with OpenStreetMap public transport data.

Tools

osm-pt-geojson

Fetch an OSM public transport route relation and list its stops, or export the route as GeoJSON.

CLI usage

osm-pt-geojson list-stations <relation_id>
osm-pt-geojson route-between <relation_id> <from_station> <to_station> [-o FILE]
osm-pt-geojson full-route <relation_id> [-o FILE]

List stops on a route:

$ osm-pt-geojson list-stations 18892969
Route: Bus A1: Bristol Airport → Bristol Bus Station
Stops (21):
   1. Airport Terminal
   2. Airport Tavern
   ...
  21. Bus Station

Export a segment between two stops as GeoJSON:

$ osm-pt-geojson route-between 18892969 "Airport Terminal" "East Street" -o segment.geojson

Export the full route as GeoJSON:

$ osm-pt-geojson full-route 18892969 -o route.geojson

Omit stop points from GeoJSON output:

$ osm-pt-geojson full-route 18892969 --no-stops -o route.geojson

GeoJSON is written to stdout if -o is not given.

Output format

A GeoJSON FeatureCollection containing:

  • A LineString feature for the route geometry, with name, ref, from, to, and route properties from the OSM relation tags.
  • A Point feature for each stop, with a name property (omitted with --no-stops).

Installation

pip install osm-geojson

Or from source:

git clone https://git.4angle.com/edward/openstreetmap-tools
cd openstreetmap-tools
pip install -e .

Web frontend

An interactive map interface for browsing and downloading public transport routes as GeoJSON.

Features

  • Enter a relation ID or OSM URL to load a route onto the map.
  • Click stops in the sidebar list or on the map to set start and end points.
  • Preview the selected segment highlighted on the map.
  • Toggle stop points in/out of the GeoJSON before downloading.
  • Download a segment or the full route as a .geojson file.
  • Entering a route_master ID shows all directions on the map with links to each individual route.
  • Bookmarkable URLs: /<relation_id> loads that route directly.

Running the dev server

pip install -e ".[web]"
flask --app web/app.py run

Open http://127.0.0.1:5000.

API

The web frontend exposes a JSON API. Full documentation is available at /docs when the server is running.

Endpoint Description
GET /api/route/<id> Full route GeoJSON, stop list, and sibling routes
GET /api/segment/<id>?from=NAME&to=NAME Segment between two named stops
GET /api/route_master/<id> All member routes of a route_master

Licence

MIT License. Copyright (c) 2026 Edward Betts.