274: single-spine route shapes, west and east approach stubs

The route shapes were built by sorting road nodes by distance. Where R274 has a
central reservation OSM draws each carriageway as its own way, so the sort
alternated between them: 216 of 1,715 points in 274-route.json lay on the second
carriageway, up to 38 m sideways, in the divided sections after 福山大橋 and
through 占冠. All three shapes are now traced back along the shortest-path tree,
so they follow one spine. Point spacing sums to exactly the km span and km
strictly increases in every file. No roster coordinate came from a dropped point.

  274-route-west.json   54 pts   30.46 -  35.53  ends on the first main point
  274-route.json      1499 pts   35.53 - 108.74
  274-route-east.json   54 pts  108.56 - 113.99  overlaps main by 0.18 km

The stubs let the video bring the road in before 川端橋 and carry it on past
右左府 for 東に続く. The GeoJSON carries all three as separate lines.

Page and GeoJSON rebuilt, which also picks up the roster fixes. 274-dev.md
brought up to date: file table, current roster figures, and three new entries
under errors found and fixed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-17 09:44:33 +09:00
parent 7af0f48afe
commit 5ca0b871f8
6 changed files with 38 additions and 13 deletions
+33 -10
View File
@@ -20,14 +20,18 @@ against reality.
| File | What it is | | File | What it is |
|---|---| |---|---|
| `274-lookup.md` | The roster. 168 entries, 37.27–107.83 km, 26 kinds, 95 distinct names, 118 with readings. Source of truth. | | `274-lookup.md` | The roster. 131 entries, 37.27–107.83 km, 20 kinds, 86 distinct names, 91 with readings. Source of truth. |
| `274-lookup.csv` | The same rows, 16 columns, generated from the Markdown. | | `274-lookup.csv` | The same rows, 16 columns, generated from the Markdown. |
| `274-lookup.geojson` | The same rows as points, plus the route line and the district bands. | | `274-lookup.geojson` | The same rows as points, plus the three route lines (`route-west`, `route`, `route-east`) and the district bands. |
| `274-transect.html` | Self-contained interactive page. Opens from disk; also published as an Artifact. | | `274-transect.html` | Self-contained interactive page. Opens from disk; also published as an Artifact. |
| `274-route.json` | 1,715 route points with their kilometre. | | `274-route.json` | 1,499 route points with their kilometre, one clean spine through the range. |
| `274-route-west.json` | 54 points, km 30.46–35.53: the road arriving before 川端橋, ending on the first main point. |
| `274-route-east.json` | 54 points, km 108.56–113.99: the road carrying on past 右左府, for 東に続く. |
| `274-districts.json` | 23 大字 bands with entry and exit kilometres. | | `274-districts.json` | 23 大字 bands with entry and exit kilometres. |
| `274-transect-build.py` | Re-reads the roster and rewrites the page's data block. | | `274-transect-build.py` | Re-reads the roster and rewrites the page's data block. |
| `274-romaji.py` | Fills the Romaji column from the Kana column. | | `274-romaji.py` | Fills the Romaji column from the Kana column. |
| `274-lyrics-index.py` | Resolves every line of `274.lrc` to its roster entry with timing and coordinates. |
| `274-lyrics-index.csv` | Its output: one row per sung object, the file the music video syncs to. |
Flow is one-way: **`274-lookup.md` → everything else.** Editing a generated file is pointless; Flow is one-way: **`274-lookup.md` → everything else.** Editing a generated file is pointless;
it will be overwritten on the next build. it will be overwritten on the next build.
@@ -98,7 +102,8 @@ geometric length; aligning that ordered sequence against the registers' ordered
Needleman–Wunsch transfers the positions. 穂高トンネル lands within 9 m. Second, where a Needleman–Wunsch transfers the positions. 穂高トンネル lands within 9 m. Second, where a
bridge is named after the watercourse it crosses, the geometric crossing point gives an bridge is named after the watercourse it crosses, the geometric crossing point gives an
independent position that overrides the alignment — this fixed 草木橋, ポン久留喜橋, independent position that overrides the alignment — this fixed 草木橋, ポン久留喜橋,
オロロップ橋, モトツ橋, 福山大橋 and 新川橋. 福山大橋 and 新川橋. It misled twice: モトツ橋 and オロロップ橋 are both named for streams they
do not cross at the bridge (see below).
The alignment is reliable in the 60–97 km core, where tunnels anchor it, and unreliable at The alignment is reliable in the 60–97 km core, where tunnels anchor it, and unreliable at
both ends where small bridges cluster and OSM ways do not correspond one-to-one. 唐沢橋 both ends where small bridges cluster and OSM ways do not correspond one-to-one. 唐沢橋
@@ -143,8 +148,15 @@ View, or from knowledge not in any dataset.
the sheltered span between モトツトンネル and 福山トンネル. The identical 62 m lengths of the sheltered span between モトツトンネル and 福山トンネル. The identical 62 m lengths of
bridge and shelter are the same deck, not a coincidence. Street View and satellite, bridge and shelter are the same deck, not a coincidence. Street View and satellite,
July 2025: the two tunnels now read as continuous. July 2025: the two tunnels now read as continuous.
- **下福山橋 and オロロップ橋** — order swapped by the author to 77.05 / 77.55, matching - **オロロップ橋 and 下福山橋** — I anchored オロロップ橋 on the オロロップ沢川 crossing at
route01 against my length-alignment. 77.05 km, but the stream crossing and the bridge are 1.2 km apart. An interim swap then
put 下福山橋 on that wrong spot. The author's Google pin places オロロップ橋 at 78.31, on
the 221 m OSM bridge way that matches the register's 205.9 m; 下福山橋 is the 104 m way
at 78.03. The original length-alignment had both right, and the sung order
ペンケ → 下福山 → オロロップ → 福山 was correct throughout.
- **紅葉山橋** — flagged by the author as the only `bridge (structure)` in the roster, with
a 533 m offset. The full Reiwa 8 bridge register lists it exactly once, on **国道452号**
(100.1 m, PC, 1989), just up R452 from the 紅葉山交差点. Removed.
- **滝ノ上信号場** — demoted from passenger station in 2024. Not in any dataset consulted. - **滝ノ上信号場** — demoted from passenger station in 2024. Not in any dataset consulted.
- **登川** — the active community now falls under 楓 jurisdiction; 登川 is largely the - **登川** — the active community now falls under 楓 jurisdiction; 登川 is largely the
administrative remnant of Yubari's first settlements. This explains why 登川神社, 登川橋 administrative remnant of Yubari's first settlements. This explains why 登川神社, 登川橋
@@ -190,6 +202,15 @@ Recorded because they indicate where this kind of pipeline fails.
- **A table column mismatch** in the page: a header change applied while its matching cell - **A table column mismatch** in the page: a header change applied while its matching cell
insert silently did not, shifting every column right of Kana by one. insert silently did not, shifting every column right of Kana by one.
- **A join key type mismatch** left the 大字 column empty in a committed CSV. - **A join key type mismatch** left the 大字 column empty in a committed CSV.
- **The corridor sweep selected by distance, not by road.** Anything within 2 km of R274 was
admitted, which is how 紅葉山橋 on R452 got in. An audit of all 53 roster structures
against every route in the three registers found no other stray.
- **Route shapes zig-zagged.** They were built by sorting road nodes by distance, and where
R274 has a central reservation OSM draws each carriageway as a separate way, so the sort
alternated between them. 216 of 1,715 main points lay on the second carriageway, up to 38 m
sideways, in the divided sections after 福山大橋 and through 占冠. All three shapes are now
traced back along the shortest-path tree, which follows one spine; point spacing sums to the
km span and km strictly increases. No roster coordinate came from a dropped point.
## Limits ## Limits
@@ -206,10 +227,12 @@ Recorded because they indicate where this kind of pipeline fails.
## Regenerating ## Regenerating
```sh ```sh
python3 wip/274-romaji.py --check # dry run: report romaji differences cd wip/274
python3 wip/274-romaji.py # fill the Romaji column from Kana python3 274-romaji.py --check # dry run: report romaji differences
python3 wip/274-transect-build.py # rewrite the page's data block python3 274-romaji.py # fill the Romaji column from Kana
python3 274-transect-build.py # rewrite the page's data block
python3 274-lyrics-index.py # resolve the LRC against the roster
``` ```
Both are stdlib-only and idempotent. The CSV, the GeoJSON and the published Artifact are All are stdlib-only and idempotent. The CSV, the GeoJSON and the published Artifact are
regenerated from the same Markdown by hand. regenerated from the same Markdown by hand.
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
[[108.557,42.89528,142.49683],[108.603,42.89539,142.49736],[108.649,42.89556,142.49787],[108.695,42.89571,142.49842],[108.736,42.89578,142.4989],[108.794,42.89581,142.49962],[108.84,42.89571,142.50016],[108.946,42.89545,142.50142],[109.173,42.89489,142.5041],[109.371,42.89434,142.5064],[109.456,42.8942,142.50743],[109.52,42.89412,142.5082],[110.111,42.89351,142.51541],[110.297,42.89332,142.51768],[110.457,42.89317,142.51963],[110.482,42.89315,142.51995],[110.575,42.89305,142.52107],[110.738,42.89288,142.52306],[111.028,42.89258,142.5266],[111.056,42.89255,142.52694],[111.318,42.89229,142.53014],[111.333,42.89227,142.53031],[111.358,42.89224,142.53062],[111.359,42.89224,142.53064],[111.498,42.89212,142.53233],[111.527,42.89209,142.53269],[111.596,42.89201,142.53353],[111.671,42.89194,142.53444],[111.814,42.89181,142.53619],[111.842,42.89182,142.53653],[111.864,42.89177,142.5368],[111.958,42.89168,142.53794],[112.065,42.89155,142.53924],[112.09,42.89153,142.53954],[112.111,42.89153,142.53981],[112.138,42.89155,142.54013],[112.164,42.89159,142.54045],[112.196,42.89167,142.54083],[112.333,42.89204,142.54243],[112.688,42.89295,142.5466],[112.973,42.89375,142.54994],[113.048,42.89392,142.55082],[113.143,42.89417,142.55194],[113.202,42.89435,142.55262],[113.23,42.89444,142.55295],[113.27,42.89459,142.55338],[113.312,42.89478,142.55384],[113.395,42.8952,142.55467],[113.435,42.8954,142.55508],[113.492,42.89569,142.55566],[113.793,42.89718,142.55874],[113.829,42.89736,142.55911],[113.851,42.89747,142.55933],[113.987,42.89814,142.56073]]
+1
View File
@@ -0,0 +1 @@
[[30.456,42.94898,141.83538],[30.485,42.94902,141.83573],[31.021,42.94975,141.84224],[31.152,42.94995,141.84383],[31.305,42.95011,141.8457],[31.317,42.95013,141.84585],[31.385,42.95022,141.84667],[31.396,42.95024,141.8468],[31.405,42.95025,141.84692],[31.543,42.95043,141.84859],[31.633,42.95055,141.84968],[31.656,42.95058,141.84996],[31.663,42.95059,141.85004],[31.719,42.95067,141.85073],[31.953,42.95099,141.85357],[31.986,42.95103,141.85397],[32.022,42.95104,141.85441],[32.046,42.95104,141.8547],[32.061,42.95102,141.85489],[32.082,42.951,141.85514],[32.102,42.95095,141.85538],[32.124,42.95088,141.85564],[32.148,42.95079,141.8559],[32.17,42.95069,141.85614],[32.192,42.95059,141.85636],[32.214,42.95046,141.85658],[32.249,42.95025,141.8569],[32.278,42.95007,141.85715],[32.304,42.9499,141.85737],[32.315,42.94983,141.85746],[32.398,42.94927,141.85815],[32.462,42.94884,141.85865],[32.474,42.94875,141.85875],[32.607,42.94783,141.85978],[32.639,42.9476,141.86004],[32.72,42.94705,141.86067],[32.929,42.94561,141.86234],[32.957,42.94542,141.86256],[33.001,42.94512,141.86292],[33.138,42.94418,141.86399],[33.305,42.94303,141.8653],[33.489,42.94176,141.86678],[33.731,42.94012,141.86873],[33.99,42.93834,141.87077],[34.132,42.93738,141.87193],[34.161,42.93717,141.87214],[34.308,42.93617,141.87331],[34.584,42.93429,141.87554],[34.753,42.93312,141.87686],[35.006,42.9314,141.87888],[35.192,42.93012,141.88036],[35.335,42.92915,141.8815],[35.443,42.92841,141.88237],[35.527,42.92783,141.88304]]
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long