开发日志 / 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 加上了坐标转换后,偏移就没有了。