今天Rover为大家推荐一种经纬度编码方式——plus code,原名open location code,2014年由谷歌发明,旨在通过算法将代表地理位置的经纬度推算成字符串。
加码的目的
用一串字符来表示地球上的任何位置
发明plus码的初衷是为了能够用一个码来识别地球上任何一个地方。
最常用的位置代码是地址代码,用于通过行政区划、道路、门牌号等信息查找具体的位置信息。 这在日常生活中很常见,比如快递。
但如果在京东或天猫上买东西,直接寄到农村老家怎么办? 你还记得地址信息吗? 一方面,城市化进程发生了变化,门址可能不再是原来的门址。 另一方面,即使有门牌号,陌生人能否顺利找到也还是个未知数。
如果找不到门口地址,那我们就用经纬度,这是一个非常精确的位置信息。 没错经纬度取值范围,但是除了电影中用十几个数字(也就是经纬度)来寻找目标的场景外,我们日常生活中有没有用到呢? 再加上国家的法律因素,即使是通过经纬度导航也不是可行的方法。
世界上确实存在无法用门地址表示的地方,而经纬度的数值超出了常人的记忆,所以谷歌希望用一种编码的方式来简单明了地表示世界上的任何一个位置.
用字符串编码表示经纬度,编码方案其实有很多种,但是加码有什么优势呢? 我们稍后再谈。 然而,Rover 使用加号代码不仅仅是为了指示在地球上的位置。
根据位置范围搜索
在电子地图的使用过程中,我们可能经常需要查询酒店、饭店、景区等数据经纬度取值范围,也就是我们常说的POI检索。 检索方式除了名称查询外,还可以包括周边查询或沿途搜索,如“徐家汇周边10公里范围内的奥迪4S店”。
周边查询和沿途搜索都是基于经纬度范围的搜索。 最常见的搜索方式是SQL语句,只是限定范围,例如:where lat > 31 and lat 121 and lon
直接比较经纬度肯定不是什么好办法。 当数据量达到千万级时,检索效率低到无法直接查看。 如何提高检索效率? 首先想到的肯定是块检索,比如将数据拆分成四叉树,根据当前位置找到附近的数据块,然后在数据块中检索。
数据分帧和分块是数据处理中最基本的内容。 当数据量很大时,必须通过分帧和分块处理,比如全国的POI数据。 数据分帧的方法有很多种,比如上面提到的四叉树法,或者直接按照固定的经纬度间隔分帧(类似于印刷纸质地图使用的分帧)。 当然,以省名区分也可以算是装帧,只是形状不规则而已。
罗孚推荐plus码,在装帧上肯定有它的优势。 慢慢说吧,先了解下plus代码。
什么是加码
plus code是一种经纬度编码方式,可以代表地球上的任何地方。
加号编码经纬度后,一般为十个字符(如果加上+号,则为11个字符)。 plus代码去除了容易混淆的字母和一些令人不快的字符,只使用了20个字符(包括一些数字)。 这20个字符是:2、3、4、5、6、7、8、9、C、F、G、H、J、M、P、Q、R、V、W、X。
plus码的前四个字符是区号,基本是1个经纬度的范围,也就是100到100公里左右的范围,后六个字符是地方码,用来描述一个建筑面积约1414平方米,几乎是半个面积。 一个篮球场那么大。
但是如果觉得十位密码的精度不够,可以继续扩充吗? 当然,plus code定义了一个额外的规则,可以将code扩展到11位或者12位。 11位代码几乎代表了3米的范围,应该可以描述建筑物的前门或后门,或者汽车。 定位颗粒的尺寸更细。 需要注意的是,10位以后的编码不再用两位数表示地区,而是只用一位数,编码方式不同。
级别字符数 经纬度范围 长度范围
2个
20×20
2200公里
1个
4个
1×1
110公里
2个
6个
0.05×0.05
5.5公里
3个
8个
0.0025×0.0025
275米
4个
10
0.000125×0.000125
14m
5个
11
0.000025×0.00003125
3.5m
6个
12
0.000005×0.0000078125
上表是plus代码的层级表。 由于加码是有层次的,所以加码的长度是可以改变的。 长度越短,面积范围越大,长度越长,面积范围越小。 同时也说明plus码所代表的经纬度是一个经纬度范围(一个平面),而不是一个经纬度值(一个点)。 按理说,表面不能用于导航。 当然,我们可以通过取表面的中心点来解决这个问题。
plus码的优势
介绍完plus code,我们来总结一下plus code的优点。
方便存放
编码后,经纬度由经纬度两个字段变为一个字段,减少了一个字段,不再使用float类型,直接使用定长字符串即可。
易于比较
Rover认为方便的对比是plus code的核心优势,也是解决上述“定位搜索”问题的核心。
比较的方便性主要体现在两个方面,一是按照层次划分帧,二是帧与帧之间的连续性。
还是比如,如何搜索徐家汇10公里以内的奥迪4S店? 主要解决作用域的问题。
徐家汇的加码是8Q335CVQ+。 根据plus代码层级中的长度范围,选择6位代码(对应5.5km的长度范围),即8Q335C,然后选择地图框周围的8个地图框比较合适。 , 8Q3349, 8Q334C, 8Q334F, 8Q3359, 8Q335F, 8Q3369, 8Q336C, 8Q336F,最后形成九个正方形的网格状图。
通过plus码的层级基本可以限制搜索的范围,通过目标位置的地图框扩展可以选择周围的地图框,地图框之间的连续性使得获取框格变得极其简单数字。
反之,如果使用plus码的规则对数据进行分块,将数据密集的区域划分为level 2,比如上海市区,将数据稀疏的区域划分为level 1,比如西部地区。 数据块的总量得到了控制,每个数据块的数据量比较均匀,不存在过密或过稀的情况。
其他优点
代码足够短,便于记忆。 代码本身支持全世界,不需要国家等额外信息。
代码由算法生成,可以离线使用,不需要任何设置和程序,代码不依赖于任何第三方。
特别是,这个算法是开源的,可以自由使用,包括商业用途。
与其他编码方式的比较
地理散列
Geohash是较早的经纬度编码方式,也是目前应用比较广泛的一种编码方式。 Geohash 使用 32 个符号作为它的字符集,它的字符长度也是可变的。 缩短字符串的长度会影响定位的准确性。 其实geohash码也代表的是经纬度范围,而不是经纬度位置。
当然geohash也是开源的,它只是一种算法。 应该说,后来的geohash-36和plus码编码,很大程度上是受到了geohash编码算法的启发。
Geohash 也有很多缺点。 除了精度问题,根据当前帧号获取周围帧号还有很多不确定性。 这应该是最大的缺点,因为数据的切分方式和命名规则。 比如在0纬度地区,也就是赤道附近,相邻两张地图的编号可能相差很大。 geohash的切分方式导致帧号首字母不一样,导致无法缩短代码长度。 快速获取帧数,即无法快速确定范围。
what3words
what3words据说用在了Benz身上,当然,因为Benz是what3words的投资方。
what3words 在两个方面吸引了我。 一种是将世界划分为3m3m的网格,这类似于一个固定长度和比例的预制框架。 另一种是每33格可以用3个词来表示,即世界上每3*3的地方都可以用3个词来表示。
例如:用“banana.rabbit.monkey”表示地址A,用“rabbit.monkey.banana”表示地址B。这种方法类似于建立一个世界范围的门地址编码系统,覆盖3*3个位置在世界范围内,一个数据库有多大才能容纳整个世界。 这种编码方式让我首先想到关键词竞价排名应该是一门好生意,而代理公司真的做到了。
我喜欢这种表示,但缺点太大了。 需要通过API访问才能定位。 虽然也提供了离线SDK,但是据说不能离线使用关键字PPC。 需要网络,没有编码算法可言,完全依赖机构对位置的定义是我最不愿意接受的事情。
其实经纬度的编码方式有很多种,今年也出现了很多编码方式。 罗孚无法一一列举和分析。 如果有更好的编码方式推荐,欢迎交流。
总的来说,罗孚认为plus code非常适合位置交换、定位、基于位置范围的搜索。 如果你的项目中恰好有经纬度转码或者经纬度范围检索,不妨试试plus code。
附资料:
加码官网:除了了解加码,还可以在谷歌地图上直接查看任意位置的加码代码。
Rover的plus代码演示页:可以直接查看地图帧数,基于leftlet+天地地图+plus代码网格,但是谷歌的网格瓦片服务器不稳定,你懂的。
Evaluation of Location Encoding Systems: 地理位置编码分析与比较,谷歌官方文档,内容较多,英文原版,非常值得一读。
加上代码/打开位置代码github: