去年在 OpenStreetMap Taiwan Webinar 的題目「自己的圖磚自己刻」之後,注意到其實從頭到尾創建一個圖磚伺服器,要安裝、設定的軟體相當多,要設定資料庫、匯入海岸線 Shp、安裝 mapnik 相關的軟體、寫好 style sheet 等。為了簡化所有的程序,方便入門 2015 年已經先以 Docker 建立初版圖磚伺服器,這個伺服器將資料庫建立、匯入、軟體安裝等等合而為一,入門開發者只要三十分鐘內就可以配置好一個伺服器開始嘗試開發。就算不是 Linux 的開發者,也可以透過 Docker Machine 或其他虛擬機方式設定 docker 開發環境。
不過由於當初把所有的軟體擺在同一個映象檔 (docker image) 中,導致不容易抽出再做延伸的利用開發。 從「自己的圖磚自己刻」講者吳政璋 (小璋丸)的筆記中,可以初步理解要完成一個圖磚 (slippy map) 伺服器所需要的軟體堆疊 (Software stack) 大概可分為編輯後的原始資料、後台資料庫、繪圖輸出 (rendering) 以及前端視覺。
![](https://i0.wp.com/wiki.openstreetmap.org/w/images/1/15/OSM_Components.png?resize=670%2C476)
最近嘗試進一步的改善 Docker images 的實踐方式,將每個軟體元件拆分成獨立的 image,以便互相疊加應用。由於 Open Source geospatial software 的發展迅速,迭代頻繁,在過渡時期,偶爾會發現新版的函式庫的 Python binding 已經故障,反而是 node.js 的延伸開發迅速,反之新的技術實踐無法搭配舊伺服器使用。透過 Docker 技術可以很快的「解決」這些軟體版本的相依問題,直接搭配正確的 Linux Distro 版本使用,方便一個軟體服務同時使用新舊科技。希望可以陸續把 Linux 上 常用 Open Source geospatial software 也整理出來,方便進階開發者使用。
目前已經完成 PostGIS, osm2pgsql, mapnik, mod_tile, tilestache, gdal 以及幾個常見的 featured tiles. Docker images 都已經發布到 Docker Hub 上的 OpenStreetMap Taiwan 群組中,原始碼發布於 Github Group中,歡迎試用。
以下分享一些入門的實踐典範,可以供一般 GIS 從業人員或軟體開發者簡便利用開放街圖資料。
首先,對於一般 GIS 資料處理人員,利用 OSM 最初步的工作就是建立一個 Database Replication. 設定 OSM 資料庫並與最新的資料保持同步,並接取到桌面的軟體上進行處理。首先,你需要 PostgreSQl/PostGIS 與 osm2pgsql,其中 osm2pgsql 已經設計成每個十分鐘會抓取一次最新的資料,並匯入資料庫中。
操作的指令可以參考 osmtw/osm2pgsql 的說明,基本上只需要兩個指令
- 以環境參數設定資料庫名稱、帳號、密碼後,啟動 osmtw/postgis instance
- 以 link 參數連結 postgis/osm2pgsql,並以環境帶入想要匯入匯入的區域與更新頻率。
osmtw/osm2pgsql 會負責下載最新的 OSM PBF 檔案,並匯入 osmtw/postgis 資料庫。大概只要十分鐘內,就可以建立好包含最新台灣圖的資料庫,並可以透過 qgis 連上進行查詢,並做後續處理。
![qgis connect to docker](https://i0.wp.com/blog.nutsfactory.net/wp-content/uploads/2016/06/2016-05-22-152800-的螢幕擷圖.png?resize=300%2C151)
![QGIS](https://i1.wp.com/blog.nutsfactory.net/wp-content/uploads/2016/06/2016-05-22-153637-的螢幕擷圖.png?resize=239%2C300)
有了資料庫之後,接下來是做出 Slippy Map Server,線上即時產生圖磚。從這裡開始,就可以像是疊積木一樣,依照需求配合不同的軟體來搭建。
常見的組合有有 Mapnik/Cascadenik/Carto/Millstone 搭配圖磚處理服器如 mod_tile/Tilestache 輸出成 Raster Image,或是直接以 Mapnik API 輸出成圖。網站伺服器則可以用 nginx/apache2.
透過 Docker Compose 可以很容易的組成所需的軟體結構。依照 OpenStreetMap 標準的圖磚為例子,包含傳統使用 Mapnik xml style, Cascadenik XML 的 OpenStreetMap 標準圖磚,以及使用 Carto CSS style 相當簡潔漂亮的 Mapbox OSM-Bright。前端界面則配合 LeafletJS 做出使用者界面,方便切換幾個不同的底圖。網站服務器則用 mod_tile+apache2. 相關的程式碼與操作請見 github 。
![本地街圖](https://i2.wp.com/blog.nutsfactory.net/wp-content/uploads/2016/06/本地街圖.png?resize=300%2C240)
![osm-bright](https://i2.wp.com/blog.nutsfactory.net/wp-content/uploads/2016/06/osm-bright.png?resize=300%2C240)
另外一個例子則是小璋丸手刻自創的鬼島地圖,他使用 Cascadenik 語法產生樣式,並以 tilestache 產圖以及 uwsgi 作為網站伺服器。
![鬼島圖磚-1](https://i0.wp.com/blog.nutsfactory.net/wp-content/uploads/2016/06/鬼島圖磚-1.png?resize=300%2C300)
![鬼島圖磚-2](https://i2.wp.com/blog.nutsfactory.net/wp-content/uploads/2016/06/鬼島圖磚-2.png?resize=300%2C300)
這幾個樣式大多是僅透過 SQL 取出 PostGIS 中的圖徵,然後配上 stylesheet 產出。有時候會需要做一些資料的前製處理後,才能搭配輸出到圖中。例如等高線圖與地勢圖,就可以從 DEM 資料中計算得出,這個時候可以用 gdal 等工具將原始資料轉成 TIF 或是 SQL,再套疊到地圖上,這樣就可以做出地勢顏色與等高線圖等效果。
![2016-06-10 14-20-48 的螢幕擷圖](https://i0.wp.com/blog.nutsfactory.net/wp-content/uploads/2016/06/2016-06-10-14-20-48-的螢幕擷圖.png?resize=237%2C300)
![20160609-本地街圖](https://i2.wp.com/blog.nutsfactory.net/wp-content/uploads/2016/06/20160609-本地街圖.png?resize=300%2C225)
最後,光是做出 Slippy Map / Raster Image 其實是很空洞的平面地圖,許多地圖的使用者往往希望可以取得特定 POI 的詳細資料。這個時候就需要搭配向量圖磚來豐富地圖上的資訊量,雖然像是 Mapzen, Mapbox 商業公司已經提供現成的接口可用,但是常常比不上自己下 SQL 語法來的有彈性。
我們可以透過 OpenStreetMap 圖資與 TileStache 來輸出支援 GeoJSON、TopoJSON、MapBox Vector (MVT) 等格式。請參考飲水地圖 vector tile server 的實做方式,從資料庫中搜尋 amenity=’drinking_water’ 的 POI ,並以 LeaftletJS 將資料繪製到地圖上。由於他使用本地資料庫,所以會比飲水地圖官方網站透過 overpass 撈取資料快速許多。
![Leaflet GeoJSON Example](https://i0.wp.com/blog.nutsfactory.net/wp-content/uploads/2016/06/Leaflet-GeoJSON-Example-300x225.png?resize=300%2C225)