Self-drive Travel Roadbook — 自驾旅行路书
v1.0.0自驾旅游路书完整工具箱 — 路书创建/更新、照片归档、路线图生成(静态PNG + 交互HTML)、OSRM实际道路数据 翻译: 自驾旅游路书完整工具箱 — 路书创建/更新、照片归档、路线图生成(静态PNG + 交互HTML)、OSRM 实际道路数据 (无需翻译,因为原文已经是中文) 如果需要翻译成更流畅的中文,可以这样: 自驾旅游路书的完整工具箱,包括路书创建和更新、照片归档、路线图生成(支持静态PNG和交互式HTML格式)以及OSRM实际道路数据。
运行时依赖
安装命令
点击复制技能文档
🚗 自驾路书完整工具箱 集路书模板、照片管理、地图生成于一体的自驾游记录系统。
文件路径规范 路书文件: /mnt/c/Users/zhou/Desktop/目的地+自驾路书.md 照片目录: /mnt/c/Users/zhou/Desktop/目的地+自驾_全部照片/(统一存放) 地图HTML: /mnt/c/Users/zzhou/Desktop/目的地+自驾路书_地图.html 地图PNG: /mnt/c/Users/zhou/Desktop/目的地+自驾_行程图.png 路线缓存: /tmp/路书名_routes.json
📝 路书模板格式 # 🚗 目的地自驾路书
✅ 行程状态:进行中/已结束---
开启时间:YYYY年MM月DD日 HH:MM
结束时间:YYYY年MM月DD日
路线总览:出发地 → 途经地1 → 途经地2 → 目的地
📅 行程统计
| 天数 | 路线 | 里程 | 消费 | |------|------|------|------| | Day 1 (MM/DD) | 起点→终点 | XXXkm | ¥XXX | | 累计 | — | X,XXXkm | ¥XX,XXX | ---📅 Day 1 — YYYY年MM月DD日
| 起点 → 终点🛣️ 行程信息
| 项目 | 内容 | |------|------| | 起点 | 起点名称 | | 终点 | 终点名称 | | 出发时间 | HH:MM | | 到达时间 | HH:MM | | 行程耗时 | 约X小时XX分 | | 行驶里程 | XXXXX km → XXXXX km | | 当日总里程 | XXX km | | 入住宾馆 | 宾馆名称(地点) |💰 今日消费
| 类别 | 金额 | |------|------| | 住宿费 | ¥XXX | | 用餐费 | ¥XX | | 加油费 | ¥XXX | | 高速过路费 | ¥XXX | | 门票/观光费 | ¥XXX | | 其他杂费 | ¥XX | | 合计 | ¥XXX |🏔️ 景点驻留
| 景点 | 海拔 | 停留时间 | 主要风光 | |------|------|----------|----------| | 景点名称 | XXXXm | XX分钟 | 风光描述 |😊 有趣的人与事
- 描述1
- 描述2
📷 精彩瞬间
- Day1_景点名_01~03.jpg(共3张)
📷 照片处理流程 照片自动存入 ~/.hermes/image_cache/,文件名 img_xxxxxxxxxx.jpg 立即复制到统一照片目录:/mnt/c/Users/zhou/Desktop/目的地+自驾_全部照片/ 不要猜测照片内容,等用户确认是第几天+景点后再重命名 重命名格式:DayX_景点_序号.jpg(如 Day6_珠峰_01.jpg) 统一文件夹是唯一真相来源,image_cache 仅作临时缓存
🗺️ 地图生成 使用 Leaflet + OSRM 生成交互式 HTML 地图。 流程: 从路书 MD 文件读取路线数据 使用 OSRM API 获取真实道路坐标 生成 Leaflet 交互地图 HTML
# Step 1: 获取OSRM路线数据 import urllib.request, json, time def get_osrm_route(lon1, lat1, lon2, lat2): url = (f"https://router.project-osrm.org/route/v1/driving/" f"{lon1},{lat1};{lon2},{lat2}?overview=full&geometries=geojson") req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) with urllib.request.urlopen(req, timeout=20) as resp: data = json.loads(resp.read().decode()) if data.get('code') == 'Ok' and data['routes']: return data['routes'][0]['geometry']['coordinates'] return None
route_segments = [ (1, (104.07, 30.57), (101.02, 30.03), '雅江', 397), (2, (101.02, 30.03), (98.42, 30.08), '如美镇', 451), (3, (98.42, 30.08), (95.77, 30.87), '波密', 514), (4, (95.77, 30.87), (91.10, 29.65), '拉萨', 617), (5, (91.10, 29.65), (89.58, 29.28), '日喀则', 356), (6, (89.58, 29.28), (86.93, 28.53), '珠峰', 327), (7, (86.93, 28.53), (91.10, 29.65), '拉萨', 556), # Day8往返需分段 (8, (91.10, 29.65), (91.00, 31.47), '那曲', 334), ]
all_routes = [] for day, (lon1, lat1), (lon2, lat2), end_name, mileage in route_segments: coords = get_osrm_route(lon1, lat1, lon2, lat2) if coords: all_routes.append({'day': day, 'coords': [[c[1], c[0]] for c in coords], 'end': end_name, 'mileage': mileage}) time.sleep(0.6)
with open("/tmp/routes.json", 'w') as f: json.dump(all_routes, f, ensure_ascii=False)