TopoJSON 是什么
TopoJSON 是 GeoJSON 的一种扩展编码格式,由 Mike Bostock(D3.js 作者)提出。与 GeoJSON 直接存储每个几何的完整坐标不同,TopoJSON 编码的是几何对象之间的拓扑关系——通过提取共享弧段(arcs)来消除重复数据,从而显著减小文件体积。
TopoJSON 与 GeoJSON 的核心区别
理解两者的差异,关键在于"独立存储"与"共享引用"两种思路:
- GeoJSON:每个 Feature 独立存储完整坐标,相邻要素的共享边界会被重复存储,产生冗余。
- TopoJSON:先提取所有不重复的弧段(arcs),几何对象通过引用弧段索引来构建,从而消除冗余。
例如两个相邻的行政区域,其公共边界在 GeoJSON 中被存储两遍,而在 TopoJSON 中仅存储一次,两个多边形各自引用同一段弧。
TopoJSON 的数据结构
TopoJSON 的顶层结构包含三个核心部分:
arcs(弧段数组)
存储所有去重后的弧段坐标。每个弧段是一组有序坐标点序列,是构建几何的基础单元。
objects(几何对象)
存储实际的 FeatureCollection 或 Geometry。几何通过弧段索引引用 arcs,而非直接存储坐标。
transform(量化参数)
包含 scale(缩放系数)和 translate(平移偏移),用于将整数坐标反量化回原始浮点坐标。
量化压缩
TopoJSON 的体积优势除了来自弧段共享,还来自坐标量化:
- 使用 transform 对坐标进行整数量化,将浮点坐标转为整数。
- 采用 Δ-encoding(增量编码),存储相邻坐标的差值而非绝对值。
转换回 GeoJSON 时,需要先进行反量化:将整数增量累加,再乘以 scale 并加上 translate,恢复原始坐标。
转换原理
将 TopoJSON 转为 GeoJSON 的关键,是将弧段引用展开为完整坐标。本工具使用 topojson-client 库的 feature() 函数完成这一过程:
- 读取 TopoJSON 中的 objects 与 arcs。
- 对每个几何对象,依据其引用的弧段索引,从 arcs 中取出对应坐标。
- 按几何类型正确拼接坐标(注意弧段方向与切割)。
- 反量化得到真实坐标。
- 组装为标准 GeoJSON FeatureCollection。
文件体积优势
得益于弧段共享与量化压缩,TopoJSON 的文件体积通常比对应的 GeoJSON 小 70-80%,这使得它非常适合在带宽有限的 Web 环境中传输。
应用场景
- D3.js 数据可视化:D3 生态原生支持 TopoJSON,是行政边界可视化的首选格式。
- 行政边界数据:如世界地图、国家行政区划等共享边界密集的场景。
- Web 地图传输优化:通过减小体积提升地图数据加载速度。
提示:TopoJSON 转 GeoJSON 是有损还原的反过程。由于量化会损失部分精度,转换后的坐标与原始数据可能存在微小偏差,请根据精度需求评估 transform 的量化位数。
如需将 TopoJSON 转换为 GeoJSON,可以使用我们的 TopoJSON 转 GeoJSON 工具,在线快速完成转换。