路线标记法

熟悉我的人都知道,我很喜欢步行,能不搭车的时候绝对不搭车。最近就走得很多,佛罗伦萨、巴黎这些,所以主要是在城市里,穿街走巷那种。

大部分时候走呢,都会有个大概的目标,比如从罗丹美术馆到蒙帕纳斯大楼,大概两公里的脚程:从美术馆的北门出来,先往东到巴克街,右转,沿着巴克街往南,一直到跟沃吉拉德街、雷恩大街还有 Rue du Regard,共四条路交叉的路口,再沿着雷恩大街朝西南方向走大概 500 米,就到了。

路线都是 google map 查出来的,让我自己对着纸质地图,也很难找出比它更好的路线来。麻烦的是,如果一直瞅着 gmap,就没什么机会注意街头路边(这正是步行的乐趣所在);而我记性又不好,甚至记不住上边说的那么一串,何况还揉了一堆法语的路名,一不小心走过了又麻烦。最后只好戴了耳机,开了 gmap 的语音导航,一路听着走。这么着还是不完美,戴着耳机难受,有种 armed 的约束感,不戴吧又听不见;另外一方面有时候 GPS 会抽风(不抽风的时候安卓常见的省电模式也会影响待机状态下的 GPS 行为),所以并不靠谱。

所以我想着,是不是可以从上边那么一串乱七八糟的内容里,抽出对消费与记忆友好的、最少量的信息,再用最简洁方式表述出来。于是我设计了个路线标记法(Route Notation):

一条路线分为多段路段,每段路段与一段直行(顺着路走)行为对应,需要包含走到哪以及下一动作的信息,比如一段路段记为右 2 转 1

  1. 转向,是下一段路段的方向,一般为

  2. 2路口序号,这里表示第几个右转路口进行转向

  3. 行为,行为有两种(以后还可以扩展?):

    • 即转向,表示在指定的路口进行转向
    • 表示在指定的路口前到达目的地
  4. 1 则是路段序号,即转向时下一段路段的序号;考虑非标准的十字路口,如三叉、多叉路口等,这里的数字 n 表示从当前路段开始,沿转向方向对该岔路口所有路段进行遍历,目标路段的次序;仅在行为时需要指定路段序号

    拿“米”字路口(四条路交叉在一个点)举例,如果从下方来并右转,则右下方向序号为 1,右转方向序号为 2,如果想沿右上方向走,则序号为 3;同理,如果从下方来并左转,则左下方向序号为 1,正左方向序号为 2,左上方向序号为 3

所以右 2 转 1就表示“在右手边的第二个路口转向,转到右手边的第一条路上”。“目的地在左前方(需要过 2 个路口)”,记为左 3 前。为了便利,引入额外的简化约定:路口序号与路段序号在为 1 时均可省略,这样,右 2 转 1 就可以简记为右 2 转;下一个十字路口左转的话,就可以简记为左转

在消费标记信息的时候,需要注意:每次经过路口的时候,把当前的路口序号1;当路口序号1 时,下一个满足条件的路口即为执行行为(转向或者到达目的地)的目标路口。

这样用这个标记法再去描述前面提到的罗丹美术馆到蒙帕纳斯大楼路线,就是:右 4 转,右 5 转 2,左 2 前

不过后来我发现我还是高估我的记忆力了,即便是这三句,我也很难一路记住,只好一句一句来,每次拐弯完再瞅一眼 gmap,记住下一句。可是标记法本身没什么问题,很好使,可以处理绝大部分正常的城市路段。

一些考虑:

  1. 为什么用路口数标识距离?

    几个可选的方案:

    1. xxx 米,这个对信息的消费不友好,我们很难在行走的时候一直去算我们走了多少米
    2. 路名(与 A 路的交叉路口),这个对信息的记忆不友好,路名里边的冗余信息太多,难记

    以上,都不太行。

  2. 在标记路段序号时,为什么不约定一个固定的旋转方向(如顺时针),而是使用当前的转向作为旋转方向?

    一方面,更自然:如果约定顺时针,则右转第一条岔路,指的却是最靠近左手的岔路,很扯淡,逆时针同理;另外一方面,大部分时候,路况比较简单,我们都是转当前转向的第一个岔路,这样这个 1 总是可以省略掉。