使用 MongoDB 轉換座標格式

使用 MongoDB 轉換座標格式

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 這個欄位

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 視窗 ,拖拉出同心圓做選擇(不知能否改用矩形區域做圈選,待研究)。

圈選後的每筆資料