自驾 / 摩旅路线规划
> 工位是租的,但远方不是借的。输入起点、目的地、天数,剩下交给它。
> 出发前全部排雷完毕 —— 别等骑到半山腰才发现:前面是鬼见愁,后面是回不了头。
>
> 零依赖、双击即开、断网也能放,比公司发布会还靠谱。分日彩线把每天的轨迹铺开,
> 高速 / 国道一路插好路牌;天气和魔鬼路段提前用红灯黄灯吓唬你;海拔剖面直接明示
> 「翻过这座山,就是下坡的快乐」。日期卡随便点,返程闭环安排得明明白白 ——
> 出去野,也得知道怎么回家,不然周一谁替你上班? 白天看景、晚上看星,明暗主题一键切换。
交付两样:① 决策结论(可行性、路线对比、费用三档、风险与装备)+ ② 零依赖离线 HTML 动态地图演示页。结论先行,演示页把结论演出来。
⚡ 产出路径(照做,别自己写 HTML)
① 问清 4 项 → AskUserQuestion 一次性问完
② 可行性判断 → 算里程/天数/海拔,不成立就给替代方案,别先写文件
③ 联网核实 → 下面 5 类,一次性并行发起,别串行
④ 写 CFG → 复制 assets/cfg.example.json 改成目标数据(唯一要写的产物)
⑤ 快速校验 → node scripts/check_route.js <cfg.json> ← 先校验数据,省一轮 build
⑥ 生成页面 → node scripts/build.js <cfg.json> -o <out.html>
⑦ 交付 → 先给结论与取舍,再 present_files
硬性提速规则:
- 不要读 assets/*.html(230KB+),也不要手写/复制 HTML。所有可变内容都在 CFG 里,build.js 自动合成。
- 不要先 build 再校验。CFG 阶段就能查出 km 不递增、day 错位、坐标填反等问题。
- 联网核实并行发起全部查询,不要一轮一轮等。
一、可行性是硬约束
用户给的天数常常装不下想走的路。物理上不成立就直说并给替代方案。
| 约束 | 口径 |
|---|---|
| 汽车单人单日 | 高速 700–850km;国道/山路 400–550km |
| 摩托车单人单日 | 新手 300–400km;熟练 400–500km |
| 高原段(4000m+) | 汽车再降 20%;摩托再降 30% |
| 目的地游玩 | 至少留 1 个整天,半天等于没有 |
黄金产出:一张表说清「临界点在哪」。宁可建议改签返程 1 天,也不排"到了就走"的行程。
三条红线(不可越过)
- 禁摩/限行不给硬闯方案 —— 违法上路时商业险可主张免责。被要求绕路就给合规替代(改走国道 + 细化通过时间/加油点)。
- 坐标系必须匹配底图:底图是高德 GCJ-02 瓦片,路点默认 WGS84,页面内置
wgs84ToGcj02自动纠正。禁止删掉转换步骤或手填"看着差不多"的坐标。 - 地图合规:涉及边境(西藏、新疆口岸、白哈巴)时只用有审图号的合规底图,不得自绘国界/省界/未定国界;台湾、藏南、南海诸岛按国家标准表示;页脚保留底图来源与"行政界线以国家标准地图为准"声明。
二、必须联网核实(禁止凭记忆写,并行发起)
存量事实查 references/verified-facts.md;时效性项每次重查(文件里标 ⏳ 的就是):
- 各省摩托能否上高速(省级收费公路条例 / 交管局通告)—— 合法性红线
- 主干公路修路/封闭通告(施工会推翻"某条线更好走"的判断)
- 景区规则:自驾能否进入、区间车、票价、预约天数、无人机禁飞、边防证
- 目标月份气候:距出发 >10 天则逐日预报无效,用近 3 年同期实测值,页面标注"同期气候值,非实时预报"
- 油价 / 房价 / 机票 / 托运报价 —— 分项列出出处,费用能对账
三、CFG 字段规范
唯一核心是 WPs,其他一切由此派生:
{day:1, name:'西安', lat:34.341, lng:108.941, alt:400, km:0,
temp:'8~21℃', wx:'cloud', wxd:'多云间晴',
stay:true, // 当晚住宿点(黑色标记)
pass:true, // 垭口/高点(红色标记 + 海拔标签)
poi:true, // 顺路景点
dest:true, // 终点(最大标记 + 红色标签)
risk:'❄结冰', // 风险角标(红底小徽章)
tip:['🛣 提示文字'] // 弹窗追加行,替代硬编码 name 判断
}
check_route.js 会拦截的问题:
km严格递增;同一day的路点必须连续DAYS[].dist累加 = 最后一个路点km(首日从 0 起)。⚠️DAY_START是页面内部派生变量,不要写进 CFGSECTIONS的fromKm/toKm连续覆盖[0, DRIVE_END]altMax留null自动算;altMarks可选(标最高/最低/终点)RISK_SEGS可为空数组,但字段不能删;kind只允许ice/windcoord:'wgs84'(GPS/Google Earth,默认)或'gcj02'(高德/腾讯拾取)。种子坐标是 WGS84,改用高德拾取值时必须同步改coord,否则双重偏移- 天气只允许
sunny / cloud / rain / snow / wind - 往返重复点必须改名(如
布尔津(返)),否则标记覆盖
车辆图标:务必按出行方式填 vehicle
CFG.vehicle: 'car' | 'moto' —— 每次都要显式填,不要省。
不填时模板会扫标题/副标题/chips 文本识别「摩托 / 摩旅 / 机车 / 🏍」,识别不到才默认 car。
⚠️ 历史坑:曾经默认 moto,导致所有自驾路线都顶着摩托车图标——改默认值 + 加文本兜底后才修好。
CFG.vehicleIcon 可直接给自定义 SVG/HTML 覆盖。check_route.js 会打印「车辆 car」,交文件前核一眼。
车头方向会自动跟随行进方向翻转(去程朝西、返程朝东),无需配置;两个 SVG 基准朝向相反
(car 车头朝左、moto 朝右),模板内部已归一化。用 8km 位移阈值平滑,所以路点坐标的小抖动
不会让车头来回翻——但如果某段路点经度填反了,车头就会朝反方向,填完坐标顺手核一下走向。
尺度自适应:长途 / 短途自动切换(不用配置)
模板按「总里程 ≥400km 或海拔落差 ≥400m」自动判定,套在短途上不再出怪样式。
long 跨省长线(默认进藏这类) |
city 同城/城际短途 |
|
|---|---|---|
| 游玩停留段 | 固定 50km | 总里程的 12% |
| 海拔剖面 Y 轴 | 0 → 500m 取整 | 按实际落差 ±40%,平原标注"无显著起伏" |
| 跟随镜头 | zoom 7 / 停留 11 | zoom 12 / 停留 14(否则看不清路网) |
| 返程航段 | 需填 CFG.fly |
直接删掉 fly 字段,页面自动省略 |
典型短途:南京→镇江当日往返(70km)——fly 不写、风险段留空、1 张日期卡,其余流程不变。CFG.mode:'long'|'city' 可强制覆盖,CFG.dwellKm 控制停留段长度。check_route.js 会打印判定结果(尺度 city(自动判定)),交文件前核对一眼。
可选微调(一般不改):mode 强制尺度 · dwellKm 停留段长度 · dwellLabel 停留段名称 ·
altMin/altMax/gridStep 剖面 Y 轴 · tileUrls 备用瓦片源(主源失败自动切换)。
四、演示页 6 要素(模板已内置,确认数据齐全即可)
- 分日彩线 + 道路等级:
type:'hw'高速实线;type:'gd'国道叠加白色虚线中线;BADGES路牌(高速蓝框/国道棕框) - 实时面板:当前道路(随位置变色)、海拔插值、气温、累计里程、前方站点距离
- 天气标注层:节点徽章 + 风险段覆盖 + 图层开关 + 逐日风险条。只用 emoji,不引图标库
- 海拔剖面:
altMarks至少标全程最高点与最低点 - 日期卡跳转:点击定位到当日路段并 fitBounds
- 返程闭环(仅长途):终点游玩 → 贝塞尔虚线航段飞回 → 终点机场 POI(把"人飞回 + 车托运"演出来)。往返自驾请显式设
fly.enabled:false;短途不填fly字段即可,页面自动省略
五、结论写法(决定用户是否买账)
至少给出:取舍表(买到什么/放弃什么)· 结构性差异对比(高速占比、4000m+ 垭口数、最高点、有效游玩天数)· ≥2 条并列替代方案 · 明确推荐 + 触发条件(如"能改签 10/8 → 走 G318;严格 7 天 → 走新疆")· 不建议省的钱/装备(供氧房、防滑链、保险)。
禁止并列后不给结论,禁止以"综合来看各有利弊"结尾。
六、交付前自检
- [ ]
node scripts/check_route.js <cfg.json>全绿,且「尺度」判定符合预期(短途应为city) - [ ]
node scripts/build.js <cfg.json> -o <out.html>成功,且产物再跑一次check_route.js全绿 - [ ] 断网打开一次:页面仍渲染(只有瓦片空白);整页白屏 = Leaflet 没内联成功
- [ ] 放大到 z≥12 抽查 1–2 个点,标记落在正确地物上
- [ ] 每个住宿点
stay:true,且当日最后一个路点就是住宿点 - [ ] 提示写进对应路点的
tip,不是页面硬编码 - [ ] 页面注明"同期气候值而非实时预报"及"出发前 3 天校准"
- [ ] 高风险路段有可执行对策(通过时间 / 装备 / 降速值)
- [ ] 法规、票价、托运收费都有信源标注
七、文件(按需读,别全读)
| 路径 | 何时读 |
|---|---|
assets/cfg.example.json |
长途时读(18KB)——西安→赛里木湖 3850km 完整 CFG,照它改最快 |
assets/cfg.example-city.json |
短途时读(4KB)——南京→镇江 70km 城际往返,city 模式范例 |
references/route-profiles.md |
需要现成线路骨架/坐标种子时读(10KB)。§三 是 WGS84 坐标种子 |
references/verified-facts.md |
需要政策/票价/气候基准时读(18KB)。按 §标题定位,别整篇读 |
scripts/check_route.js |
直接执行,不用读源码 |
scripts/build.js |
直接执行,不用读源码 |
assets/route-demo-template.html |
禁止读(页面骨架,含 /*__LEAFLET_JS__*/ /*__LEAFLET_CSS__*/ /*__CFG__*/ 三个占位符) |
assets/vendor/leaflet.min.js、leaflet.css |
build.js 自动内联,不用管 |
两份范例随时可跑成页面看效果:
node scripts/build.js assets/cfg.example.json -o /tmp/long.html
node scripts/build.js assets/cfg.example-city.json -o /tmp/city.html
派生新路线的最快路径
references/route-profiles.md找最接近的线(前段通常整段复用)- 复制坐标种子到
CFG.WPs,改后半段并重排km严格递增(保持coord:'wgs84') node scripts/check_route.js <cfg.json>修到全绿 →node scripts/build.js <cfg.json> -o <out.html>- 先给结论与取舍,再附文件