實作口罩地圖後記與心得,開發口罩地圖並沒有想像中的簡單

口罩地圖截圖
口罩地圖截圖

武漢肺炎日漸嚴重,台灣也出現了搶口罩的風潮(不是已經很久了嗎),而自從政府開始實施口罩配給後,哪個藥局還有庫存成了眾人最關心的議題。所以,為了測試自己的程度,加入了製作口罩地圖的行列中!

在此也要特別感謝 kiang 江明宗先生將藥局資料以及即時的口罩庫存做成 geoJSON 檔案提供,省去了不少處理資料的麻煩。

資料修正

不過政府對某些藥局的經緯度資料上有誤差,所以我自己也做了不少的修正。以下提供我重新在 Google Map 上查詢到的經緯度修正,若你在使用地圖時有遇到藥局座標錯誤,歡迎在下方留言板告訴我喔

醫事機構代碼 醫事機構名稱 經度 , 緯度
5931033130 永利藥局 121.517612 , 25.006090
5931033176 緣來藥師藥局 121.518552 , 25.007578
5931101455 日揚藥局 121.461145 , 25.136232
5931100092 上全藥局 121.461358 , 25.136273

這次採用 Leaflet 的 JavaScript 程式庫來顯示地圖,也因為是第一次使用 Leaflet,開發時 也遇到許多阻礙呢。使用前因為沒有把 Leaflet 的文件完全看完,我也不知道 Leaflet 有提供 geoJSON function 可用,所以我傻傻的寫了個迴圈來逐一加點,而且事後才發現原來有 geoJSON 可以用。

Marker 顏色辨別

不過現在想想也沒關係,因為是自己用迴圈來拆解資料並逐一加入 marker,所以對於每筆資料的條件判斷靈活性更高,可以達成逐一判別該 marker 應該用什麼樣子的 icon 來顯示。這也是為什麼在我的口罩地圖中可以用顏色來分辨該藥局的口罩存量比例有多少。

在選擇顏色的時候我採用好想工作室的顏色分類,我想他們的顏色分類是最能分辨庫存數量的。

Marker Cluster

原本以為這樣做就 OK 了,結果沒想到 Leaflet 的 marker 是利用一個 DOM element 進行繪製的,意味著全台可供購買的藥局一共有 6583 間,所以就有快六千個 DOM element,而這六千個瀏覽器都要進行繪製,對於瀏覽器的負荷太高了,連電腦的瀏覽器都有效能上的問題更何況手機的瀏覽器。

為了解決這個問題我採用 Leaflet 一個 plugin 叫做 marker cluster。marker cluster 可以有效的將附近的 marker 組合成一個 marker,其中間的數字是用來表示該群組有幾個 marker,而原先有將這個數字顯示出來,不過後來考慮到會跟口罩的數量起衝突(讓使用者以為有多少口罩在那裡)所以將他取消了。

Marker Cluster 開發時為了讓你能快速分辨該 Cluster 的口罩庫存狀況,採用了收納 Marker 時順便抓取庫存狀態最高的作為該 Cluster 的顏色顯示。最後利用不透明度來將庫存高的 Cluster 強調出來(實際上是將存量低的不透明度設低)。

每 30 秒自動更新

每 30 秒自動更新也是頭痛的部分之一,因為每個 marker 的 popup 內容並不是以 DOM element 方式儲存的,而是儲存在變數內,當使用者點擊 marker 時才會將內容加入頁面中。所以自動更新時也花了不少的時間在了解 Leaflet Marker Cluster 儲存資料的方式,慶幸的是,取用 popup 內容時是以資料型態為 DOM 的格式儲存,所以可以用 JavaScript 原生的方式存取該資料。

距離

不知道有沒有人注意到每個藥局名稱旁都有顯示與目前位置的距離。開發時,尋找距離公式時簡單,可是當將其寫成程式碼時又有遇到單位上的問題,所幸最後一一排除做出了理想的結果。

一鍵切換成人、兒童口罩

因為有了自動更新取得儲存資料的經驗後,做切換 marker icon 的時候就順多了。直接取得 popup 內容裡成人口罩、兒童口罩的數量並且依照比例算出落在哪個區間,再用 Leaflet 的 setIcon 轉換 icon 就達成目的了。

不過,偶然間看到資料更新時藥局資料內的背景、marker 有正確轉換,而 marker cluster 卻沒有跟著轉換。此時才意識到忘記於更新資料的程式碼裡加入 markers.refreshClusters(),與此同時才意識到測試沒做完全。

