跳至主要内容

編寫地圖樣式定義及使用 MapLibre GL JS 渲染地圖

· 閱讀時間約 3 分鐘
Ivan Tsai
Backend engineer

上一篇文章中,我們建立了 Tiles Server,這篇文章是本系列的最後一篇,會把 MVT 的結果在網頁上繪製成地圖。

前置準備事項​

  1. 我們需要能提供 MVT 的 API Server,您可以自行建立,或是按照上一篇文章的指示來下載並部屬範例專案。
  2. Maputnik,我們要使用它來編輯樣式,您可以參考官網來安裝,若您部屬好範例專案,它已經包含在其中,您可以開啟http://localhost:8888/查看它。

加入 Data Source​

有了地圖資料之後,我們需要來撰寫樣式,有點像是 CSS,來告訴客戶端該怎麼繪製這些資料。 請開啟 Maputnik http://localhost:8888/,選擇 Open > Empty Style,我們從頭開始製作~ 接著,選則 Data Source,加入 Vector (XYZ URLs),Tile URL 請輸入 http://localhost:3000/api/tiles/{z}/{x}/{y}.mvt (或是您自定義的 API Endpoint)。

加入海洋圖層​

我們先來繪製海洋,按下 Add Layer,ID = sea,Type = Fill,Source = 剛剛建立的 Source,Source Layer = Water。 您可以改變 Paint properties 中的 Color 來讓海洋填充不同顏色,繪製好海洋後,您應該就可以看到陸地的輪廓了(也就是沒有被上色的那些區域)。

加入行政區域​

按照相同方式,您可以加入行政區域 ID = boundary, Type = Line,Source = 剛剛建立的 Source,Source Layer = boundary。

接著我們把城市名稱也繪製上去,因為要繪製中文的關係,我們需要支援的字形,請按下 Style Settings,設定 Glyphs URL 為 http://fonts.openmaptiles.org/{fontstack}/{range}.pbf

加入新的 Layer,ID = boundary_names, Type = Symbol ,Source = 剛剛建立的 Source,Source Layer = boundary。並把 Field 設定為 {name} 這是我們 Tile Serevr 提供的資訊,Font 設定為 Klokantech Noto Sans CJK Regular。

加入道路​

最後我們來加入道路,道路的 Layer 為 road,加入的方式和行政區域很像,您可以按照道路等級(我們把等級資訊放在 category 欄位)繪製不同顏色的地圖,也可以標註上道路名稱。

您應該可以得到像這樣的結果!

您也可以在這裡下載我做的範例,直接 Import 到 Maputnik 中。

利用 MapLibre GL JS 在網頁上繪製地圖​

MapLibre GL JS可以根據我們定義的 Style 來在網頁上繪製地圖,您也可以使用不同的 Renderer 在其他裝置像是 iOS, Android 等等繪製地圖,相同的 Style 定義可以用在所有地方。

您可以直接打開範例專案中的 demo.html 來查看結果。

Mapbox vs MapLibre​

其實很多標準和工具程式原本都是由 Mapbox 定義和提供的,但他們在幾年前決定修改原本開源專案的授權條款,現在使用 Mapbox libraries 是需要 Token 的,社群於是 Fork 一個版本(還是開源的版本)出來,才形成現在的 Maplibre。


有關地圖繪製的文章到這邊到一段落了,謝謝你的閱讀,有任何問題請聯絡我😊