文章目錄
TWD97(二度分帶投影坐標) convert to WGS84(度分秒) with MongoDB
政府資料開放平臺的資料很多都是 shp 檔案而不提供 json 檔案。(這次的練習之前根本沒聽過 shp 格式)。在此記錄研究了一天之後的成果跟心得。
要把 json 資料匯入 MongoDB ,寫一個 javascript 檔讓 mongo shell 執行,就可以操作資料庫,直接轉換座標資料!
流程:
shp 檔案 -> json 檔案 -> import to MongoDB database -> 寫一個 javascript 檔,讓 mongo shell 直接操作資料庫轉換、更新資料。
政府資料開放平臺原始資料:臺鐵車站(共266個)shp 檔案
shp 檔案 -> json 檔案
- shp to Json https://mygeodata.cloud/converter/shp-to-json
- 把解壓縮之後的 .shp / .dbf / .prj /.shx 都上傳到上述網站, 選擇輸出 GeoJSON 。得到一個 geojson 檔案。副檔名 .geojson 改成 json,用 IDE 編輯器開啓。最前面有類似 Header 的多餘資料,不需要 import 進資料庫,把它去除。
在 IDE 下顯示的 json 檔
json 檔案 -> import to MongoDB database
mongoimport -d mydb -c mycollection — jsonArray < your/path/data.json
用 MongoDB Compass 看一下資料狀況。
座標數值一看就很怪,網路上做一下功課,原來這種座標是 TWD97 格式(二度分帶投影坐標),要轉換成 WGS84(度分秒)。
import to MongoDB database -> 寫一個 javascript 檔,讓 mongo shell 直接操作資料庫轉換、更新資料。
- mongo shell 可以直接執行 javascript 檔案,mongoDB 操作語法原生就是 javascript,寫起來很親切。
這個 javascript 檔 主要做兩件事:
轉換:讀取 database 的 TWD97 座標 然後轉換成 WGS84 座標
更新:然後把 WGS84 座標丟回 database,更新coordinates 這個欄位
- 整個轉換過程中,最重要的就是轉換函數了 。感謝 Kuro 還有之前編寫此函數的大大們!
- terminal 執行下方 javascript 程式碼
mongo theCode.js
mongo theCode.js
一些特別要注意的重點。複習一下 MongoDB operator 重要觀念。
$set
operator 只更新特定 filed 不會覆蓋掉其他的 ; dot notation 讓可讀性變好,多善用。- _id 不能只傳 string , 要用 ObjectId 包起來
- 座標的格式(注意 Lon , Lat 經緯度順序,跟 google map 或其他常用 api 順序相反):
type: Point , coordinates: [ Lon, Lat ]
- Mongo shell 讀懂 ES6 語法,平常怎麼寫 js 這邊也就怎麼寫不用擔心。不過 console.log 不能使用,mongo shell 使用的是 print() ; printjson() 這兩個方法。
全臺灣車站分佈圖
轉換後,用 MongoDB Compass 看一下資料狀況。
- 當資料格式是:type: Point , coordinates: [ Lon, Lat ] 順序是 [ 經,緯 ]( WGS84)這樣形式的時候,MongoDB Compass 的 Schema 視窗下,會用地圖方式顯示每筆資料地理位置,可以用圓面積選取的方式多筆 query。在 Schema 視窗 ,拖拉出同心圓做選擇(不知能否改用矩形區域做圈選,待研究)。
圈選後的每筆資料