Kango Mate 线路地图 · 重建材料包 ================================================ 本目录按 Open Database License (ODbL) 1.0 §4.6 提供,用来重建本站地图上的 全部几何产物。原始数据来自 OpenStreetMap contributors,许可证 ODbL 1.0: https://opendatacommons.org/licenses/odbl/1-0/ · https://www.openstreetmap.org/copyright 数据快照 -------- OSM 数据时间(osm3s.timestamp_osm_base,取各查询中最早的一个):2026-09-22T08:45:51Z 产物代号 generation:20261023-035159-718fb7 数据快照指纹 sourceManifest(sha1):aedbe3d1a285c4b8742c67961994763920d43c28 生成日期:2026-10-23 查询条数:35(每条的原文 sha1 与各自的 timestamp_osm_base 都记在 map-meta.json 的 queries 里,原文在 config/queries.json;sourceManifest 就是这份清单的指纹) 目录 ---- map-base.svg 底图(海域、内陆水、礁盘、公路、海岸线) map-meta.json 范围框、投影参数、调色板、数据快照信息 map-routes.json 每条线路的分段几何(viewBox 单位) authorizations.json 被显式授权画成示意线的段、以及被显式授权保留水上坐标的站点及其理由 inputs/tours.geometry.json 线路几何输入(slug、站点坐标、journey) inputs/map.json 城镇与换乘点 inputs/palette.json 底图颜色 config/map-config.json Overpass 查询模板、容差、吸附半径、交通网络 id(站台 / 码头坐标) config/queries.json 本次实际发出的每条查询原文 + sha1 + 各自的 timestamp_osm_base scripts/ 生成器本体(map-data.mjs)与共享模块(projection / route-fingerprint) manifest.json 上述文件的 sha256 变换说明 -------- 1. 范围框 S -17.6 / W 145.2 / N -15.95 / E 146.35。 2. 投影:等距圆柱,参考纬度 -16.8,viewBox 1000 × 1499 (公式见 scripts/lib/projection.mjs,是全站唯一实现)。 3. 海岸线按 OSM 节点 id 首尾拼链;闭合环按「陆在左、海在右」判为岛; 开链裁剪到范围框后沿框边界顺时针闭合成海域多边形;岛以 fill-rule="evenodd" 打洞。 4. 公路、水体、礁盘按 config/map-config.json 里的容差做 Douglas–Peucker 简化。 5. 线路不使用任何公共路由服务:在上述 OSM 交通网络上用 Dijkstra(边权 = 大圆距离)自建最短路。 索道、铁路、渡轮只按 config 里核对过的 way / relation id 建图。 独立复现(需要联网,一条命令) ------------------------------ 把本目录整个拷到一个空目录(不要带任何缓存),然后: node scripts/map-data.mjs rebuild 它会做这些事,结束时打印 IDENTICAL / DIFFERENT: 1. 读本目录的 map-meta.json,取出 queries 清单(每条查询的 name / sha1 / timestampOsmBase), 并与 config/queries.json 的原文逐条交叉核对。 2. 对每条查询按它自己的 timestampOsmBase 注入 [date:"…"],向 Overpass 要该时刻的历史快照 (attic query)。不同查询的时间戳本来就不同,所以必须逐条注入,不能统一用最早那个。 3. 沿用本目录 map-meta.json 里的 generation(不生成新代号),重算 sourceManifest 并断言 等于上面记录的 aedbe3d1a285c4b8742c67961994763920d43c28;对不上就直接报错停住。 4. 重新生成底图与线路,写进 rebuild-out/(不覆盖本目录的产物),再打印三组规范化几何摘要 与包内产物的比对: · map-base.svg 去掉首行 generation 注释后的 sha256 · map-routes.json 里全部 d 与端点坐标的 sha256 · 五条线路的 fingerprint 逐条对照 全部一致 = IDENTICAL,本材料包可独立复现当前产物。 为什么能复现:几何只由「查询原文 + 该查询的历史时刻 + config 里的容差 / 半径 + inputs 里的 站点坐标」决定,这四样全在包里;generation 与时间戳不再重新生成,而是从包里读。生成器不调用 任何公共路由服务,Dijkstra 与简化都是确定性的,所以同样的输入必然得到同样的输出。 Overpass 不稳时(504 / 429 / 返回 HTML):脚本已经串行、每条间隔 ≥2s、跨多个官方镜像轮换并指数 退避。attic 查询比普通查询慢很多(整轮通常 10~20 分钟),超时是正常现象,直接重跑同一条命令即可 ——响应按查询原文的 sha1 缓存在 scripts/.cache/,已经成功的查询不会重复请求。 其他子命令: node scripts/map-data.mjs base # 按当前最新 OSM 数据重做底图(会生成新 generation) node scripts/map-data.mjs routes # 线路几何 node scripts/map-data.mjs style # 只换颜色(离线) 产物怎么落盘(在生成这份材料的仓库里) -------------------------------------- 底图、meta、线路三件产物与这个公开材料包属于**同一个事务**:先全部在隔离临时目录里生成, 再整组自检(三件产物结构与同代一致;材料包必需文件齐全、manifest 记的摘要与实际内容逐个相符、 没有漏记的文件、generation 三方一致),通过之后才一次切换到落点。中途任何失败都整组回滚, 不会留下「新底图 + 旧路线」,也不会留下删了一半的材料包。所以你手上这份材料包里的 map-base.svg / map-meta.json / map-routes.json 与站点正在用的那三件一定是同一代。 署名 ---- © OpenStreetMap contributors,数据以 ODbL 1.0 提供。本目录的几何产物是该数据库的 衍生作品,同样以 ODbL 1.0 提供。