好讀: http://blog.nutsfactory.net/?p=3546

去年在 [OpenStreetMap Taiwan Webinar][1]
的題目[「自己的圖磚自己刻」][2]之後,注意到其實從頭到尾創建一個圖磚伺服器,要安裝、設定的軟體相當多,要[設定資料庫、匯入海岸線
Shp、安裝 mapnik 相關的軟體、寫好 style sheet 等][3]。為了簡化所有的程序,方便入門 2015 年已經先[以
Docker 
建立初版圖磚伺服器][4],這個伺服器將資料庫建立、匯入、軟體安裝等等合而為一,入門開發者只要三十分鐘內就可以配置好一個伺服器開始嘗試開發。就算不是
Linux 的開發者,也可以透過 [Docker Machine][5] 或其他虛擬機方式設定 docker 開發環境。

不過由於當初把所有的軟體擺在同一個映象檔 (docker image) 中,導致不容易抽出再做延伸的利用開發。
從「自己的圖磚自己刻」講者吳政璋 (小璋丸)的[筆記][6]中,可以初步理解要完成一個圖磚 (slippy map) 伺服器所需要的軟體堆疊
(Software stack) 大概可分為編輯後的原始資料、後台資料庫、繪圖輸出 (rendering) 以及前端視覺。

http://wiki.openstreetmap.org/w/images/1/15/OSM_Components.png

最近嘗試進一步的改善 Docker images 的實踐方式,將每個軟體元件拆分成獨立的 image,以便互相疊加應用。由於 Open
Source geospatial software 的發展迅速,迭代頻繁,在過渡時期,偶爾會發現新版的函式庫的 Python
binding 已經故障,反而是 node.js 的延伸開發迅速,反之新的技術實踐無法搭配舊伺服器使用。透過 Docker
技術可以很快的「解決」這些軟體版本的相依問題,直接搭配正確的 Linux Distro
版本使用,方便一個軟體服務同時使用新舊科技。希望可以陸續把 [Linux 上][10] 上常用 [Open Source
geospatial software][9] 也整理出來,方便進階開發者使用。

目前已經完成 [PostGIS][14], osm2pgsql, mapnik, mod_tile, tilestache, gdal
以及幾個常見的 featured tiles. Docker images 都已經發布到 Docker Hub 上的
[OpenStreetMap Taiwan 群組][7]中,原始碼發布於 [Github Group][8]中,歡迎試用。

以下分享一些入門的實踐典範,可以供一般 GIS 從業人員或軟體開發者簡便利用開放街圖資料。

首先,對於一般 GIS 資料處理人員,利用 OSM 最初步的工作就是建立一個 Database Replication. 設定 OSM
資料庫並與最新的資料保持同步,並接取到桌面的軟體上進行處理。首先,你需要 PostgreSQl/PostGIS 與 osm2pgsql,其中
osm2pgsql 已經設計成每個十分鐘會抓取一次最新的資料,並匯入資料庫中。

操作的指令可以參考 [osmtw/osm2pgsql 的說明][11],基本上只需要兩個指令

以環境參數設定資料庫名稱、帳號、密碼後,啟動 osmtw/postgis instance
以 link 參數連結 postgis/osm2pgsql,並以環境帶入想要匯入匯入的區域與更新頻率。

osmtw/osm2pgsql 會負責下載最新的 OSM PBF 檔案,並匯入 osmtw/postgis
資料庫。大概只要十分鐘內,就可以建立好包含最新台灣圖的資料庫,並可以透過 [qgis][12] 連上進行查詢,並做後續處理。

http://blog.nutsfactory.net/wp-content/uploads/2016/06/2016-05-22-153637-%E7%9A%84%E8%9E%A2%E5%B9%95%E6%93%B7%E5%9C%96.png

