网易首页 > 网易号 > 正文 申请入驻

想开发一个附近的人功能?你不得不知的Geohash算法

0
分享至

随着移动互联网的发展,很多基于地理位置信息的服务也越来越流行。比如说我们平常经常使用的查找附近的人,或者是附近的餐馆,共享单车等等。

那么,大家有没有想过,这个查找功能是如何实现的吗?作为受过高等教育的人,大家肯定立即就想到了可以通过经纬度进行计算。具体算法类似于这样:

地球近似于一个球体,地球赤道周长约40075.04公里,半径约为6371公里,因此,可以很容易地用立体几何的方法求出其距离,例如说最常见的大圆距离(Great-Circle Distance)。

公式如下:

其中, R为地球半径,Aj、Aw分别表示A点的经度、纬度;Bj、Bw分别表示B点的经度、纬度。这样,通过简单的立体几何方法就可以很容易地求出其距离。

如果有人对于地理信息学比较了解的话,还会知道半正矢公式(Haversine公式),因为大圆距离公式用到了大量的余弦函数,因此在两点距离过短的时候,会导致比较大的舍入误差。而半正矢公式则因为采用了正弦函数的方法,因此即使距离过小,也可以保留足够的有效数字。半正矢公式的形式如下所示:

其中

这里面的R为地球半径,可取平均值 6371km;φ1, φ2 表示两点的纬度;Δλ 表示两点经度的差值。

有了这些算法,那么理论上来查找附近的人就可以很方便地实现了。但是为什么要说从理论上讲呢?因为在工程实践中,这样查找的计算量太大了。对于几个经纬度的数据而言还可以,但是对于大规模数据查询而言,没有实际可操作性。就比如想在一个一百万条数据的数据库里查找附近5公里之内的餐馆有哪些,那么要对一百万条数据做各种三角函数操作,这显然是不现实的事情,更别说在互联网上应用的数据体量远大于百万条。而且这样的数据也很难对其查询效率进行优化。

那么,要怎么解决这个问题呢?这就是我们今天要介绍的神奇算法,Geohash算法了。通过Geohash算法,我们可以把两个坐标的距离计算简化为两个字符串的比较,从而可以最大限度的应用速度更快的字符串相关函数,并且对其进行排序或索引。

下面我们就来看看Geohash算法具体是怎么做到这一点的。

Geohash的本质就是将用到的整个地图区域进行矩形分割,然后在各个矩形之中再次进行矩形分割,而每一次分割中所在的区域用一个字符代表,这样一次次分割之后,就可以最大可能的逼近实际坐标所在地。而这个坐标也就可以用一串字符来代替了。常用的Geohash算法中,每个字符用5个比特来标识,这样就会有32个不同的组合(0-31),于是我们就可以将这个地图区域划分为32个区域。这样划分之后,第一个字母划分的区域就如下图所示:

然后我们再对各个区域继续进行划分,就会得到类似于wx4eqzrx,这样的一个字符串了。

而这时,我们就可以方便地使用类似于

Select * from world where geohash like 'wx4eqw%';

这样的sql语句查询到附近想要查询的东西了。是不是很方便呢?通过这种方式,我们就把复杂的三角函数计算,转化成了计算化处理效率非常高的字符串操作了。

那么,想必大家一定要问了,坐标转化成的字符串是怎么生成的呢?其实也很简单。

我们以纬度39.928167为例。

a. 首先我们以区间[-90,90]进行二分为[-90,0),[0,90],称为左右区间,可以确定39.928167属于右区间[0,90],标记为1

b. 接着将区间[0,90]进行二分为 [0,45),[45,90],可以确定39.928167属于左区间 [0,45),标记为0

c. 递归上述过程39.928167总是属于某个区间[a,b]。随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167,划分次数越多,距离就越精确,字符串也就会越长,如下图所示:

这样我们就得到了纬度的二进制表示,同样我们也可以对经度进行二进制表示。然后,我们把经度放到偶数位,纬度放到奇数位,把两个二进制串合并到一起,最后将得到的二进制串编码每5位进行base32编码,最终就得到了我们想要的,对于每个小方格进行表示的Geohash字符串序列。

但是这样做了之后,很多人会发现一个问题,那就是每个Geohash字符串事实上都是代表一个小方格的,那么就会产生边界跨越的问题。就像下图中的红点,和上面的绿点并不在一个方格里,因此如果我们光查询红点所在的格子的话,就会查询不到明明离它很近的上面的绿点,反而可以查询到更远一点的下面的绿点。

那么怎么解决这个问题呢?其实也很简单,就是在查询的时候,把周围的8个格子也考虑进来一起查询就行了。那么具体是怎么做的呢?我们可以看到,周围的8个格子,本质上就是经度纬度的格子二进制数与中间的格子差1,所以我们只需要对红点的经纬度二进制数,进行加减1的操作就可以获取到附近格子的字符串了。而这样做本质上就是损失了一个格子的精度。而在经纬度位数足够的情况下,这个误差是可以忽略不计的。通过计数我们可以得出:

在纬度相等的情况下,经度每隔0.00001度,距离相差约1米;在经度相等的情况下,纬度每隔0.00001度,距离相差约1.1米;而在geohash的位数是9位数的时候,大概为附近2米;8位的话,大约为附近19米。对于大部分人来讲,可以说是一个可以接受的误差了哦。

喜欢本文的话,欢迎关注活在信息时代哦:)

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
福建和台湾谁强?福建用4188万人创造了5.43万亿GDP,台湾省呢?

福建和台湾谁强?福建用4188万人创造了5.43万亿GDP,台湾省呢?

