開發日誌 / RideMeter-Simple GPS Computer
RideMeter 開發日誌:從騎行需求到簡單 GPS 碼表
從折疊車出遊到手機騎行碼表,聊聊 RideMeter 的停車停錶、巡航記錄、MapKit 選擇與地圖坐標轉換。
這是我接觸 vibe-coding 後,試手做的第一款 iOS 產品。在此之前的編程已經是環游中國前的事情了,距今有一年多,所以當時集中在工作需要的領域,平台多為Chrome 油猴腳本和 Chrome 插件。
甚麼是油猴腳本?
油猴腳本是一種運行在瀏覽器里的小程序,可以對現有網頁進行修改或增強。它有點像瀏覽器插件,但通常更輕量,一個腳本往往只解決一個具體問題。例如,你可以用油猴腳本自動去除網頁廣告、調整頁面佈局、增加下載按鈕、自動填寫表單,甚至給網站加入原本沒有的功能。“油猴”最初通常指瀏覽器擴展 Tampermonkey。安裝 Tampermonkey 後,再安裝對應的腳本,訪問指定網站時腳本就會自動運行。簡單來說:網站提供原來的網頁,油猴腳本負責在你的瀏覽器里對它進行“二次改造”。
需求背景
回到我的第一款 iOS App:
一毛一恙環中國回到杭州後,我們偶爾會出去騎車。我賣掉了自己15000塊打造的公路車,給恙兒買了一輛國布,加上我的大行的折疊車,兩輛車輕鬆塞進後備箱,可以去任何地方進行低強度騎行。在此之前,我也是那種上下班通勤都要保持 30 公里時速,不開碼表不舒服斯基的騎行者。為此還買了 Strava 的會員(真是超級貴啊)。
如我這樣的人大部分時候會帶一塊碼表在車上,甚至多輛車會有多塊碼表。但並不是隨時隨地都有碼表在身邊,比如偶爾騎共享單車,偶爾沒帶碼表在身邊。(碼表要拿回家充電,因為是快拆,擔心它被別人偷走,通常車子停下就會把它擰下來。)這個時候就會用手機來充當碼表的角色。

碼表相比普通的導航軟件,有幾個核心不同點:
導航只導騎行路線,這個高德也可以。
停車要停錶,這個大部分導航軟件都沒做,這對於普通騎行者來說根本不是個需求,但對於競技和訓練愛好者來說,則是必不可少的功能。如果停車沒有停錶,勻速就會被大大地拖慢,那麼這一段路程騎得表現如何,也就無法量化了。
停車停錶要能設置統計閾值,也就是說,5公里每小時以上開始統計,或者10公里每小時以上開始統計。Strava上很多刷數據的人會把進入統計的時間調得比較高,比如說15公里甚至是20公里時速以上。只要他的車子沒有達到 15 公里的時速統計,就不會開始那些慢騎的線路,或者在紅綠燈前的等待,都不會拖慢他的成績。
RideMeter 簡介

所以我的這個練手產品,就是一個極其簡單的騎行碼表。它用暗色設計,試圖讓 OLED 屏幕盡可能省電。黑黃配色,突出速度和運動感。
功能極其簡單,導航、顯示騎行數據(實時速度、平均速度、行駛里程、行駛時間)、分享騎行數據。再加上非導航狀態下(巡航模式),也可以開啓騎行軌跡記錄和數據顯示。所以這個產品只有內置 admob 的廣告和買斷去廣告這一種簡單的商業化模式。
為了這款簡單的小 app 能實現全球每個國家都能使用,且沒有邊際成本,我選擇了蘋果 mapkit 導航,而不是接入大家熟悉的國內導航 api 或者海外的谷歌地圖 api。這就是蘋果這樣超級全球化公司產品厲害的地方,它替你做了這樣複雜的全球化工作,而你只需要用最簡單的方式接入就可以了。
開發中遇到的坑
開發中遇到的最大的坑就是地圖坐標轉換了。沒做過地圖開發的人不知道,國內的地圖坐標是有一個轉換的。我們平時說的“經緯度”並不一定是同一套坐標。GPS 獲取的通常是國際通用的 WGS-84 坐標,而國內互聯網地圖出於相關法規與測繪管理要求,普遍使用經過轉換的坐標體系。例如高德、騰訊主要使用 GCJ-02(俗稱“火星坐標系”),百度又在此基礎上使用 BD-09。如果直接把 GPS 坐標畫到這些地圖上,位置就可能出現數百米的偏移。
我此前做出來 demo 後,和恙兒又去騎了幾次車實地測試,每次都發現導航位置不準確。我忽然想起來,在 15 年做愛拼車的時候,似乎遇到過這個問題,趕緊和 gpt 確認了一下,果然是有 WGS-84 ⇄ GCJ-02 坐標轉換的事情存在。於是讓 codex 加上了坐標轉換後,偏移就沒有了。