有了資料庫之後,接下來是做出 [Slippy Map][20] Server,線上即時產生圖磚。從這裡開始,就可以像是疊積木一樣,依照需求配合不同的軟體來搭建。
常見的組合有有 [Mapnik][13]/Cascadenik/Carto/Millstone 搭配圖磚處理服器如
mod_tile/Tilestache 輸出成 Raster Image,或是直接以 Mapnik API 輸出成圖。網站伺服器則可以用
nginx/apache2.

透過 Docker Compose 可以很容易的組成所需的軟體結構。依照 OpenStreetMap 標準的圖磚為例子,包含傳統使用
[Mapnik xml style][15], Cascadenik XML 的 OpenStreetMap 標準圖磚,以及使用
[Carto CSS style][16] 相當簡潔漂亮的 [Mapbox OSM-Bright][17]。前端界面則配合
[LeafletJS][22] 做出使用者界面,方便切換幾個不同的底圖。網站服務器則用 mod_tile+apache2.
相關的程式碼與操作請見 [github][21] 。

http://blog.nutsfactory.net/wp-content/uploads/2016/06/%E6%9C%AC%E5%9C%B0%E8%A1%97%E5%9C%96.png
http://blog.nutsfactory.net/wp-content/uploads/2016/06/osm-bright.png

另外一個[例子][24]則是小璋丸手刻自創的[鬼島地圖][25],他使用 Cascadenik 語法產生樣式,並以
[tilestache][23] 產圖以及 uwsgi 作為網站伺服器。

http://blog.nutsfactory.net/wp-content/uploads/2016/06/%E9%AC%BC%E5%B3%B6%E5%9C%96%E7%A3%9A-1.png
http://blog.nutsfactory.net/wp-content/uploads/2016/06/%E9%AC%BC%E5%B3%B6%E5%9C%96%E7%A3%9A-2.png

這幾個樣式大多是僅透過 SQL 取出 PostGIS 中的圖徵,然後配上 stylesheet
產出。有時候會需要做一些資料的前製處理後,才能搭配輸出到圖中。例如等高線圖與地勢圖,就可以從 DEM 資料中計算得出,這個時候可以用
[gdal][26] 等工具將原始資料轉成 TIF 或是 SQL,再套疊到地圖上,這樣就可以做出地勢顏色與等高線圖等效果。

http://blog.nutsfactory.net/wp-content/uploads/2016/06/2016-06-10-14-20-37-%E7%9A%84%E8%9E%A2%E5%B9%95%E6%93%B7%E5%9C%96-1.png
http://blog.nutsfactory.net/wp-content/uploads/2016/06/2016-06-10-14-20-48-%E7%9A%84%E8%9E%A2%E5%B9%95%E6%93%B7%E5%9C%96-1.png
http://blog.nutsfactory.net/wp-content/uploads/2016/06/20160609-%E6%9C%AC%E5%9C%B0%E8%A1%97%E5%9C%96.png

最後,光是做出 Slippy Map / Raster Image 其實是很空洞的平面地圖,許多地圖的使用者往往希望可以取得特定 POI
的詳細資料。這個時候就需要搭配向量圖磚來豐富地圖上的資訊量,雖然像是 [Mapzen][27], [Mapbox][28]
商業公司已經提供現場的接口可用,但是常常比不上自己下 SQL 語法來的有彈性。

我們可以透過 OpenStreetMap 圖資與 [TileStache][23] 來輸出支援
[GeoJSON][29]、[TopoJSON][30]、[MapBox Vector (MVT)][31] 等格式。請參考[飲水地圖
vector tile server][32] 的實做方式,從資料庫中搜尋 amenity='drinking_water' 的 POI
,並以 [LeaftletJS][33] 將資料繪製到地圖上。由於他使用本地資料庫,所以會比[飲水地圖官方網站][34]透過
overpass 撈取資料快速許多。

http://blog.nutsfactory.net/wp-content/uploads/2016/06/Leaflet-GeoJSON-Example.png

