鐵人賽Day 6-常見的GIS資料格式

web
  1. 1. 先釐清一下資料型態
    1. 1.1. 網格資料:
    2. 1.2. 向量資料:
  2. 2. 本篇主要談的資料格式屬於向量式資料
    1. 2.1. geojson (http://geojson.org/)
    2. 2.2. ESRI shapefile(shp)
  3. 3. kml
  4. 4. topojson
  5. 5. 後記

前兩天我們先用CARTO(CartoDB)實作了一些基本的GIS資料視覺化,接觸了GIS資料。

延續 [Day3] 談互操作性及Web Map Service 標準議題,我們在處理資料時可能會遇到各種GIS格式,今日就來攻略幾種web常用的GIS資料格式

本文是參加鐵人賽的文章,同步發表於 “2018鐵人賽-30天打造我的WebGIS系列”

先釐清一下資料型態

根據教科書,所謂GIS資料就是具備空間資訊的資料,依照資料型態可以分成兩類

  • 網格資料(raster)
  • 向量資料(vector)

網格資料:

網格資料指的通常是影像類型等規則網格的資料,例如衛星影像、高程模型(用來表示地形),以像元(pixel)為基礎,每個pixel會有一些資訊如R,G,B, 或是深度、高度,等,賦予每一個pixel對應的空間坐標,就是一個網格式GIS資料,而賦予坐標的做法通常是定義網格大小、起始網格坐標、以及方向,定義這些資訊的檔案稱作 world file,常用的格式如geotiff、tiff、jpg、bmp等影像檔具有world file都屬於此類。

向量資料:

比起網格式資料可能都是使用專業人員處理好的資料,向量式資料在應用上常見得多,又依表示方法分成:點、線、面(註)

註:點線面是統稱,在2D 又可細分為multi points, multi polygon…etc. 在3D GIS的世界,相關格式另有一片天….。


本篇主要談的資料格式屬於向量式資料

geojson (http://geojson.org/)

geojson我們在第二天的範例中就已經在地圖上介接了一個開放資料範例,而跟前幾天提到GIS常用的OGC標準不同,geojson非OGC標準,是由IETF(Internet Engineering Task Force)組織訂定的,因為是json物件的方式表現,使用起來可說是簡單好用,於webgis廣為流通,目前版本的geojson(RFC 7946)具有以下特徵:

  • JSON,流通方便
  • 一個geojson結構如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
    "type": "Feature",
    "geometry": {
    "type": "Point",
    "coordinates": [125.6, 10.1]
    },
    "properties": {
    "name": "Dinagat Islands"
    }
    }
  • 幾何樣態(geometry Type):Point, LineString, Polygon, MultiPoint, MultiLineString, and MultiPolygon

  • 坐標(coordinates):不同幾何形態有不同坐標值記錄方式,可以參考 wiki範例,而且並沒有定義投影坐標系統的欄位,通常默認為EPSG4326(也就是wgs84經緯度)
  • 屬性(properties):在properties以key-value方式記錄每一筆資料的屬性欄位

ESRI shapefile(shp)

shapefile在GIS領域廣為使用多年,目前仍廣泛使用中,它是GIS應用軟體供應商ESRI定義的格式,亦已部分公開相關結構,大多數GIS軟體(如QGIS、Arcgis等)也都支援。
要解析shapefile,可參考github上有許多shapefile library,而一個shapefile通常包含很多附屬檔案(wiki):

  • Shapefile圖形格式 (.shp)
  • Shapefile圖形索引格式(.shx)
  • Shapefile屬性格式(.dbf),屬性資料庫
  • Shapefile投影格式(.prj),紀錄坐標系統
  • Shapefile空間索引格式(.sbn)

一個shapefile只會有一種幾何形態,共支援Point, Polyline, Polygon, 等13類的幾何型態資料,更多shape資料問題可參考wiki

這邊要特別分享一個小小使用經驗:

shapefile因為具有(.prj)檔案記錄投影坐標系統的特性,與geojson有個不同的地方在於它可以使用不同的坐標系統(一般來說geojson都是使用ESPG4326,也就是wgs84經緯度),我們拿到一份shapefile可能會是各式各樣坐標系統,這些坐標值是存在shp內,當我們偶爾會拿到沒有prj檔的shapefile時,可能會遇到對於shp內坐標值到底是啥而一頭霧水的現象,這時便需要經驗判斷資料的坐標系統喔!(關於坐標系統,預計過兩天再來攻略^^)

kml

kml是OGC規範格式,廣泛用於Google Earth等平台上,它是xml方式表達GIS資料,並且包含了其在Google Earth上的樣式資料,基本上都使用ESPG4326的經緯度坐標,範例如下(wiki)

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Placemark>
<name>New York City</name>
<description>New York City</description>
<Point>
<coordinates>-74.006393,40.714172,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>

在我過去使用kml的經驗,Google Earth對於kml在樣式屬性上實在非常具有彈性,他甚至可以定義其在Google Earth上的Popup內容、視角、事件等等,個人覺得算是很單純但又很難掌握(ㄊㄠˇ 一ㄢˋ)的格式(樣式部分)

topojson

topojson是geojson的擴充,大致上是基於geojson但具資訊壓縮並考量位相關係的(topology)的資料格式(請參考topojson spec文件),廣泛用於webgis及d3.js資料視覺化(作者同時也是d3.js作者Mike Bostock),關於topojson詳細的規格可以直接參考文件,在這邊我們先快速來看看一個Taiwan.TopoJSON範例(因長度關係,請直接前往github上的範例)。

拿到資料後,我們把資料複製到json edirtor檢視:
https://ithelp.ithome.com.tw/upload/images/20171225/201078169w5CgPveJz.jpg

從資料格式架構中可以看到,topojson相較於geojson多增加了幾個項目:bbox、transform、arcs

  • bbox: 記錄的是這份geojson的邊界
  • transfrom: 記錄兩個尺度兩個平移參數,在topojson中為了減少記錄位數,坐標都是用int方式記錄,再靠transform參數還原
  • arcs: 記錄資料中的邊,arcs分兩個部分,一個是最外層的arcs記錄所有的邊第二個是每個幾何物件中的arcs記錄的為arc index,每個幾何物件內的arcs都參照最外層arcs,如此是以共邊的概念記錄每個物件的幾何,減低資料量並保有位相關係(topology)
  • objects: GIS資料物件陣列,包含幾何及屬性

後記

geojson、shapefile、kml在webgis中最常被用到,資料交換也常依賴這幾類格式,大多數webgis平台都支援這些資料形式,因此大家一定會碰到,今天先介紹這些格式,明天預計來攻略這幾類的資料轉換(這應該才是最重要的^^)。