流浪小猫的博客

GeoJSON 和 TopoJSON

· xcatliu

GeoJSON 是用来描述一系列几何形状的数据结构。它可以描述以下几种几何类型:Point、LineString、Polygon、MultiPoint、MultiLineString 和 MultiPolygon。

TopoJSON 是 GeoJSON 的拓展,用来描述拓扑结构。通过提取图形中公用的点来减少冗余,一般可以把 GeoJSON 的大小压缩到原来的 20%。

GeoJSON§

GeoJSON 使用 type 表示数据的类型。

type 取值 PointLineStringPolygonMultiPointMultiLineStringMultiPolygonGeometryCollection 时,用来表示几何图。

type 取值 Feature 时,除了几何图外,还可以包含其他自定义信息。

type 取值 FeatureCollection 时,可以包含多个 Feature Objects。

GeoJSON 使用一维数组表示 Point,二维数组表示 MultiPointLineString(或 LinearRing 即环线),三维数组表示 MultiLineStringPolygon(包含洞的面),四维数组表示 MultiPolygon

具体的规则,请直接看 GeoJSON 规范(最好阅读完了再继续往下看)。

TopoJSON§

TopoJSON 通过四种方式压缩了 GeoJSON 的大小。

TopoJSON 的压缩算法§

  1. 把所有点提取到一个数组中,其他需要用到点的地方,都直接填入 index 即可。这样做的话,可以极大的减少数据的冗余,比如两个图形交界的地方只用存一份数据
  2. 把浮点数转化为整型数,通过 transform 来转化
  3. 点列表除了第一个点以外,其他的点都只存储相对位置
  4. 通过 topojson.simplify 压缩(官方没有具体介绍)

通过前三种方式,即可使得大小能被压缩到原本的 20%。

TopoJSON 的规范§

具体的规范可以直接阅读 TopoJSON 规范

TopoJSON API§

官方只给出了 JavaScript 版本(另外有人实现了 python 版本),下面做个简单介绍。

Client API§

Server API§

Command Line Tools§

更多请阅读 TopoJSON API ReferenceCommand Line Reference