【 D3.js 入门系列 — 10.3 】 GeoJSON 和 TopoJSON 文件有什么不同?

GeoJSON 和 TopoJSON 文件都是描述地理信息的文件,它们有什么区别和联系呢?

前些天有朋友留言询问 GeoJSON 文件和 TopoJSON 文件的关系,正好我其实也不是十分明了,查询了一番后整理如下,还望大家指证。

这两种文件都是基于 JSON 语法的,首先来说一下 JSON 语法和文件是怎样的。

1. JSON 格式

JSON(JavaScript Object Notation) 是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读。尽管 JSON 是 Javascript 的一个子集,但 JSON 是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。

JSON 的格式[1]如下:

  • 物件( object ):一个物件的数据写在一组大括号内 { … }
  • 名称/值( collection ): 每一个物件都由一系列的名称/值( collection )组成,名称/值之间用逗号( , )分隔。一个名称可以是一个字符串;一个值可以是字符串,数值,布尔值,有序列表,或 null 值。

由于 name 必定是字符串,所以要写在双引号之内。

  • 值的有序列表( Array ):列表写在 [ … ] 之间

2. GeoJSON 格式

GeoJSON 是一种对地理数据结构进行编码的格式。它只是一个采用上述 JSON 格式的用于描述地理信息的格式。它的语法和 JSON 是一样的,只是对各名称做了规范,形如[2]:

具体的可以参加 http://geojson.org/

3. TopoJSON 格式

TopoJSON 是 GeoJSON 简化后的版本,可以说是 GeoJSON 的小孩。D3.js 的作者认为 GeoJSON 不太好,比较推崇 TopoJSON 格式。

TopoJSON 与 GeoJSON 相比,文件大小缩小了 80% ,因为:

  • 边界线只记录一次(例如广西和广东省的交界线只记录一次)
  • 不使用浮点数,只使用整数

不过 TopoJSON 似乎只在 D3.js 中比较广泛的使用,还不是世界范围内认可的格式。

 

要注意,无论 GeoJSON 还是 TopoJSON ,它们本质上有是 JSON 格式的文件,都遵循 JSON 的语法,只不过对变量的名称做了不同的规范。

在 http://mapshaper.org/ 可以试着转换 GeoJSON 和 TopoJSON 的数据,我们会看到对于同一个地理数据文件,TopoJSON 的文件大小大概相当于 GeoJSON 的 20% ,这对于解决因文件量过大而造成的读取速度过慢是相当简单有效的。


[1] http://zh.wikipedia.org/wiki/JSON

[2] http://geojson.org/


文档信息


【 D3.js 入门系列 — 10.3 】 GeoJSON 和 TopoJSON 文件有什么不同?》上有8条评论

  1. 老师,指点下一个方向,有没有这geojson和topojson互相转换的方法?

  2. 楼主,我们大部分数据都是用d3.json读取本地文件,而实际上json是动态变化的,求问这个怎么做呢?

    • 每一次json文件发生变化,客户端都要重新请求,这是没有办法的。
      有两种办法,可能可以解决你的问题:
      1. 对于经常变化的变量,单独成立一个文件,每次都请求这一个小文件,速度很快。我相信你的JSON文件不是所有都要改变的。
      2. 如果你的JSON文件的变化是规律的,可以写成javascript代码让用户在本地执行。

      谢谢

  3. 楼主,有比较详细的中国地图? 包含市县级的

  4. 谢谢博主的总结!再弱问一下,有没有什么工具能把mif或者shp文件转成geojson 或者topojson的?貌似网上美国地图还多一些,中国的相当少,想做点应用很难啊,总不能自己一点一点描

评论已关闭。