经纬度编码方法推荐-plus code简介

今天罗孚为你们推荐一种经纬度编码的方法——plus code,原名open location code,是Google于2014年发明的,旨在将表示地理位置的经纬度经过算法推导成一个字符串。git

plus code

plus code的用途

用一串字符表示地球上的任一位置github

发明plus code的初衷,就是但愿可以经过一个编码标识地球的任何一个地方。算法

咱们最经常使用的位置编码是地址编码,经过行政区划、道路和门牌号等信息找到具体的位置信息,这在平常生活中很是常见,好比送快递。sql

但若你在京东或天猫上买东西,直接送回乡下老家,怎么办?还能记得门址信息吗?一方面城市化进程变迁,也许门址早已不是当初的门址,另外一方面即使有门牌号,一个陌生人可否顺利找到,也是未知问题。数据库

门址没法找到,那咱们用经纬度,经纬度是一个很是精确的位置信息。没错,但除了电影中会有经过十几个数字(即经纬度)来寻找目标的场景,咱们在平常生活中有用到吗?加上国家的法律因素,连经过经纬度导航都不是一个可行的方法。服务器

世界上确实有没法使用门址表示的地方,而经纬度的数值也超出了常人的可记忆范畴,因此Google但愿经过一种编码方法,简单明了地表示世界上任一位置。网络

使用字符串编码来表示经纬度,其实有多种编码方案,但plus code有什么优点?咱们后面再讲。只是,罗孚使用plus code并不只仅为了表示地球上的位置这么简单。google

基于位置范围的检索编码

在电子地图的使用过程当中,咱们可能常常须要查询酒店、餐饮、景点等数据,也就是咱们常说的POI检索。其检索方式,除了名称查询外,可能会有周边查询或沿途搜索,好比“徐家汇周围10千米范围内的奥迪4S店”。lua

徐家汇周围10千米范围内的奥迪4S店

周边查询和沿途搜索,都是一种基于经纬度范围的检索,最常规的检索方法,就是一条sql语句,限定一下范围便可,好比:where lat > 31 and lat <32 and lon >121 and lon <121。

直接拿经纬度进行比较,必定不是一个好的方法,当数据量达到千万级,其检索效率低下到没法直视。如何提升检索效率?首先想到的,必定是分块检索,好比将数据进行四叉树切分,根据当前位置找到附近的数据块,而后再在数据块中检索。

数据分幅分块是数据处理中最基本的内容,数据量大了之后一定要作分幅分块处理,好比全国的POI数据。数据分幅有不少种方法,好比上述的四叉树方法,或者直接按固定经纬度间隔进行分幅(相似印刷纸质地图所用的分幅),固然按省名称区分也能够算是分幅,只是形状不规则罢了。

罗孚推荐plus code,必定在分幅上有它的优点,待我慢慢道来,咱们先来了解一下plus code。

什么是plus code

plus code是一种经纬度编码方法,它能表示地球上的任何一个地方。

plus code将经纬度编码后,通常为十位字符(若是含+号的话,就是11位)。plus code去除了容易混淆的字母以及一些使人不愉快的字符,只取用了20个字符(含部分数字),这20个字符是:二、三、四、五、六、七、八、九、C、F、G、H、J、M、P、Q、R、V、W、X。

港汇恒隆广场的pluscode码

plus code的前四个字符是区域代码,基本是1经纬度的范围,也就是约100100千米的范围,后六位是本地代码,用来描述一个建筑物,面积约为1414米,差很少是半个篮球场的大小。

但若是以为十位编码精度不够,是否能够继续拓展呢?固然能够,plus code定义了一个附加规则,能够将代码拓展到11位或12位,其中11位编码差很少表明了3米的范围,应该能够描述一个建筑物的前门或后门,或者是一辆车的大小,定位颗粒更细。须要注意,10位之后的代码再也不使用两位编码表示区域,而仅使用了一位,编码方式有所不一样。

层级 字符数 经纬度范围 长度范围
0 2 20x20 2200km
1 4 1x1 110km
2 6 0.05x0.05 5.5km
3 8 0.0025x0.0025 275m
4 10 0.000125x0.000125 14m
5 11 0.000025x0.00003125 3.5m
6 12 0.000005x0.0000078125

上表为plus code的层级表,既然plus code具备层级,那pluse code就能够改变长度,越短的长度表示的区域范围越大,越长的长度表示的区域范围越小。同时也说明,plus code所表示的经纬度,是一个经纬度范围(是一个面),而不是一个经纬度值(一个点)。按理,面是没法用来导航的,固然,咱们变通一下,能够取面的中心点。

