研学行程规划 Study Trip Planner
把一次"城市研学/亲子一日游"从零规划成可直接出行的完整方案,核心交付是一份
单文件真实地图 HTML + 结构化行程表。基于扬州一日研学实战提炼(见 references/README 的经验沉淀)。
工作流(按顺序执行)
第 1 步 · 需求澄清
确认并输出(缺省则合理假设并在交付中注明):
- 城市 / 出发地 / 出行日期与季节(影响防晒、营业时间)
- 人数与年龄段(影响票种:成人全价、6-18 岁学生半价、中高考生准考证折扣)
- 主题(课本研学 / 美食 / 历史 / 非遗…)与天数
- 是否对照课本(列出目标知识点,如语文《扬州个园》、历史大运河)
第 2 步 · 选点与坐标获取
- 按主题选 4-8 个站点(含出发地、早/午/晚餐点、2-3 个核心景区)。
- 获取 GCJ-02 坐标(高德/腾讯系):
- 优先尝试 gaode-map-pro skill(若代理可用);
- 否则 WebSearch 搜「<地点> 经纬度 腾讯地图」,腾讯地图参考数据直接给经纬度;
- 景区内部景点(如瘦西湖五亭桥)同样搜索确认,其余按地理关系推算(误差 50-150m 可接受)。 - 记录每个站点:名称、坐标、地址、开放时间、门票价(成人/学生/优惠)、停留建议时长。
第 3 步 · 真实路网路线取数
运行 scripts/fetch_routes.py(用法见其 docstring):
- 输入:起点/各站坐标 + 段定义(drive=驾车、walk=步行、boat=水上手绘线)
- 输出:routes_data.json(各段真实路网 geometry + 距离 + 耗时),走 FOSSGIS 免费路由
- 驾车:https://routing.openstreetmap.de/routed-car/...
- 步行:https://routing.openstreetmap.de/routed-foot/...
- 注意:FOSSGIS 多 waypoint 响应的 legs 不含 geometry,必须逐段单次请求。
第 4 步 · 内容撰写
产出四类内容(直接注入模板 SIDE_HTML):
1. 统计卡:总时长 / 驾车里程 / 总费用(含停车估算)。
2. 费用总览表:交通(油费+路桥+停车)/ 餐饮 / 门票(按人数×票种实算)/ 船票,合计。
3. 课本知识点讲解:每景点 1 张 <details> 折叠卡——背景 + 考点 + 原文引用。
4. 美食介绍:按时段分组的菜品卡(名称 + 一句特色)。
5. 出行注意事项:证件优惠 / 天气防晒 / 时间把控 / 停车驾驶 / 应急安全 / 备选方案等 6-10 项。
另附:站点直达导航列表数据(ROUTES_DATA 的 navs 字段)。
第 5 步 · 模板注入与单文件化
- 复制
references/map_template.html,替换占位符:
-__TITLE__/__SUBTITLE__
-__ROUTES_DATA__(第 3 步输出 + info/scenic/navs 合并)
-__SIDE_HTML__(第 4 步内容,含统计/费用/课本/美食/注意事项/图例) - 必须单文件化:从
https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.js和...leaflet.css下载,内联进 HTML(替换<link>/<script src>)。用户传到手机/微信后单个文件即可用。 - 输出文件名:
<城市><主题>研学_行程路线.html。
第 6 步 · 验证(务必)
用 agent-browser 验证(若已安装):
- agent-browser set viewport 1280 800 + 截图看桌面布局;
- agent-browser set viewport 390 844 + 截图看手机布局(顶部条、抽屉开关);
- 点一个主节点 popup,确认「高德驾车/步行导航」按钮渲染;
- 点「景区细节」按钮(若有 scenic),确认景区游线与景点标签可见。
交付物清单
- 行程表(Markdown 或写入 HTML 侧边栏):时间段/时长/地点/交通指引/文化说明/美食/费用。
- 单文件 HTML:真实地图 + 城际路线 + 景区游线 + 一键导航 + 费用 + 知识点 + 美食 + 注意事项 + 定位。
- 中间产物:routes_data.json、fetch_routes.py(可复跑)。
避坑清单(全部来自实战,务必遵守)
- OSM 瓦片在受限 webview/预览面板会加载失败(白图但 Leaflet logo 在)。中国地区一律用高德无 key 瓦片:
https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}(subdomains 1-4),且与 GCJ-02 节点坐标天然对齐。 - Leaflet 必须内联进 HTML:相对路径引用的 leaflet.js/css 在手机/微信传输后丢失 → 整个脚本崩溃(地图空、列表空)。单文件 250KB 内无压力。
- "固定元素下方弹出层"位置关系不要用固定像素:抽屉顶部用 JS
getBoundingClientRect().bottom动态对齐顶部条,监听 resize/orientationchange;否则 iPhone 刘海屏(状态栏 44-47px)会遮挡标题。 - 一键导航:
https://uri.amap.com/navigation在部分 WebView 会降级为网页。用openAmapNav()(见模板 JS):iOSiosamap://navi、Androidandroidamap://navi(style 0=驾车 2=步行,dev=0),visibilitychange 检测 App 接管,1.3s 未响应 fallback 网页。 - FOSSGIS 路由:curl 常返回空但 Python urllib 正常(必须带 User-Agent);多 waypoint legs 无 geometry,逐段请求;步行 profile 用
routed-foot主机名。 - 坐标来源:腾讯地图参考数据(WebSearch 可得)为 GCJ-02,与高德瓦片/uri.amap 兼容;不要用 WGS84(如 OSM 底图)混用。
- 门票计算:学生票按 6-18 周岁半价;中/高考生准考证可再打折(购票前问窗口);景区内画舫/游船通常无优惠(统一价)。
- 景区内游线:景点级坐标可从 WebSearch 确认核心景点,其余按锚点 + 地理关系推算;游线用紫色实线区别于城际路线;提供"景区细节"视图按钮一键缩放。
- 时长校验:真实路网距离与行程表估算常有出入(如扬州蒋家桥→个园实测 2.8km vs 表内 1.2km),以 OSRM 实测为准并在交付中标注。
- 手机端:底部抽屉必须与顶部按钮双向联动(无参 toggle + 按钮文案「行程详情⇄收起行程」);地图全屏 + 顶部条固定。
参考文件
references/map_template.html:泛化地图模板(占位符注入;不含 Leaflet,需按第 5 步内联)scripts/fetch_routes.py:通用取数脚本(坐标→真实路网 JSON)- 实战案例:扬州一日研学(丹阳麦溪·后青墩 → 冶春早茶 → 瘦西湖 → 蒋家桥 → 个园 → 东关街 → 古运河夜游)沉淀了上述全部经验