06 / Maps · WebGL · globe.gl · 已上线

用一个能转动的
地球回答历史问题

辣椒根本不是中国原产的——它什么时候来的、怎么改变了川菜?我想把这类问题的答案变得可以被看见。

探索地图 →
起点 · Origin

一个历史问题变成了一个数据项目

有一天我突然意识到:四川菜那么辣,但辣椒在明朝末年才从美洲传入中国。短短几百年,它是怎么彻底改变了整个西南的饮食文化的?

顺着这个问题往下查,我发现番茄、玉米、红薯、花生——餐桌上至少一半的食材都不是「本地的」。它们的迁移史比文字记录更诚实,也更难被删除。

我想把这些「餐桌下的历史」变成可以交互的东西——不是一篇文章,是一个可以转动、搜索、筛选的工具。

核心问题

食物的传播路径记录着人类的迁移史。如果把这些路径放到一个可以交互的 3D 地球上,历史会变得更直观。

功能 · Features

三个核心交互模块

🌐
3D 可交互地球
globe.gl 渲染 WebGL 地球,可拖拽旋转。GeoJSON 省份边界绘制中国区域,按口味维度着色。
🔍
食材搜索与筛选
Autocomplete 实时下拉搜索,支持多选口味筛选(辣/甜/酸/咸),省份标签动态高亮响应。
🗺
传播路径可视化
BFS DAG 布局渲染食材的历史传播树,按时间轴和地理层级展开,点击节点看各国故事。
技术 · Technical

从零搭建全栈可视化项目

3D 渲染 globe.gl + WebGL
地理数据 GeoJSON 省份边界
传播图 BFS DAG 布局算法
前端 Vanilla JS(无框架)
数据 自整理食材数据集

没有使用前端框架,所有交互逻辑用 Vanilla JS 实现。地球上的省份标签层是 HTML 覆盖层,叠加在 WebGL canvas 之上,通过坐标转换保持位置同步。

传播路径的可视化用的是 BFS 广度优先搜索算法生成有向无环图(DAG),将 spread_routes 数据渲染为时间轴与地理层级结合的树形结构。

挑战 · Challenge

HTML 标签层的性能瓶颈

问题:几百个 HTML 标签拖垮了渲染性能

最初的实现是把每个省份/食材的标签都渲染成 DOM 节点,叠加在 WebGL canvas 上。当地图显示全部数据时,几百个 HTML 元素同时存在,导致滚动和旋转时帧率严重下降。

解法:按视口虚拟化。 只渲染当前视角内可见的标签,旋转到背面的省份标签不创建 DOM 节点。同时将标签更新的频率和 globe 渲染频率解耦,降低 DOM 操作次数。

优化后旋转流畅度从卡顿恢复到正常,在大多数设备上可以流畅运行。

数据整理是最耗时的部分

WebGL 渲染和算法实现花了 3 天,但整理食材数据集(起源地、传播路径、代表菜系、历史故事)花了将近一周。数据质量直接决定这个项目有没有意义,不能靠 AI 生成,需要查文献核实。

结果 · Result

一个回答好奇心的工具

项目性质
独立全栈 · 数据可视化
当前状态
已部署上线
技术验证
WebGL + GeoJSON + DAG 可视化
数据覆盖
数十种食材 · 含传播路径与历史注释

这个项目没有「用户需求」,也没有「业务目标」,只有一个想弄清楚的问题——然后用代码来回答它。它是纯粹由好奇心驱动的项目,最终验证了这类数据可以被可视化,并且可以做得比一篇文章更有交互性。