需求

在许多社交app和外卖app种都有一个功能,就是查找附近的人或者附近的商家。

我们很容易获得用户的经纬度坐标,但是我们如何知道哪些用户在我们的四周?

如果知道两个用户坐标,可以使用几何数学的方法算出两个坐标之间的距离,但是如果要从海量数据库中找出距离本人1公里内的所有用户,难道要把所有用户经纬度数据都查出来然后一个个计算与我的距离吗?显然不可取。

geohash介绍

因此我们需要使用geohash,它的基本原理是将整个地球切割成无数个小块,每一个小块都用字符串表示。然后将经纬度转换成geohash字符串。

如果两个用户在同一个区域内,那么他们的geohash字符串就会有相同部分。

假设A用户坐标(100.001,100.002),B用户坐标(100.004,100.005),他们的geohash分别是 ypzpgxgpypzpgxvr

这两个geohash字符串前面6位是相同的,根据geohash的特性,这两个坐标距离在0.61公里之内。

geohash字符串规律如下:

只要根据用户经纬度计算出geohash,就可以参照上图计算出两个坐标之间的大致距离。

找到附近的人

要实现找到附近的人,首先我们要在获得用户经纬度的同时,计算出它的geohash字符串值,然后存入数据库中。

假设要找到A用户( ypzpgxgp)附近600米之内的所有人,只要取出geohash串的前6位( ypzpgx),然后在数据库中进行like 'ypzpgx%' 查询,就能轻易找出所有600米之内的所有人。

这种方式查找出的用户自然也包含了geohash前七位,甚至前8位都相同的人,前七位都相同的坐标距离在76米之内,自然也属于600米之内的范畴。

geohash计算方法

geohash的算法不算难,但也不简单,对于我们普通开发者来说,有现成的库就再好不过了。

这里提供一个php的geohash类的地址:https://github.com/CloudSide/geohash

其他语言的geohash库自行百度。

简单实例:

<?php require "GeoHash.php";$geohash = new GeoHash;$hash = $geohash->encode(100.004,100.005);echo $hash;

ps:提供的经纬度坐标越精确(小数点后越多位),计算出的geohash字符串也就越长,计算距离也越准确。具体参照上面的图。

还有其他用法请查看上面提供的github地址。

使用geohash实现查找附近的人相关推荐

  1. 根据GEOHASH,查找附近的人,判断距离远

    思路:提取用户经纬度,生成GEOHASH,根据geohash的精度判断距离远近,结合 http://bbs.appcan.cn/forum.php?m ... 7391&extra=page% ...

  2. 基于Redis实现查找附近的人

    之前分享过一篇<使用geohash实现查找附近的人>,其实redis在3.2版本之后也提供了地理位置的能力. geoadd命令 该命令是添加地理位置信息,基本格式是: 基于Redis实现查 ...

  3. Redis(6)——GeoHash查找附近的人

    像微信 "附近的人",美团 "附近的餐厅",支付宝共享单车 "附近的车" 是怎么设计实现的呢? 一.使用数据库实现查找附近的人 我们都知道, ...

  4. Mysql: LBS实现查找附近的人 (两经纬度之间的距离)

    1. 利用GeoHash封装成内置数据库函数的简易方案: A:Mysql 内置函数方案,适合于已有业务,新增加LBS功能,增加经纬度字段方可,避免数据迁移 B:Mongodb 内置函数方案,适合中小型 ...

  5. Elasticsearch笔记(九):实践篇-查找附近的人

    到这里Elasticsearch的整个系列分享就基本上结束了,当然后续还是会针对某一点进行讲解.为何要在实践篇中讲解"查找附近的人"呢?说实话,想了很久,最终才确定下来,总体希望这 ...

  6. SpringBoot使用GeoHash分页查询附近的人:RedisTemplate+GeoHash+Lua

    SpringBoot使用GeoHash分页查询附近的人:RedisTemplate+GeoHash+Lua 架构设计 开发环境 SpringBoot Redis(version>=3.2) Re ...

  7. 我如何使用Python查找有趣的人来关注Medium

    by Radu Raicea 由Radu Raicea 我如何使用Python查找有趣的人来关注Medium (How I used Python to find interesting people ...

  8. 查找附近的人-geohash使用方法

    geohash已有java的封装: 1,导入geohash的jar包 <dependency><groupId>ch.hsr</groupId><artifa ...

  9. 实现类似微信中查找“附近的人”的功能!

    前几天收到一个新的需求,需要实现类似"附近的人"的功能:根据自己当前的定位,获取距离范围内的所有任务地点.刚看到这个需求时有点懵逼,第一想到的就是要利用地球的半径公式去计算距离,也 ...

  10. app后端开发四:GeoHash实现查找附近的X

    夜以继日,从7月28,到今天此时此刻,用laravel做的app接口,1.0版本终于做完了.后面等整个项目上线了,可以慢慢的来回顾一下这次开发的过程.今天主要来说下附近的X这个功能. 情景描述 现在附 ...

最新文章

  1. 程序员的自由,不只在那一寸领地!
  2. 数据结构(五)---栈的链式存储的实现---java版
  3. 第7章 输入/输出系统
  4. html文档包包含几个基本标记,HTML中包含哪些基本的标记?
  5. 多线程的那点儿事(之大结局)
  6. easyui tree的简单使用
  7. 再谈WinRT自定义组件的开发
  8. 转:在windows中将tree命令加入git-bash中
  9. 开源办公系统:支持在线Office在线编辑、文档协同
  10. java中时钟回拨,【追光者系列】HikariCP源码分析之evict、时钟回拨、连接创建生命周期...
  11. dhcp authoritative参数作用
  12. Wasserstein距离
  13. 2022 年排名前 10 的聊天机器人[示例]
  14. SimpleFOC(二)—— 快速入门 (开环控制)
  15. ROSGazebo自定义多旋翼无人机仿真——环境搭建和模型建立
  16. 对于噪声数据理解以及Min-Max 规范化和 Score规范化(零-均值规范化)的实例【数据预处理】
  17. DEJA_VU3D - Cesium功能集 之 004-动态单体化(整幢建筑)
  18. css中字体大小font-size的设置
  19. 牌照发布后的第20天,上海MWC,中国5G,GO!
  20. C++之spriintf函数(itoa函数)

热门文章

  1. Java服务端接入苹果内购。实现票据二次校验、自动续期订阅
  2. HDU5391米勒拉宾
  3. 2019西安交通大学计算机复试,西安交通大学2019考研复试分数线多少分 各科基本分数线一览...
  4. 如何免费自动将邮件发送到多个邮件地址 - 自动邮件发送器使用教程
  5. EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)
  6. 科大讯飞“飞星计划”一面二面面经
  7. 自学编程,上这8个免费网站,省去上万元学费
  8. CSS3——渐变(线性渐变、径向渐变、重复性渐变)
  9. ORacle查询时显示同义词转换不再有效
  10. PS-第六天-色彩调整