Fix hiking trails extraction: add-locations-to-ways was missing
Verified live on brick against real cached extracts: a plain Geofabrik PBF's ways only carry bare node references, not coordinates, so locations_on_ways on the final `cat -f opl` had nothing to embed — every way came out as e.g. n123xy, empty x/y, and every relation got dropped for having no usable geometry (0 routes for Macedonia). osmium add-locations-to-ways between the tags-filter and cat steps resolves those references first. Re-verified after the fix: 45 routes for Macedonia, 3009 for Slovakia, with real colour/ref/operator/ distance (326 red, 782 yellow, 510 blue, 902 green KST-style routes).
This commit is contained in:
1 parent
714795d52b
commit
b35ace9734
1 file changed
+17
-6
@@ -7,18 +7,26 @@ module Maptool
|
||||
# Prototype: extracts route=hiking relations (name/colour/network/operator,
|
||||
# full member-way geometry) straight out of a Geofabrik .osm.pbf — the same
|
||||
# file PmtilesBuilder already downloads per country for offline.pmtiles, so
|
||||
# this needs no separate download or third-party service. Two osmium
|
||||
# this needs no separate download or third-party service. Three osmium
|
||||
# subprocess steps do the heavy lifting (osmium is already a server
|
||||
# dependency, see PmtilesBuilder/docs/development.adoc):
|
||||
#
|
||||
# 1. `osmium tags-filter FILE r/route=hiking -o hiking.osm.pbf` — pulls
|
||||
# out just the hiking relations *and* (by default, no -R) every way/
|
||||
# node they reference, so the output is small and self-contained.
|
||||
# 2. `osmium cat hiking.osm.pbf -f opl,locations_on_ways=true,add_metadata=false`
|
||||
# 2. `osmium add-locations-to-ways` — a plain Geofabrik PBF's ways only
|
||||
# carry bare node *references* (ids), not coordinates; this resolves
|
||||
# each way's node ids against the node objects in the same file and
|
||||
# rewrites the way with real coordinates attached. Verified against a
|
||||
# real extract (Macedonia) that skipping this step silently produces
|
||||
# ways with empty x/y (`n123xy`, no numbers) in the OPL output below —
|
||||
# not an error, just wrong output, so easy to miss without checking.
|
||||
# 3. `osmium cat hiking.osm.pbf -f opl,locations_on_ways=true,add_metadata=false`
|
||||
# — OPL is a plain-text, one-object-per-line format (see
|
||||
# https://osmcode.org/opl-file-format/); locations_on_ways embeds each
|
||||
# way's node coordinates directly in its own line, so no separate
|
||||
# node-id -> [lon,lat] table needs building, just two passes over text.
|
||||
# https://osmcode.org/opl-file-format/); locations_on_ways (now that
|
||||
# step 2 actually populated them) embeds each way's node coordinates
|
||||
# directly in its own line, so no separate node-id -> [lon,lat] table
|
||||
# needs building, just two passes over text.
|
||||
#
|
||||
# No general OSM tool stitches a route relation's member ways into one
|
||||
# line for you (routes are a semantic grouping, not a geometry type) —
|
||||
@@ -45,8 +53,11 @@ module Maptool
|
||||
filtered = File.join(dir, "hiking.osm.pbf")
|
||||
run!(osmium_bin, "tags-filter", pbf_path, "r/route=hiking", "-o", filtered)
|
||||
|
||||
located = File.join(dir, "hiking-located.osm.pbf")
|
||||
run!(osmium_bin, "add-locations-to-ways", filtered, "-o", located)
|
||||
|
||||
opl_path = File.join(dir, "hiking.opl")
|
||||
run!(osmium_bin, "cat", filtered, "-f", "opl,locations_on_ways=true,add_metadata=false", "-o", opl_path)
|
||||
run!(osmium_bin, "cat", located, "-f", "opl,locations_on_ways=true,add_metadata=false", "-o", opl_path)
|
||||
|
||||
parse_opl(File.read(opl_path))
|
||||
end
|
||||
|
||||
Reference in new issue
Block a user