番茄说史聊
2024-05-26 16:39:40
如果真的准许私有化,不用三十年,百分之八十的人或将无立足之地

如果真的准许私有化,不用三十年,百分之八十的人或将无立足之地

校长侃财
2024-05-13 12:44:53
尼克-杨:我找科比在阿迪上签名 科比直接扔进垃圾桶说他只签耐克

尼克-杨:我找科比在阿迪上签名 科比直接扔进垃圾桶说他只签耐克

直播吧
2024-05-28 17:09:15
贾冰《陌路狂花钱》票房破7亿,古天乐《九龙城寨》累计6.17亿

贾冰《陌路狂花钱》票房破7亿,古天乐《九龙城寨》累计6.17亿

千信齐飞
2024-05-27 22:21:42
该管管了!世界乒乓球赛,裁判问王楚钦比分,体育局做出回应

该管管了!世界乒乓球赛,裁判问王楚钦比分,体育局做出回应

刺头体育
2024-05-28 22:00:19
发财是玩弄人性的游戏,这世上所有挣大钱的方法,都在利用人性

发财是玩弄人性的游戏,这世上所有挣大钱的方法,都在利用人性

失语者云骧
2024-05-25 15:00:46
章泽天的素颜就是个普通人,这回相信东哥是脸盲了。

章泽天的素颜就是个普通人,这回相信东哥是脸盲了。

知秋侃史
2024-05-07 04:22:09
麦当劳哭了!一张工作人员的图,刷爆华人社媒和外网!“好恶心!”

麦当劳哭了!一张工作人员的图,刷爆华人社媒和外网!“好恶心!”

澳洲红领巾
2024-05-24 12:38:57
彻底倒向美囯?拒绝中方移民,驱离中方工人,中方大怒:永不合作

彻底倒向美囯?拒绝中方移民,驱离中方工人,中方大怒:永不合作

星辰故事屋
2024-04-27 19:04:44
俄乌战争结束后,中国要做好最坏打算,俄罗斯或许会彻底倒向西方

俄乌战争结束后,中国要做好最坏打算,俄罗斯或许会彻底倒向西方

战域笔墨
2024-05-28 15:35:53
广东队消息:王怀玉成为主帅,威姆斯有望留队,杜锋外甥正式离队

广东队消息:王怀玉成为主帅,威姆斯有望留队,杜锋外甥正式离队

小马哥谈体育
2024-05-28 22:01:34
反制威力初显,台湾销陆水果几乎被清零,民进党无能引发广泛不满

反制威力初显,台湾销陆水果几乎被清零,民进党无能引发广泛不满

剪辑狮
2024-05-28 01:18:37
灭了三大文明古国的雅利安人,前来华夏挑衅,被商朝扔进了殉葬坑

灭了三大文明古国的雅利安人,前来华夏挑衅,被商朝扔进了殉葬坑

文史道
2024-05-27 06:45:02
华人注意!加拿大网红水杯被召回!大批人中毒!半个月狂卖3.3万

华人注意!加拿大网红水杯被召回!大批人中毒!半个月狂卖3.3万

最远方
2024-05-28 20:00:43
比亚迪第五代 DM 技术发布,拥有 2.9L 全球最低百公里亏电油耗

比亚迪第五代 DM 技术发布,拥有 2.9L 全球最低百公里亏电油耗

IT之家
2024-05-28 20:21:11
官方:国足世预赛主场战泰国将于5月29日17:00二次开票

官方:国足世预赛主场战泰国将于5月29日17:00二次开票

懂球帝
2024-05-28 16:37:12
他是国军中将俘虏,抗美援朝连提2招对付美军,毛主席:提前特赦

他是国军中将俘虏,抗美援朝连提2招对付美军,毛主席:提前特赦

猫眼观史
2024-05-16 17:20:40
章子怡点评杨幂新片表现,言辞犀利,句句说到观众的心坎里

章子怡点评杨幂新片表现,言辞犀利,句句说到观众的心坎里

娱乐圈笔娱君
2024-05-27 18:07:29
打了600多天后,西方国家不得不承认:俄乌问题还是中国看得透彻

打了600多天后,西方国家不得不承认:俄乌问题还是中国看得透彻

历史求知所
2024-05-17 08:00:15
公务员体制内的公积金交的是真多啊!基本都是占了全社会的40%了

公务员体制内的公积金交的是真多啊!基本都是占了全社会的40%了

知秋侃史
2024-05-27 01:15:40
2024-05-29 05:06:44
活在信息时代
活在信息时代
信息时代的技术与社会伦理
648文章数 779关注度
往期回顾 全部

科技要闻

4月中国手机需求回升 iPhone出货量增长52%

头条要闻

安徽坍塌居民楼结构脆弱 专家称其"像积木搭在墙上"

头条要闻

安徽坍塌居民楼结构脆弱 专家称其"像积木搭在墙上"

体育要闻

霉霉带了60辆卡车来伯纳乌,花费3小时才运送完物资

娱乐要闻

昆凌晒三胎正面照,2岁妹妹超像周杰伦

财经要闻

东方通收购藏雷 花6亿买来"业绩变脸"

汽车要闻

三联屏/纯电续航318km 岚图FREE 318官图发布

态度原创

手机
本地
艺术
公开课
军事航空

手机要闻

华为三喜临门:折叠屏市场领跑,畅享70S配置清晰,系统焕新升级

本地新闻

食味印象|歙县限定!枇杷味儿的清甜初夏

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

公开课

近视只是视力差?小心并发症

军事要闻

以军装甲部队进入加沙地带南部城市拉法市中心

无障碍浏览 进入关怀版