You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/skills/spot-data/SKILL.md
+32Lines changed: 32 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -138,6 +138,38 @@ Photon and Nominatim resolve a park name to _a_ place with that name, which is v
138
138
139
139
So: **a geocode is a search hint, never a pin.** Every coordinate that reaches the KML must be traceable to an OSM object you looked at - a lift endpoint, a named feature, or a trail cluster.
140
140
141
+
### The Overpass-free path - when every mirror is down
142
+
143
+
Every rung above needs Overpass. Some days it is simply not available: on 2026-08-17 a 17-box worldwide sweep returned **2 boxes in 15 minutes**, everything else 504/429/timeout, and `find_named.py` was managing about one candidate every five minutes. Do not sit and retry. Switch to this pipeline, which touches Overpass **not at all**:
144
+
145
+
**1. Web-search the park first.** This replaces rung 2 - it is what establishes the place is real, is gravity or trail-centre riding rather than XC, and is still operating. Do this _before_ geocoding, so you never spend a lookup on a park that does not qualify. It is also the step that does the most work: it killed **Meran 2000** (the resort states downhill riding is not possible), **Filthy Trails** (closed by the Flemish nature agency), **Snowbird** (no lift-served bike operation that season) and **Berkshire East** (which _is_ the already-present Thunder Mountain Bike Park). Keep the source URL - it becomes the `<i>Source:</i>` line in the description.
`jsonv2` returns **`osm_type` and `osm_id`**, so the result is a real OSM object - which is what keeps the "traceable to an OSM object" rule intact even though no Overpass query ran. Rate-limit yourself to one request per second; it is a free service with a strict policy.
155
+
156
+
**3. `api.opentopodata.org` for the altitude**, which is a separate service and stays up when Overpass does not. The `mapzen` dataset takes **90 points per request** when you pipe-join them, far more than the 25 the elevation helper uses:
#### Reading the Nominatim result, because it fails silently
163
+
164
+
The warning above still applies in full - **Nominatim returns the wrong place rather than nothing.** Two checks catch it, and both are mandatory:
165
+
166
+
-**Read `display_name`.**`Mechi Chal` resolved to a Varna suburb 300 km from Chepelare; `Woodys Bike Park, Lanivet` resolved to the **Lanivet Inn**, a pub. That one was dropped rather than pinned.
167
+
-**Read the altitude from step 3.** It is the same sanity check the lift queries get. A Scottish trail centre at 9 m or an Australian park at 22 m means the geocoder found a car park in the wrong valley.
168
+
169
+
When the query misses, retry with a **nearby named feature instead of the park name** - the village, the trailhead, the visitor centre, the access road. `Aston Hill Bike Park` missed three times and `Wendover Woods` hit; `Mystic Mountain Bike Park` missed and `Bright, Victoria` hit. A village-centre or resort-centre proxy is acceptable, but then say so: give the spot the same `<small>` caveat the gazetteer-sourced spots carry, rather than implying you pinned the trailhead.
170
+
171
+
Finally, **write each batch to its own file.** A geocode script that overwrites one output path will silently destroy the previous batch when you re-run it for the misses; a 31-row batch had to be re-fetched for exactly this reason.
172
+
141
173
#### What the pin means when there is no lift
142
174
143
175
Pin where the descent starts, and say so in the bold first line rather than implying a lift:
Copy file name to clipboardExpand all lines: README.md
+11-18Lines changed: 11 additions & 18 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,7 +11,7 @@
11
11
12
12
## Why
13
13
14
-
This project comes out of the frustration of trying to find a good mountain biking spot. You end up going through a dozen different sites, and none of them give you the whole picture: what the trails are actually like, what the lift costs, how long it takes to get there. There is no decent overall map with the information you need to plan a trip. And once you have finally settled on a spot, finding a KML or GPX to load into your GPS app is its own hunt.
14
+
This project comes out of the frustration of trying to find a good mountain biking spot. You end up going through a dozen different sites, and none of them give you the whole picture: what the trails are like, how the lift works and what it costs. And once you have finally settled on a spot, finding a KML or GPX to load into your GPS app is its own hunt.
15
15
16
16
Alpine MTB Map fixes that. The spots live in one KML you download and open in [CoMaps](https://www.comaps.app/), [Organic Maps](https://organicmaps.app/) or OsmAnd, and the website is a convenience layer on top: browse and filter the same file from the web, no app required.
17
17
@@ -20,33 +20,22 @@ For each spot you get:
20
20
- what the **trails** are like, and how many there are
21
21
- how you **get up** and what the day pass costs, plus season dates and whether the [Magic Pass](https://www.magicpass.ch) covers it
22
22
- an **Access** table: travel time from the city a rider would realistically start from
23
-
-**tags** you can filter on: difficulty, winter riding, Magic Pass, price
24
-
-**trail lines**where[OpenStreetMap](https://openstreetmap.org) has the geometry, and **extra waypoints** where they help: valley stations, mid-stations, trailheads, lift hubs
25
-
- a 16-day **[Open-Meteo](https://open-meteo.com/) weather forecast**, with wet-condition warning based on predicted rain and the previous day's precipitation
23
+
-**tags** you can filter on: difficulty, style, opening season, Magic Pass, price
24
+
-**trail lines**from[OpenStreetMap](https://openstreetmap.org), official spots website, or contributor submitted traces, and **extra waypoints** where they help: valley stations, mid-stations, trailheads, lift hubs
25
+
- a 16-day **[Open-Meteo](https://open-meteo.com/) weather forecast**, with wet-condition warning based on predicted rain, the previous day's precipitation, and known spot resilience to rain.
26
26
27
-
A good spot here means at least one singletrack where mountain biking is allowed. Many also have a way to get from the bottom to the top that is not your legs (funicular, cog railway, gondola, cable car). Purpose-built bike parks are blue, natural lift-served spots are dark green, and no-lift spots are in brown.
28
-
29
-
## Contributing
30
-
31
-
Contributions are very welcome, especially new spots and price corrections. See [CONTRIBUTING.md](CONTRIBUTING.md) to understand the map data, add a spot or trail, regenerate exports, run the project checks and cut a release.
27
+
A good spot here means at least one singletrack where mountain biking is allowed. Many also have a way to get from the bottom to the top that is not your legs (funicular, cog railway, gondola, cable car, train). Purpose-built bike parks are blue, natural lift-served spots are dark green, and no-lift spots are in brown.
32
28
33
29
## Install it on your phone
34
30
35
-
The site is a PWA: open it in your phone browser and use "Add to Home Screen" (Share menu on iOS, the three-dot menu on Android). It then launches full screen and works offline - the spot data ships inside the app bundle, and map tiles you have already looked at are cached (up to 800 of them, for 30 days). Tiles for places you have never opened will be blank until you are back online.
31
+
The site is a PWA: open it in your phone browser and use "Add to Home Screen" (Share menu on iOS, the three-dot menu on Android). It then launches full screen and works offline, the spot data ships inside the app bundle, and map tiles you have already looked at are cached (up to 800 of them, for 30 days). Tiles for places you have never opened will be blank until you are back online.
36
32
37
33
For real backcountry use, still put the KML into CoMaps, Organic Maps or OsmAnd: they hold whole-country offline maps, which a browser cache cannot match.
38
34
39
35
## Using it offline
40
36
41
37
Download [`alpine-mtb-map.kml`](alpine-mtb-map.kml) and open it on your phone. Organic Maps imports it as a new bookmark category (Bookmarks -> the import button -> pick the file). It works in OsmAnd, Google Earth and Maps.me too.
42
38
43
-
The website has KML / GPX / GeoJSON buttons in the sidebar that point at the latest GitHub release. The same stable URLs always resolve to the newest published data and can be shared directly:
The site loads map tiles from OpenStreetMap, OpenTopoMap and CyclOSM, and weather forecasts from Open-Meteo when weather is enabled. Those servers see your IP, as with any web map. Forecast requests contain the public coordinates of the map's spots, never your location. Nothing is collected by this project: no analytics, no cookies, no accounts. Your light/dark choice and a six-hour cache of public spot forecasts are stored in `localStorage`.
@@ -59,7 +48,7 @@ Three different things live in this repo, so three licences. All three are in [`
59
48
60
49
| What | Licence | Why |
61
50
| --- | --- | --- |
62
-
| Map data (`.kml`, `.gpx`, `.geojson`) | ODbL 1.0 | Contains geometry derived from OpenStreetMap |
51
+
| Map data (`.kml`) | ODbL 1.0 | Contains geometry derived from OpenStreetMap |
63
52
| Website and tooling (`src/`, `scripts/`, `index.html`, `vite.config.ts`, `.github/`) | MIT | Ordinary code, no OSM data in it |
64
53
65
54
**The data files are ODbL, not Creative Commons, and that is not a free choice.** The trail lines were extracted from OpenStreetMap relations, which makes the file a derivative database. ODbL is share-alike, so the whole database inherits it - and ODbL and CC BY-SA are not compatible in either direction, so mixing them in one file would be a licence conflict rather than a dual licence. Individual contents (the descriptions, prices, travel times) are additionally available under [DbCL 1.0](https://opendatacommons.org/licenses/dbcl/1-0/), which is the same split OpenStreetMap itself uses.
@@ -71,3 +60,7 @@ If you redistribute the KML, GPX or GeoJSON - or anything built from them - keep
71
60
Base map tiles are served by [OpenStreetMap](https://www.openstreetmap.org/copyright), [OpenTopoMap](https://opentopomap.org/) (CC BY-SA) and [CyclOSM](https://www.cyclosm.org/); they are not redistributed here.
72
61
73
62
Prices and timetables were compiled in July 2026 from the operators' own sites and are indications, not quotes. Check before you travel.
63
+
64
+
## Contributing
65
+
66
+
Contributions are very welcome, especially new spots and price corrections. See [CONTRIBUTING.md](CONTRIBUTING.md) to understand the map data, add a spot or trail, regenerate exports, run the project checks and cut a release.
0 commit comments