更多功能

若你覺得口罩地圖還可以加入甚麼功能,歡迎下方留言板告訴我喔!

  • 搜尋功能我目前有在考慮該不該做。

熱門文章

《Minecraft》快捷鍵一覽表

《Minecraft》快捷鍵一覽表

鍵盤 嗨!歡迎造訪我的部落格。良好的運用快捷鍵可以讓一件事在短時間內完成,如:整理箱子,而當箱子內的物品不是擺放整齊的單個拿出又太花時間導致你不想整理?或是對箱子的整潔有強迫症每次都會整理卻找不到比較…
前往閱讀 前往閱讀右箭頭
《Pokémon Go》3 個途徑取得神奧之石

《Pokémon Go》3 個途徑取得神奧之石

神奧之石(Sinnoh Stone,又稱神奧石)是 Pokémon Go 的寶可夢進化道具。許多第四代寶可夢都需要用到神奧石才能獲得。神奧石稀有,獲得途徑也有限,遊戲中目前一共有三個途徑。
前往閱讀 前往閱讀右箭頭
《原神 & 崩壞:星穹鐵道》國際服最新的兌換碼、前瞻兌換碼

《原神 & 崩壞:星穹鐵道》國際服最新的兌換碼、前瞻兌換碼

4.6 前瞻節目 為了方便兌換,下方的兌換碼都可以點擊。點擊後會導向原神官方的兌換碼網頁,並自動填入兌換碼。只需要登入就可以直接兌換,不僅省去輸入兌換碼的時間,也不會出錯。
前往閱讀 前往閱讀右箭頭
《特戰英豪 Valorant》預設快捷鍵

《特戰英豪 Valorant》預設快捷鍵

特戰英豪 特戰英豪是我第一個接觸的射擊競技遊戲,因為我本身對於射擊遊戲非常不上手,瞄準、發射、槍的後座力、等等的影響精準度的變數實在太多。雖然我覺得特戰英豪的鍵位提示、說明、指示、等等做的很清楚,但還…
前往閱讀 前往閱讀右箭頭
《原神》楓丹七天神像升級需要的水神瞳數量表

《原神》楓丹七天神像升級需要的水神瞳數量表

楓丹廷 / Source: Fandom 楓丹是原神旅行者第五個拜訪的國家,是水的國度,第一個潛水的玩法也在這裡開始。供奉楓丹的七天神像需要一定數量的水神瞳才能供奉至滿級,也就是 10 級。這裡將統整…
前往閱讀 前往閱讀右箭頭
7 個能輕鬆找到理想 Minecraft Skin 的網站

7 個能輕鬆找到理想 Minecraft Skin 的網站

忍者外觀 / pxfuel Minecraft(麥塊、當個創世神、我的世界)是一個可以自訂外觀(skin、皮膚)的遊戲。Minecraft 外觀千百萬種,由許多玩家協力製作出數量如此龐大的外觀,想在其…
前往閱讀 前往閱讀右箭頭
《原神》須彌七天神像升級所需的草神瞳數量一覽表

《原神》須彌七天神像升級所需的草神瞳數量一覽表

蘭那羅:蘭那庫拉 有需要須彌所有草神瞳的位置可以參考原神官方的提瓦特互動地圖,可從 HoYoLAB 進入。目前完整蒐集完會是 10 級神像和 1 個草神瞳(一共 271 顆草神瞳)。
前往閱讀 前往閱讀右箭頭
《刀劍亂舞》全刀種鍛刀時間以及鍛刀配方

《刀劍亂舞》全刀種鍛刀時間以及鍛刀配方

山姥切国広 孫六兼元期間限定鍛刀開跑中。刀劍亂舞九周年!有一組 兌換碼 可以使用。 刀劍亂舞中,鍛刀的時間與投入的資源、最終成品是有關係的: 投入的資源愈多,鍛刀的時間愈長(純屬趨勢並非絕對) 鍛刀時間愈長,成…
前往閱讀 前往閱讀右箭頭
如何進化《Pokémon Go》伽勒爾型態的哭哭面具至死神板

如何進化《Pokémon Go》伽勒爾型態的哭哭面具至死神板

Ghost 562 哭哭面具 デスマス Yamask 《Pokémon 劍/盾》為寶可夢的世界帶來第八代新的寶可夢,當然也連帶影響 Pokémon Go 的遊戲內容。伽勒爾地區是《Pokémon 劍/盾》的主…
前往閱讀 前往閱讀右箭頭