Files
2026-11-05 01:04:53 +08:00

85 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据格式
## 最小地铁图
```json
{
"mode": "metro",
"title": "研究方法地图",
"subtitle": "示意分类,不表示时间或推荐排名",
"routes": [
{"id":"qual","label":"定性","code":"A","color":"#208a87","stops":["interview","synthesis"]},
{"id":"quant","label":"定量","code":"B","color":"#3d64a3","stops":["survey","synthesis"]}
],
"nodes": [
{"id":"interview","label":"访谈"},
{"id":"survey","label":"问卷"},
{"id":"synthesis","label":"综合证据","major":true}
]
}
```
## 顶层字段
| 字段 | 含义 |
|---|---|
| `mode` | `metro` 或 `timeline`,默认前者 |
| `title`, `subtitle` | 主标题、解释性副标题 |
| `eyebrow`, `footer` | 页眉分类、来源/语义/刻度说明 |
| `routes`, `nodes` | 非空数组,下面说明 |
| `layout` | 可选尺寸与布局参数 |
| `theme.paper` | 背景色,`#RRGGBB`,默认米白 |
| `links` | 可选明确关联,`{"from":"节点ID","to":"节点ID","label":"关系依据"}`;画为细灰箭头,不自动创造 |
| `eras` | 时间图背景,`{"start":1800,"end":1900,"label":"阶段"}`;范围必须在时间轴内 |
| `ticks` | 时间图的刻度数字数组,不得超出节点时间范围 |
## 线路
`id` 唯一;`label` 显示名称;`code` 用短字母或数字;`color` 为 `#RRGGBB`;`group` 是图例栏目标题;`stops` 是节点 ID 的有序列表,非空、同一线路内不重复。
所有线路的 `stops` 共同定义归属;没有节点侧的第二套 `routes` 字段。多条线路引用同一个 ID 就是换乘节点。所有节点至少属于一条线路。
可选 `offsets` 控制横向弯道,如 `[[0,0],[0.25,0],[0.45,-50],[0.75,-50],[1,0]]`。地铁图默认省略此字段,保持主干笔直。每对值是 `[纵向归一化位置,水平偏移像素]`,位置 0/1 为全图首/末事件,严格递增并限制在 0—1。端部保持最近值,相邻点以平滑三次曲线连接;站点按同一函数定位。偏移不是自动布线,过大的偏移会造成相撞或换序,需看图调整。
## 节点
| 字段 | 含义 |
|---|---|
| `id` | 唯一、非空、稳定字符串 |
| `label` | 主名称,默认 ID |
| `detail` | 可选一行说明,不自动换行 |
| `major` | `true` 时强调文字和站点 |
| `order` | metro 排序优先值;只在满足线路先后约束的节点中生效,默认输入数组顺序 |
| `time` | timeline 必需有限数字,负数年代需解释记年法 |
| `label_side` | `left` / `right` 优先方向;冲突时可自动反向 |
| `label_dy` | 标签垂直偏移像素;设置后不再尝试其他垂直偏移,仍可反向、移到侧栏 |
共享节点是所有所属线路上的同一事件;名称相似或发生时间不同的条目应使用不同 ID,再以明确关联连接。
## 布局
| 字段 | 默认 | 含义 |
|---|---|---|
| `width` | 1320 | 需容纳全部线路、文字和侧栏 |
| `lane_gap` | 86 | 相邻线路横向间距,最小 32 |
| `row_gap` | 66 | metro 站点纵距,最小 36;高度按节点数计算 |
| `font_size` | 17 | 节点字号,最小 8 |
| `lane_order` | `routes` 顺序 | 所有线路 ID 的完整排列 |
| `height` | 2050 | timeline 高度,metro 忽略 |
| `time_scale` | 全范围线性 | timeline 分段映射 |
地铁图使用稳定拓扑排序,每个节点占一个纵向层级。当前版本不把独立节点压到同一行,也不做线路邻接的全局优化;可通过 `lane_order`、输入节点顺序和弯道进行编辑。
时间图每条线路按时间升序列出站点,同年事件允许并排,范围不能只有一个值。可用 `"time_scale":[[1800,0],[1900,0.28],[1950,0.59],[2000,1]]`。第一对必须为 `[最早节点时间,0]`,最后为 `[最晚节点时间,1]`,两列严格递增;相邻区段内线性插值。图中须注明压缩区段,脚本不自行决定压缩哪些年代。不能为避让修改年代。
## 输出与返回值
- SVG:真实文字、路径和几何节点,保留 `data-route` / `data-node`,字体未嵌入。
- `.report.json`:尺寸、数量、节点坐标、标签侧向/偏移/估计包围框、提示列表。
- `label_needs_review`:估计标签碰撞、越界或穿越线路;要修正并看图复核。
- `overpass`:非成员线路从共享胶囊上方通过,是信息提示;只有圆环表示归属。
- `route_outside`:线路越界,需要调整偏移或加宽。
- 退出码:0 成功;1 输入/文件错误;2 `--strict` 发现待复核问题。报告不是像素级碰撞证明。
额外来源字段可放入节点或关联,渲染器忽略它们,源 JSON 应保留以便追溯。只把经过核实或用户明确给出的关系加入 `links`。