標籤:d3 geojson topojson 地圖 檔案
本人的個人部落格為: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
[2] http://geojson.org/
【 D3.js 入門系列 — 10.3 】 GeoJSON 檔案和 TopoJSON 檔案的區別和聯絡