麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

「GIS解惑」为什么 TopoJSON 比 GeoJSON 小那么多?

小编之前在《「GIS教程」什么是TopoJSON》里简单介绍过 TopoJSON,当时留了个尾巴,只说它比 GeoJSON 小得多,但没讲清为什么会小这么多。最近又有小伙伴在麻辣GIS群里问类似的问题,小编干脆拿了份真实数据实测了一下,顺便把背后的机制展开介绍一下,有需要的小伙伴可以参考一下。

数据实测

小编本机用官方工具链实测了一下,数据源是阿里云 DataV.GeoAtlas 的全国省级边界 GeoJSON(100000_full.json),转换用的是 topojson 官方 CLI(geo2topo + topoquantize),量化网格取默认的 1e4。结果如下:

可以看出共享弧段去重后,583 KB 就降到 396 KB,小了约 32%, 如果加上量化(默认 1e4),进一步降到 143 KB,累计小了约 75%,最后在数据传输的时候使用gzip,143 KB 的 TopoJSON 只剩 39 KB,而原始 GeoJSON 还要 201 KB。

为什么会少这么多呢,其实这主要与TopoJSON的三大机制有关:共享弧段(边界去重)、增量编码(坐标只记变化量)、量化

机制一:共享弧段

GeoJSON 里每个面都是"独立王国",两个相邻省份共享的那段边界,会完整地出现在两边多边形的坐标数组里,方向还相反。全国 34 个省级行政区互相接壤,这段"重复劳动"非常可观。

TopoJSON 的做法是把所有边界线拆成弧段(arc),存进一个全局的 arcs 数组,每个弧段只存一次;多边形不再写坐标,只写弧段的编号引用,引用时用负号表示反方向。相邻边界越长、相邻要素越多,省得就越多,这也是中国省级边界这种"接壤密集"的数据特别适合 TopoJSON 的原因。

机制二:增量编码

光去重还不够。TopoJSON 在编码坐标时还有一招:不是每个点都存完整的经纬度,而是首点存原始值,后面的点只存"相对上一个点的差值"。

这一步单独看省不了多少字节,但它有两个意义:一是把大数字变成小数字,二是配合量化把浮点数变成整数之后,同样的内容能压得更小,所以增量编码其实是给后面量化和压缩机制的基础。

机制三:量化

坐标能无限精确,但很多场景根本用不上。TopoJSON 默认把坐标映射到一个 1e4 × 1e4 的整数网格上,经纬度变成 0 到 10000 之间的整数,配合 transform 里的 scale 和 translate 就能还原出近似坐标。

不过这一步有是有精度损失为代价的,本测试的量化网格下坐标精度约 0.006°(大约 0.5 到 0.7 公里),小比例尺地图肉眼无感;如果做高精度分析,可以把网格调大(比如 1e5、1e6),但文件体积会相应变大一些。

总结

总结一下TopoJSON变小的三个机制,共享弧段负责去掉边界重复,增量编码负责把数字变小,量化负责把缩减精度,三者叠起来就是实测里那 75% 到 81% 的体积降幅。对前端地图来说,这意味着更快的加载、更省的带宽,尤其是省级、市级这种边界密集的数据,收益非常明显。

顺便说一下,TopoJSON使用拓扑结构还有个隐藏福利,因为相邻要素共享同一条弧段,做简化(simplify)的时候不会出现缝隙或重叠,这也是很多地图库爱用 TopoJSON 的原因。最后如果你也想用这个格式,可以参考小编之前写过 GeoJSON 转 TopoJSON 的几种方法,见《「GIS教程」将GeoJSON转换成TopoJSON的方法》,有需要的可以试试。

参考

  1. TopoJSON 官方说明:https://github.com/topojson/topojson
  2. 阿里云 DataV.GeoAtlas 全国省级数据源:https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json
  3. TopoJSON: A smaller GeoJSON with some neat tricks(Mike Bostock 演讲):https://www.somebits.com/~nelson/SotM-2013-TopoJSON.pdf
  4. TopoJSON vs GeoJSON 对比:https://geodata.tools/blog/topojson-vs-geojson/

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子
没有下文

留言板(小编看到第一时间回复)