把旅行記憶裝進App,我的國家公園打卡App開發故事:怎麼辦?我的APP不知道我在哪裡!
國家公園打卡App必須透過使用者GPS座標,辨認使用者是否在國家公園內。
看似可用肉眼判斷,然而對電腦來說⋯⋯沒那麼簡單!
原以為MapBox或是iOS會有現有的工具,結果沒有!只好自己來動手解決⋯
圓心法:我的第一個想法是以公園中心為圓心,畫一個圓形範圍,只要使用者的座標落在這個圓形範圍內,就能打卡。這個想法簡單直接,只要計算使用者座標和公園中心的距離,如果距離在一定的範圍內,就讓使用者打卡。然而,這個方法忽略了國家公園邊界是不規則的形狀,並非完美的圓形,有些公園甚至分布於幾個分離的區域,也因此,這個方法完全不行⋯
對角法:把公園的邊界畫成一個長方形,只需要紀錄長方形的對角座標(最右上和最左下的座標)就好了,這個方法相對簡單。但是同樣有不夠精確的問題,畢竟不是所有國家公園的邊界都能完美被一個長方形覆蓋。
射線投射法:最後,我考慮了一種更精確的方法——從使用者的座標向東畫出一條無限長的線,計算這條線與公園邊界的交點數量。
- 若無交點,則使用者不在公園內。
- 若有一個交點,則在公園內。
- 若有兩個交點,則不在公園內。
- 但是,如果這條線剛好經過多邊形的頂點或是邊線,代表使用者不在公園內。
這個方法相較前兩個方法準確,但它需要儲存大量的座標數據來精確描繪公園邊界。
經過一番思考(好吧,實話實說,可能更多是因為我不太想蒐集和整理那麼多複雜的邊界資料),我最後選擇了「對角法」,雖然它的精確度不如射線法,但是在實際應用中能夠滿足需求。畢竟,這是一款旨在紀錄旅行記憶的App,不需要過於苛求絕對精確。為了盡可能覆蓋整個公園區域,我將長方形的範圍設計得比較大,這樣即使不完全精確,也不至於有人會遇到在國家公園內無法打卡的窘境。
另外,這是一個經典的圖形學問題:多邊形內的點、PIP(Point in Polygon),除了射線投射法(Ray Casting)還有一種叫做「迴轉數」(Winding number)的算法,雖然較為複雜,但也值得一提,理論上是比較準確,感興趣的朋友可以進一步探索和研究。
在開發App的過程,我經常面臨各種選擇與取捨。你有過類似的經驗嗎?分享一下你是怎麼做決定的吧!
Member discussion