iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
SideProject30

製作適用於網頁的台灣登山地圖系列 第 13

[Day13] 開始動手做圖磚 - 以縮放層級篩選資料

  • 分享至 

  • xImage
  •  

昨天簡單的示範使用 tilemaker,將資料處理邏輯撰寫於 process.lua 內,讓 OSM 中的「山頂」資料 natural=peak 以及「三角點」資料 survey_point=* 可以被寫入向量圖磚中:

...

-- Assign nodes to a layer, and set attributes, based on OSM tags
function node_function(node)
  local natural = node:Find("natural")
  local survey_point = node:Find("survey_point")
  if natural == "peak" or natural == "volcano" or survey_point ~= "" then
    node:Layer("peak", false)
    if node:Holds("natural") then node:Attribute("natural", natural) end
    if survey_piont ~= "" then node:Attribute("survey_point", survey_point) end
    return
  end
end

...

另外我們也在 config.json 內指定 peak Layer 只會出現在 z10 到 z14 之間:

"layers": {
  "peak":    { "minzoom": 10, "maxzoom": 14 }
},

為了讓大家有點概念,每個縮放層級的目錄大概是這樣的:

z6 大約是台灣及其週邊海域的大小
z6

z8 大約是北台灣的大小
z8

z10 大約是臺北市的大小
z10

z12 大約是陽明山區的大小
z12

可以知道,從 z10 開始就將所有山頂放入圖磚不算是個好主意,因為在渲染時並不會用到全部的資料(否則畫面會太擁擠)。

因此,若我們希望從 z10 層級依序展示不同的山頂/三角點資料,會需要有一套邏輯,能夠篩選重要的物件到較低縮放層級的圖磚中。

撰寫相關邏輯

根據 tilemaker 的相關文件,我們可以使用 Lua Function 來設定物件會被放在哪個縮放層級:

-- 設定 node 物件在多少的縮放層級才會被寫入圖磚
node:MinZoom(zoom)

再來,我們在 Day9 中也有提到:三角點是有分等級的。我們可以使用 survey_point=trig_1ndsurvey_point=trig_2nd 來篩選比較重要的一等/二等三角點,因此,可以把 Lua 檔案中的 node_function 寫成這樣:

function node_function(node)
  local survey_point = node:Find("survey_point")
  if survey_point ~= "" then
    node:Layer("peak", false)
    node:Attribute("survey_point", survey_point)
    if survey_point == "trig_1st" then
      node:MinZoom(10)
    elseif survey_point == "trig_2nd" then
      node:MinZoom(11)
    else
      node:MinZoom(12)
    end
    return
  end
end

由於 natural=peak 並不分級,我們暫時把這些山頂拿掉。

可以看到程式碼中,一等三角點從 z10 開始出現,二等三角點從 z11 開始出現,所有三角點則會從 z12 開始出現。

接著,再執行 tilemaker 產生圖磚即可:

tilemaker --input taiwan-latest.osm.pbf \ 
          --output output/ \
          --config config.json \
          --precess process.lua

篩選的結果

以 OSM 底圖作比較,可以看出向量圖磚的資料分布:

z10 中,只出現一等三角點:
trig_1st in z10

z11 中,出現了一些二等三角點:
trig_2nd in z11

z13 中,出現了所有三角點:
trig in z12

OSM 底圖使用三角形來表示山峰。由於不是每個山峰上都會有三角點,因此我們可以看到圖中有數個山峰上沒有代表三角點紅點。

小結

使用這樣的技巧,我們可以為 MVT 格式的向量圖磚進行設定,在同一 Layer 中,不同縮放層級可以具有不同數量的 Feature。這樣一來不僅可以減少圖磚大小,渲染後的結果也能讓畫面比較清爽。相關程式可見 Github

今天展示用的 Web Map 使用了 OSM 作為底圖,並沒有提到實作細節。在 Mapblire 中如何撰寫相關的 Style 就留到明天再說。


上一篇
[Day12] 開始動手做圖磚
下一篇
[Day14] 定義地圖樣式-Maplibre Style
系列文
製作適用於網頁的台灣登山地圖25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言