plus code的优势

plus code介绍完了,咱们来总结一下plus code的优势。

方便存储

经纬度通过编码,由经度和纬度两个字段,变动为一个字段,减小了一个字段,并且再也不使用float型,能够直接使用固定长度的string。

方便比较

罗孚认为,方便比较是plus code的核心优点,也是解决上述“基于位置范围检索”问题的核心。

方便比较主要体如今两个方面,一个是按层级分幅,另外一个是幅和幅之间具备连续性。

plus code的层级分幅

仍然举例来讲,如何检索徐家汇附近10千米范围的奥迪4S店?主要解决范围的问题。

徐家汇的plus code是8Q335CVQ+,根据plus code层级中的长度范围,约取6位编码(对应长度范围是5.5km)比较合适,即8Q335C,再将该图幅附近一圈的8个图幅选取出来,8Q334九、8Q334C、8Q334F、8Q335九、8Q335F、8Q336九、8Q336C、8Q336F,最终造成一个九宫格状的图幅。

查找徐家汇附近10千米范围

经过plus code的层级能够基本限定搜索的范围,经过目标位置的图幅扩展选择周边的图幅,而图幅之间的连续性让图幅号的获取变得极其简单。

反之,若使用plus code的规则进行数据分块,将数据密集区域,分块到level2,好比上海市区,对于数据稀疏区域,则能够分块到level1,好比西部地区。数据块的总量获得了控制,同时每一个数据块的数据量也比较均匀,没有过密或过疏的状况。

其余优点

代码足够短,方便记忆。代码自己是支持全世界的,不须要国别等附加信息。

代码是经过算法生成的,能够离线使用,而且不须要任何设置或程序,代码不依赖于任何第三方。

特别须要说明的,这个算法是开源的,能够自由使用,包括商业用途。

同其余编码方法的比较

geohash

geohash是比较早期的经纬度编码方法,也是使用较广的编码方法。geohash选用了32个符号做为其字符集,其字符长度也是可变的,缩短字符串的长度会影响位置的精度,实际上geohash代码也是表示了经纬度范围,而不是经纬度位置。

固然,geohash也是开源的,也仅仅是一个算法,应该说,后来的geohash-36以及plus code编码,都受到了geohash编码算法的较大启发。

geohash也有很多的弊端,除了精度问题,根据当前分幅号获取周围分幅号码有较多的不肯定性,这应该是最大的弊端,缘由在于数据切分方法和命名规则。好比0纬度地区,即赤道附近,两个相邻的图幅,其图幅编号可能会截然不同,geohash的切分方法致使图幅号的首字母也存在不一样,这样就没法经过缩短代码的长度来快速获取图幅号,也就是没法快速肯定范围。

what3words

what3words听说已经在Benz上得到了使用,固然,缘由是Benz是what3words的投资方。

what3words吸引个人地方有两个方面,一是将世界分红了3m3m的网格,相似于预先进行了一个固定长度和比例尺的分幅,另外一是每个33的网格均可以使用3个单词来表示,即全世界每个3*3的地方均可以用3个单词找到。

举个例子:用“香蕉.兔子.猴子”能够表示A地址,用“兔子.猴子.香蕉”来表示B地址。这种方法,相似于创建了一个全世界的门址编码系统,而覆盖全世界3*3的位置,要装下全世界,那将是一个多大的数据库呢。这种编码方法让我首先想到的就是,作关键字竞价排名应该是一个不错的生意,该机构还真的作了这件事情。

我喜欢这种表示形式,但弊端确实太大了,自己须要经过API访问才能定位,虽然也提供了离线SDK,但听说关键字竞价排名不能够离线使用。须要网络,而且无编码算法可言,彻底依赖于该机构对位置的定义,这是我最不能接受地方。

经纬度编码的方法其实还有不少,今年也冒出了不少编码方法,罗孚没法一一列举和分析,若有更好的编码方法推荐,也欢迎交流。

总的来讲,罗孚认为,plus code很是适用于位置交换、定位以及基于位置范围的搜索等,若是你的项目中正好有经纬度转码或经纬度范围检索,不妨试试plus code。

附上资料:

plus code 官网,除了了解plus code外,还能够在Google地图上直接查看任何位置的plus code代码。

罗孚的plus code演示页面,能够直接查看图幅编号,基于leftlet+天地图+plus code grid,不过Google的grid瓦片服务器不稳定,你懂的。

Evaluation of Location Encoding Systems,关于地理位置编码的分析比较,Google官方文档,内容较多,英文原版,但很是值得一看。

plus code/open location code github

相关文章
相关标签/搜索