Keep 校园跑生成工具 | Garmin FIT 文件生成器
FitTool 是一款基于 Web 的校园跑路线生成工具,支持在地图上自由绘制跑步路线或生成标准跑道,自动计算运动数据(心率、步频、功率等),并导出符合 Garmin 设备标准的 FIT 文件。
- 多地图源支持:高德地图、腾讯地图、百度地图、OSM、ArcGIS、天地图等
- 自由绘制模式:在地图上点击添加轨迹点
- 形状生成模式:一键生成 400m / 300m / 200m 标准跑道,支持旋转和位置偏移
- 轨迹编辑:支持拖拽编辑、撤销,回退,平滑处理
- 路线保存:支持保存和加载常用路线
- 运动参数配置:静息心率、最大心率、平均步频,体重、功率系数、GPS 偏移
- 多圈数支持:自定义跑步圈数,支持小数圈数,自动计算总距离
- 按距离计算圈数:输入目标距离自动计算所需圈数
- 数据预览:实时预览配速曲线和心率曲线
- 批量导出:支持一次导出多份 FIT 文件
- 坐标系统转换:自动处理 GCJ-02、BD-09、WGS-84 坐标系统
- URL 路线分享:路线编码到 URL hash,支持一键分享(Polyline 算法压缩)
- GPX 导入/导出:支持 GPX 文件格式的路线导入和导出
- 路线自动闭合:一键闭合首尾点形成环线
| 版本 | 介绍 | 部署方式 | 适用场景 |
|---|---|---|---|
| JS-Express-@garmin/fitsdk | 传统服务器部署 | Node.js 服务器 | 适用于本地开发和测试环境 |
| TS-Hono | 兼容传统服务器部署,支持 Cloudflare Workers/Pages 双部署 | Workers 或 Pages | 适用于免服务器、全球加速、快速部署、无限制访问使用 |
- 前端:HTML5 + CSS3 + JavaScript (ES6+)
- 地图库:Leaflet
- 图表库:Chart.js
- 后端:Node.js + Express
- FIT 文件:@garmin/fitsdk 官方 SDK
cd JS-Express-@garmin_fitsdk
npm install
npm startJS-Express-@garmin_fitsdk/
├── public/
│ ├── index.html # 主页面
│ ├── main.js # 前端逻辑
│ ├── style.css # 样式文件
│ └── HOG_S_64.png # 图标
├── server.js # Express 服务器 + FIT 文件生成
├── package.json # 项目配置
├── run.sh # Termux 一键启动脚本
└── run.cmd # Windows 一键启动脚本
- 前端:HTML5 + CSS3 + JavaScript (ES6+)
- 后端:Cloudflare Workers/Pages + Hono
- 地图库:Leaflet
- 图表库:Chart.js
- FIT 文件:自研编码器 (src/fit.ts)
- 本地开发:Wrangler >= 4(用于 Workers/Pages 本地模拟)
cd TS-Hono
npm install
npm run dev| 模式 | 命令 | 端口 |
|---|---|---|
| Workers | npm run dev:workers |
8787 |
| Pages | npm run dev:pages |
8788 |
cd TS-Hono
npm install
npm run dev:workers # 或 npm run dev:pagesTS-Hono 支持两种 Cloudflare 部署:Workers 和 Pages。
| 部署位置 | 命令 | 配置文件 | 特点 |
|---|---|---|---|
| Workers | npm run deploy:workers |
wrangler.workers.toml |
必须 Wrangler CLI 部署 |
| Pages | npm run deploy:pages |
wrangler.toml |
支持 Dashboard 可视化部署 |
| 部署方式 | 说明 |
|---|---|
| Wrangler CLI | 命令行部署 |
| Cloudflare Dashboard | 网页可视化部署(GitHub 集成可选开启) |
npm install -g wrangler
wrangler logincd TS-Hono
npm run deploy:workers配置文件:wrangler.workers.toml(命令已指定)
cd TS-Hono
npm run deploy:pages注意:
deploy:pages命令会先构建再部署。如需仅构建,使用npm run build:pages。
配置文件:wrangler.toml(wrangler 自动使用)
编辑对应的配置文件:
[vars]
# 生产环境请设置为实际域名,不要使用 "*"
ALLOWED_ORIGINS = "https://your-domain.com"安全提示:
ALLOWED_ORIGINS = "*"仅用于开发环境。生产环境必须指定具体域名。
- 登录 Cloudflare Dashboard
- 进入 Workers & Pages → 创建应用程序
- 选择 Workers 或 Pages
| 配置项 | 值 |
|---|---|
| 构建命令 | npm run build:pages |
| 根目录 | TS-Hono |
| 输出目录 | dist-pages |
| Framework preset | None |
在 Settings → Environment variables 中添加:
| 变量名 | 值 |
|---|---|
ALLOWED_ORIGINS |
https://your-domain.com |
在 Deployments 页面点击 Connect to Git 连接仓库,之后每次 push 会自动触发部署。
Workers 版本内置请求限流(每小时 100 次/IP)。
如需调整或关闭限流,编辑 src/middleware/rate-limit.ts:
const RATE_LIMIT_WINDOW_MS = 60 * 60 * 1000; // 时间窗口(毫秒)
const RATE_LIMIT_MAX = 100; // 最大请求数,设为 0 可关闭限流检查构建产物是否正确生成,确认 dist/index.html 存在。
检查 dist-pages/functions/api/[[catchall]].js 是否存在。
配置 ALLOWED_ORIGINS 环境变量,确保包含前端域名。
TS-Hono/
├── src/
│ ├── fit.ts # FIT 文件编码器
│ ├── lib.ts # 业务逻辑和数据生成
│ ├── workers.ts # Workers 入口
│ └── middleware/
│ └── rate-limit.ts # 请求限制中间件(仅 Workers)
├── functions/
│ └── api/
│ └── [[catchall]].ts # Pages Functions 入口
├── public/
│ ├── index.html # 前端页面
│ ├── main.js # 前端逻辑
│ ├── sponsor.png # 赞赏码
│ ├── style.css # 样式
│ └── HOG_S_64.png # 图标
├── build.pages.ts # Pages 构建脚本
├── wrangler.toml # Pages 配置文件
├── wrangler.workers.toml # Workers 配置文件
├── server.ts # 本地开发服务器
├── package.json # 依赖管理
├── tsconfig.json # TypeScript 配置
├── run.sh # Termux 一键启动脚本
└── run.cmd # Windows 一键启动脚本
| 配置项 | Workers (wrangler.workers.toml) | Pages (wrangler.toml) |
|---|---|---|
main |
src/workers.ts |
- |
[assets] |
需要,静态资源托管 | - |
pages_build_output_dir |
- | dist-pages(仅构建时使用) |
[vars] |
ALLOWED_ORIGINS |
ALLOWED_ORIGINS |
注意:Workers 使用
wrangler.workers.toml,Pages 使用wrangler.toml。
| 命令 | 模式 | 说明 |
|---|---|---|
npm start / npm run dev |
Node | 启动本地 Node.js 服务器(端口 3000) |
npm run dev:workers |
Workers | Wrangler 本地开发(端口 8787) |
npm run dev:pages |
Pages | Wrangler Pages 本地开发(端口 8788) |
npm run build |
通用 | 构建 Workers 和 Pages 部署产物 |
npm run build:workers |
Workers | 仅构建 Workers 部署产物 |
npm run build:pages |
Pages | 仅构建 Pages 部署产物 |
npm run deploy:workers |
Workers | 部署到 Cloudflare Workers |
npm run deploy:pages |
Pages | 构建并部署到 Cloudflare Pages |
npm run type-check |
通用 | TypeScript 类型检查 |
npm run clean |
通用 | 清理构建产物(跨平台) |
npm run clean:win |
通用 | Windows 专用清理命令(PowerShell) |
生成运动数据预览(不生成文件)。
请求体:
{
"startTime": "2024-06-01T06:00:00Z",
"points": [{ "lat": 39.9042, "lng": 116.4074 }, { "lat": 39.905, "lng": 116.408 }],
"paceSecondsPerKm": 310,
"hrRest": 60,
"hrMax": 180,
"lapCount": 1,
"weightKg": 65,
"powerFactor": 1.3,
"gpsDrift": 0.1,
"avgCadence": 170
}响应:
{
"totalDistanceMeters": 1234.5,
"totalDurationSec": 382.7,
"samples": [...],
"calories": 82
}生成 FIT 二进制文件并下载。
请求体: 与 /api/preview 相同,额外支持 variantIndex 参数。
响应: application/vnd.ant.fit 二进制文件。
健康检查端点。
响应:
{
"status": "ok",
"timestamp": 1715074500000,
"uptime": 3600
}服务状态端点,返回当前服务状态。
响应:
{
"status": "available",
"service": "fit-tool",
"version": "<取自 package.json>"
}Workers 版本 API 接口有限流保护:
- 限制:每小时 100 次请求(按 IP 地址)
- 触发限流:返回
429状态码,包含retryAfter字段 - 响应头:
X-RateLimit-Limit: 最大请求数X-RateLimit-Remaining: 剩余请求数X-RateLimit-Reset: 重置时间戳
注意:Pages 版本无请求限流,适合公开服务。
天地图瓦片需要 API Key。用户可在前端界面"地图设置"中输入自己的 Key。
申请地址:https://console.tianditu.gov.cn/
| 项目 | 贡献者 |
|---|---|
| JS-Express-@garmin/fitsdk | HOG-StarWatch(前端重构、后端维护、新增地图源支持) |
| TS-Hono (Workers/Pages 双部署) | HOG-StarWatch(Workers/Pages 双部署支持) |
| 项目 | 来源 |
|---|---|
| JS-Express-@garmin/fitsdk 原始版本开源者 | 黑心商家瑶瑶 |
| Cloudflare Workers 免费额度 | Cloudflare |
| Hono 框架 | Hono |
本项目仅供学习交流使用,请勿用于任何作弊行为。使用本项目产生的一切后果由使用者自行承担。