[1]: https://osmtw.hackpad.com/Webinar-%E8%AD%B0%E9%A1%8C-7CeqMWj48AG
"Webinar 議題 - osmtw.hackpad.com"
[2]: https://www.youtube.com/watch?v=Dk9BinTghDw "OpenStreetMap Taiwan
Webinar - 自己的圖磚自己刻 - YouTube"
[3]: https://drive.google.com/file/d/0B8yzK2GdMzgqZlByeVF1ZUplMjg/view
"自己的圖磚自己刻.pdf - Google Drive"
[4]: 
https://osmtw.hackpad.com/%E8%87%AA%E5%B7%B1%E7%9A%84%E5%9C%96%E7%A3%9A%E8%87%AA%E5%B7%B1%E5%88%BB-docker-%E5%A4%A7%E6%B3%95-2y0btHcBwhI
"自己的圖磚自己刻 docker 大法"
[5]: https://docs.docker.com/machine/ "Docker Machine"
[6]: http://wiki.openstreetmap.org/wiki/Zh-hant:Develop
"Zh-hant:Develop - OpenStreetMap Wiki"
[7]: https://hub.docker.com/u/osmtw/ "OSM Taiwan docker images"
[8]: https://github.com/OsmHackTW?utf8=%E2%9C%93&query=docker
"OpenStreetMap Hacks in Taiwan"
[9]: http://www.osgeo.org/ "OSGeo.org | Your Open Source Compass"
[10]: https://wiki.debian.org/DebianGis "DebianGis - Debian Wiki"
[11]: https://hub.docker.com/r/osmtw/osm2pgsql/ "osm2pgsql usage"
[12]: http://www.qgis.org/en/site/ "Welcome to the QGIS project!"
[13]: http://wiki.openstreetmap.org/wiki/Mapnik "Mapnik - OpenStreetMap Wiki"
[14]: http://postgis.net/ "PostGIS — Spatial and Geographic Objects
for PostgreSQL"
[15]: http://wiki.openstreetmap.org/wiki/Mapnik_Example "Mapnik
Example - OpenStreetMap Wiki"
[16]: https://www.mapbox.com/tilemill/docs/manual/carto/ "CartoCSS | Mapbox"
[17]: https://github.com/mapbox/osm-bright "mapbox/osm-bright: A Carto
template for OpenStreetMap data"
[18]: https://github.com/OsmHackTW/osm-tiles-docker
"OsmHackTW/osm-tiles-docker: OSM styles tiles"
[19]: https://docs.docker.com/compose/ "Docker Compose"
[20]: http://wiki.openstreetmap.org/wiki/Slippy_Map "Slippy Map -
OpenStreetMap Wiki"
[21]: https://github.com/OsmHackTW/osm-tiles-docker
"OsmHackTW/osm-tiles-docker: OSM styles tiles"
[22]: http://leafletjs.com/ "Leaflet - a JavaScript library for
interactive maps"
[23]: http://tilestache.org/ "TileStache"
[24]: https://github.com/OsmHackTW/gdtile-docker
"OsmHackTW/gdtile-docker: docker for 鬼島圖磚"
[25]: https://github.com/OsmHackTW/gdtile "OsmHackTW/gdtile: 鬼島圖磚服務"
[26]: https://github.com/OsmHackTW/gdal-docker "OsmHackTW/gdal-docker"
[27]: https://mapzen.com/projects/vector-tiles/ "Vector Tile Service · Mapzen"
[28]: https://www.mapbox.com/vector-tiles/ "Vector Tiles | Mapbox"
[29]: http://geojson.org/ "GeoJSON"
[30]: https://github.com/mbostock/topojson/wiki "topojson"
[31]: https://github.com/mapbox/vector-tile-spec "Mapbox Vector Tile
specification"
[32]: https://github.com/OsmHackTW/drinking-vector-tile-docker "飲水地圖
vector tile server "
[33]: https://github.com/glenrobertson/leaflet-tilelayer-geojson
"Leaflet TileLayer for GeoJSON tiles "
[34]: http://drinking.teia.tw/ "飲水地圖"
_______________________________________________
Talk-TW mailing list
Talk-TW@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-tw

Reply via email to