將開放資料匯入開放街圖(一)

February 11, 2017

這篇文章,連同後續幾篇同系列的文章,會記錄我嘗試把台灣政府單位釋出的開放資料匯入開放街圖的經驗。

台灣已經有好一些政府釋出的資料集。這些資料集在授權方面符合開放資料定義,可以納入開放街圖中,以方便後續的應用。但是實際上要把這些資料整合進地圖,還是會遇到許多問題。例如,有的時候官方資料與開放街圖上的資料不一致(最常見的是設施在地圖上的點位不同),沒有經過現地勘查,也沒辦法知道哪一方的資料才正確。有時候則是資料集本身不適合,例如官方資料集本身就是集成起來的統計資料,沒辦法從一筆資料對應到地圖上的單一個物件,這可能就要回去問釋出資料的單位是否有可能提供更精細的資料。

這一系列文章會把匯入資料過程中遇到的問題記錄下來,希望以後能透過開發工具、社群討論、對公部門的意見回饋,盡量解決在整合官方與群眾外包資料時所遇到的困難。最終的目標,是希望有愈來愈多的官方資料可以自動轉入開放街圖,並且將來能藉由開放街圖的資料庫,在許多分散的官方資料之間建立關聯,以利進一步分析。當然也希望這樣的基礎建設對公部門與社群都有幫助。

要注意的是,開放街圖強烈建議匯入資料前先與社群充份討論,並且參考資料匯入準則。關於大量匯入資料所可能造成的問題,社群已經有許多不良經驗。因此以下記錄的操作過程僅為測試,最終會完成一份可以透過 JOSM 提交到開放街圖的地圖修正,但不會實際上傳資料。這系列測試的目的之一,就是希望能發展出一套工具,協助社群與較不熟悉開放街圖運作的資料處理者合作,有效地進行討論,讓資料整合這件事情變得簡單一些。這也是我在今年 g0v 公民科技創新獎助金的提案

資料集

我先從處理起來比較簡單的資料集開始。這次測試匯入的資料集是臺北市政府環境保護局所釋出的臺北市公共場所飲水機資訊

這份資料授權是臺北市政府資訊開放加值應用規範。以下這部份條款,允許我們把資料匯入開放街圖:

本府以公開、非專屬授權之模式,允許使用者得不經本府書面同意,不限時間及地域,自行或再授權他人以重製、改作、編輯或其他加值應用方式加以利用或散布,或製作加值衍生物以有償或無償方式提供他人使用。

資料格式是 CSV,包含以下欄位:

資料總共 200 筆。每筆資料都有經緯度,所以不必再透過地址轉換,省去一件工作。此外也有管理單位、電話、開放時間,這些欄位都可以納入開放街圖中。以下會用 OpenRefine 清整資料,再用 JOSM 匯入。

查了一下 overpass turbo,目前開放街圖在台北市內已經有 429 筆飲水機的資料。其實之前的飲水地圖計劃已經在各地增加了不少的飲水點資料,而台北市這份資料集收集的主要是市內捷運站、運動中心、公園的飲水點,理論上多數都已經在開放街圖上面了。不過我後來在 JOSM 裡對照了一下,也還是有些地方例如:玉成公園、信義運動中心、士林運動中心、植物園,在開放街圖上沒有資料。並且這份資料裡有飲水機的管理單位和開放時間,也是開放街圖上的飲水點資料比較缺乏的,所以仍然有匯入的價值。

清整資料

因為 JOSM 的 OpenData plugin 在匯入 CSV 檔案時,會把 CSV 的每一欄對映到一個開放街圖的標籤(tag),所以清整資料的目標是:

  1. 檢查有沒有不合常理的資料內容、文字編碼有沒有問題。
  2. 把用不到的欄位都刪掉。
  3. 把要匯入的欄位,欄位名稱改為開放街圖的標籤名稱,欄位內容整理成標籤內容的正確格式。
  4. 加上 amenity=drinking_water,表示資料是飲水機。
  5. 加上 source 欄位,表示資料來源為台北市政府開放資料。

清整完畢的資料,我放在 GitHub,所使用的欄位對應如下:

關於匯入開放街圖所使用的 CSV 格式,也可以參考之前台灣開放街圖社群匯入 GNS 地名時所整理出來的 CSV 資料

這份資料內容方面整理起來沒什麼大問題,就是要核對一下各欄位的格式。其中 opening_hours 的格式可以用 opening_hours evaluation tool 幫忙檢查一下。另外「場所名稱」大概是轉 UTF-8 的過程中有點問題,有一筆資料是「?公圳公園」,這就要進 JOSM 對照開放街圖上的資料才能修正(結果應該是「瑠公圳公園」)。

匯入資料

雖然前面一直說是要匯入資料,但通常在把官方的資料集整合進開放街圖時,每一筆資料都需要人工檢查。檢查的內容可能有:位置是否合理(例如應該在室內的飲水機卻標在建築物之外)、有沒有現存的資料需要合併,或是一些人眼才看得出來的問題。當有很多資料需要比對的時候,實際上的操作比較像是對照現有資料在修正地圖。

我的操作程序是:

  1. JOSM 要安裝 OpenData plugin。
  2. 用 JOSM 開啟 CSV 檔,匯入座標投影選擇 WGS 84 Geographic。
  3. 另外開一個圖層,用來載入開放街圖資料對照。

接下來是一筆一筆檢查資料:

  1. 選定一個飲水點,這裡以「關渡站飲水機」為例。
  2. 放大到這個飲水點附近。
  3. 用 OSM 圖層從開放街圖下載現有資料。
  4. 開 filter “amenity=drinking_water”。
  5. 兩個圖層對照一下,會發現開放街圖上已經有關渡站飲水機了,但是位置不大一樣,也缺少一些標籤。
  6. 因為官方資料本身缺乏可以對照位置的參考點,比較常出現不合理的點位,例如室內的設施跑到室外,或是跑到道路上,所以通常我會保留現有資料的位置,只補充標籤。只要複製匯入資料的標籤,按 cmd-shift-v 貼到現有資料上就好了。

整個過程就是依序檢查 200 筆資料,如果目前沒有資料,匯入的資料看起來也合理,就保留匯入的資料。如果現有的資料夠完整了,就從匯入的資料中刪除那一筆。理論上檢查完畢就可以把修改送出去了。

問題

以上的操作可以把資料匯入開放街圖,但在這個例子裡,還是有一些資料品質的問題。台北市的這份資料集把同一個場所設置的多台飲水機列為一筆資料,例如「臺北市立士林運動中心」的飲水台數是 4,表示這裡有 4 台飲水機,但每筆資料只有一個點位資料。那這個點位是指其中某一台飲水機的位置,還是場所裡任意某一處的點位呢?其它飲水台的位置又在哪裡呢?

對照開放街圖現有資料來看,這份資料集裡的飲水機點位與場所建物看起來沒有什麼關係,所以很可能是表示其中一台飲水機的位置。但沒有進一步的調查或詢問原單位,恐怕很難確定。

此外,匯入資料最耗時的操作就是人工檢查。如果資料數量龐大,匯入前或匯入後應該要可以用 OSM Tasking Manager 這一類的工具讓檢核工作可以由社群分工進行。

除了這次測試的方法,也可以用 JOSM conflation plugin 合併兩方的資料,操作方法參考 OSM Wiki。下次我會拿別的資料集來測試 conflation 的操作。

2017-03-05 更新

將清整好的資料載入 QGIS 檢查以後,發現以下 4 筆資料的位置資訊明顯錯誤:

這些明顯是經度和緯度的欄位錯置了。