本人的个人博客为:www.ourd3js.com
csdn博客为:blog.csdn.net/lzhlzz
转载请注明出处,谢谢。
前些天有朋友留言询问 GeoJSON 文件和 TopoJSON 文件的关系,正好我其实也不是十分明了,查询了一番后整理如下,还望大家指证。
这两种文件都是基于 JSON 语法的,首先来说一下 JSON 语法和文件是怎样的。
1. JSON 格式
JSON(JavaScript Object Notation) 是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读。尽管 JSON 是 Javascript 的一个子集,但 JSON 是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。
JSON 的格式[1]如下:
- 物件( object ):一个物件的数据写在一组大括号内 { ... }
- 名称/值( collection ): 每一个物件都由一系列的名称/值( collection )组成,名称/值之间用逗号( , )分隔。一个名称可以是一个字符串;一个值可以是字符串,数值,布尔值,有序列表,或 null 值。
name:value
由于 name 必定是字符串,所以要写在双引号之内。
- 值的有序列表( Array ):列表写在 [ ... ] 之间
[collection, collection, collection, ...]
2. GeoJSON 格式
GeoJSON 是一种对地理数据结构进行编码的格式。它只是一个采用上述 JSON 格式的用于描述地理信息的格式。它的语法和 JSON 是一样的,只是对各名称做了规范,形如[2]:
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, "properties": {"prop0": "value0"} }, { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [ [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] ] }, "properties": { "prop0": "value0", "prop1": 0.0 } }, { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ] }, "properties": { "prop0": "value0", "prop1": {"this": "that"} } } ] }
具体的可以参加 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