GIS工具箱
格式转换

TopoJSON 与 GeoJSON 的区别与转换

TopoJSON 的拓扑编码原理、arc 共享机制,以及转换为 GeoJSON 的方法。

TopoJSONGeoJSON拓扑格式转换

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 的体积优势除了来自弧段共享,还来自坐标量化

  1. 使用 transform 对坐标进行整数量化,将浮点坐标转为整数。
  2. 采用 Δ-encoding(增量编码),存储相邻坐标的差值而非绝对值。

转换回 GeoJSON 时,需要先进行反量化:将整数增量累加,再乘以 scale 并加上 translate,恢复原始坐标。

转换原理

将 TopoJSON 转为 GeoJSON 的关键,是将弧段引用展开为完整坐标。本工具使用 topojson-client 库的 feature() 函数完成这一过程:

  1. 读取 TopoJSON 中的 objects 与 arcs。
  2. 对每个几何对象,依据其引用的弧段索引,从 arcs 中取出对应坐标。
  3. 按几何类型正确拼接坐标(注意弧段方向与切割)。
  4. 反量化得到真实坐标。
  5. 组装为标准 GeoJSON FeatureCollection。

文件体积优势

得益于弧段共享与量化压缩,TopoJSON 的文件体积通常比对应的 GeoJSON 小 70-80%,这使得它非常适合在带宽有限的 Web 环境中传输。

应用场景

  • D3.js 数据可视化:D3 生态原生支持 TopoJSON,是行政边界可视化的首选格式。
  • 行政边界数据:如世界地图、国家行政区划等共享边界密集的场景。
  • Web 地图传输优化:通过减小体积提升地图数据加载速度。
提示:TopoJSON 转 GeoJSON 是有损还原的反过程。由于量化会损失部分精度,转换后的坐标与原始数据可能存在微小偏差,请根据精度需求评估 transform 的量化位数。

如需将 TopoJSON 转换为 GeoJSON,可以使用我们的 TopoJSON 转 GeoJSON 工具,在线快速完成转换。

本文涉及的工具

打开工具 →

相关文章