根据GEOHASH,查找附近的人,判断距离远
思路:提取用户经纬度,生成GEOHASH,根据geohash的精度判断距离远近,结合 http://bbs.appcan.cn/forum.php?m ... 7391&extra=page%3D1 这个帖子,可以完全计算出附近的人以及精确的距离(不过微信用的是大致距离,计算精确距离太耗费资源了。)
先普及一下GEOHASH的知识:
http://blog.jobbole.com/80633/ GEO核心原理,懒得复制了,大家移步看一下就好了。
反正就是可以把精度和维度,这两段数字,处理成一段若干长度的字符,这一串字符越长,距离信息越精确,同时,两个人的距离越近,GEOHASH的字符越接近。
比如我在B点,我的经纬度转换成GEOHASH是:45sadfdagfgfa43
你在A店,你的经纬度转换成GEOHASH是: 45sadfdagfgfg34
我可以根据geohash的字符位数情况,判断两点的大致距离。
判断依据:
从上图可以看出,当GEOHASH长度为8的时候,转换成经纬度的长度是20位,那么距离误差是正负0.019千米。
长度为7,那么距离误差是正负0.076千米。
好了。有了这个思路,就OK了。
我们把每个人的经纬度都转换成geohash,根据geohash选择周围的事物距离,比如截取geohash前5位,进行对比,前五位全部相同,说明这些geohash距离是2.4公里以内的(微信的附近人最远就是2.5公里,估计也是这个东西搞出来的)
那么,怎么取得GEOHASH呢?
别的不会,对PHP稍有了解。网上翻了翻,就用PHP的GEOHASH扩展来搞。
首先下载gethub,把他**到自己的服务器里,
https://github.com/shenzhe/geohash
从新编译PHP:
然后到geohash目录。
执行:phpize (最好带上PHP安装目录的绝对路径)
./configure
make
make install
然后把 geohash.so 加入到php.ini中
装好之后看一下PHPINFO是否成功启用了。
然后就可以直接在PHP页面里转换了:
/** * $latitude //纬度
* $longitude //经度
* $precision //精密度, 默认是12
* 返回 $precision 长度的 string
*/
geohash_encode($latitude, $longitude, $precision=12);
/**
* $hash //geohash_encode后的值
* 返回 array // Array
* (
* [latitude] => 39.416916975752
* [longitude] => 100.92223992571
* [north] => 39.416917059571
* [east] => 100.92224009335
* [south] => 100.92223992571
* [west] => 100.92223975807
* )
*/
geohash_decode($hash);
/**
* $hash //geohash_encode后的值
* 返回 在$hash 8个 (东南西北各二个)附近的hash值
*/
geohash_neighbors($hash);
/**
* $precision //精密度
* 返回 数组,array("width"=>12.0, "height"=>12.0)
* 表示矩形的宽和高
*/
geohash_dimension($hash);
上面教程是gethub里复制的,有问题可以私信我。
通过geohash_encode取得hash之后,我们可以通过各种方式,将他截取下来,
然后作为KEY,写入redis或者mysql。(强烈建议用redis,用起来太爽了)
我直接写了一个方法,根据各种距离,返回不同的字符长度
function getgeohash($lat,$log){
$geohash=geohash_encode($lat,$log,12); //取得原始GEOHASH
$arr['0']=$geohash;//原始HASH
$arr['9']=substr($geohash,0,9); //9位hash 距离最精确,
$arr['8']=substr($geohash,0,8);//8位,距离相对精确,具体精度看上面的表。
$arr['7']=substr($geohash,0,7);//7位,距离也挺精确
$arr['6']=substr($geohash,0,6);
$arr['5']=substr($geohash,0,5);
$arr['4']=substr($geohash,0,4);//4位hash,只要前4位相同,可以找出附近20KM的人事物。
return $arr;
}
redis的PHP扩展不解释了,有疑问的可以私信我。
$redis->sAdd('near:near:'.$arr[4],value);//20KM内的事物集合。
$redis->sAdd('near:near:'.$arr[5],value);//2.4KM内的事物集合。
$redis->sAdd('near:near:'.$arr[6],value);//0.61KM内的事物集合。
$redis->sAdd('near:near:'.$arr[7],value);//0.076KM内的事物集合。
$redis->sAdd('near:near:'.$arr[8],value);//0.019KM内的事物集合。
这里的$value,各位随意存数据,可以是用户信息的json,或者只放一个用户的uid随意啦。
'near:near arr[4-8] 这主要作寻址用,各位可以自己配置自己的路径,是各个数据集的key,根据情况酌情取就行了。
使用:
用户A,登陆后,先写入redis:
$redis->sAdd('near:near:'.$arr[4],value);//20KM内的事物集合。
当用户选择查询周围20KM的事物,
直接取得用户当前的geohash,然后截取geohash前4位。如:$geoarr[4];
然后读取redis
$redis->sort('near:near:'.$geoarr[4]);
这里直接返回了所有20KM内用户的集合。
不明白的私信吧,如果redis搞不定,可以用mysql存。
用redis有一个好处是可以结合sting或者hash等设置过期时间,比如30分钟后自动生效,这个各位自己摸索吧。
我这边的产品未成形,没有完整代码共享。看 杨焕昭 朋友发的:计算两个经纬度之间的直线距离 http://bbs.appcan.cn/forum.php?m ... 1&fromuid=55258
一时脑热,我也发一个,,,很轻松就实现了附近人,或者摇一摇搜索附近人,附近商家,等等好玩的东西。
##############################################################
下面评论的哥们给了一个geohash的github地址
```
- https://github.com/CloudSide/geohash
```
https://blog.csdn.net/qq_36373262/article/details/62419390
根据GEOHASH,查找附近的人,判断距离远相关推荐
- Redis(6)——GeoHash查找附近的人
像微信 "附近的人",美团 "附近的餐厅",支付宝共享单车 "附近的车" 是怎么设计实现的呢? 一.使用数据库实现查找附近的人 我们都知道, ...
- Mysql: LBS实现查找附近的人 (两经纬度之间的距离)
1. 利用GeoHash封装成内置数据库函数的简易方案: A:Mysql 内置函数方案,适合于已有业务,新增加LBS功能,增加经纬度字段方可,避免数据迁移 B:Mongodb 内置函数方案,适合中小型 ...
- Elasticsearch笔记(九):实践篇-查找附近的人
到这里Elasticsearch的整个系列分享就基本上结束了,当然后续还是会针对某一点进行讲解.为何要在实践篇中讲解"查找附近的人"呢?说实话,想了很久,最终才确定下来,总体希望这 ...
- GeoHash算法获取附近店铺和距离
1. 简介 GeoHash算法将二维经纬度坐标直接转换成字符串,每一个字符串代表一个矩形区域,也就是说,这个矩形区域内所有的点(经纬度坐标)都共享相同的GeoHash字符串,字符串的长度越大,矩形的区 ...
- 基于Redis实现查找附近的人
之前分享过一篇<使用geohash实现查找附近的人>,其实redis在3.2版本之后也提供了地理位置的能力. geoadd命令 该命令是添加地理位置信息,基本格式是: 基于Redis实现查 ...
- java 身边距离怎么查询_附近的人位置距离计算方法
附近的人的位置用经纬度表示,然后通过两点的经纬度计算距离.根据网上的推荐,最终采用geohash. geohash的实现java版: 1 importjava.util.BitSet;2 import ...
- python字符串用法详解(str、下标、切片、查找、修改、判断)
1. 认识字符串 字符串是 Python 中最常⽤的数据类型.⼀般使⽤引号来创建字符串.创建字符串很简单,只要为变量分配⼀个值即可. a = 'hello world' b = "abcde ...
- php 附近的距离,PHP查询附近的人及其距离的实现方法_PHP
本文实例讲述了PHP查询附近的人及其距离的实现方法.分享给大家供大家参考,具体如下: array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng), 'righ ...
- 不愿意和别人打交道_始终和人保持距离,最不合群的3星座,孤僻却有真本事,能成大事...
始终和人保持距离,最不合群的3星座,孤僻却有真本事,能成大事 巨蟹座 巨蟹座的人真的是天生孤僻,他们始终和人保持距离,也不喜欢跟别人打交道,最怕就是应酬的事,看起来很不合群,但是巨蟹座却可以把自己的事 ...
最新文章
- 扫地机器人能有多硬核?好家伙自动驾驶、激光扫描、NLP这些硬科技全上了,科沃斯:技术创新才能打破行业内卷...
- java 报500该怎么解决_关于servlet500错误 应该怎么解决
- R语言入门心得(3) -- 向量相关
- java 随机生成10个整数_Java:随机生成10个整数(1-100),对生成的序列进行排序,并插入一个任意数...
- 【渝粤教育】广东开放大学 嵌入式数据库 形成性考核 (48)
- php安装zendDebug
- 我的世界java骷髅马_我的世界1.9版本新功能曝光 骷髅马正式加入
- excel匹配_Excel常用的关联匹配函数
- 剑指offer——面试题26:复杂链表的复制
- 【unity3d study ---- 麦子学院】---------- unity3d常用组件及分析 ---------- 组件的生命周期...
- SQL Server存储过程作业(三)
- uboot移植——uboot配置过程详解
- 微信android4.1登陆失败,微信授权登录 IOS成功 安卓失败
- Mac安装port(port:command not found解决办法)
- web前端页面优化详解
- Python练习数据结构笔记
- java金蝉素数_回文素数 - 寂寞暴走伤的个人空间 - OSCHINA - 中文开源技术交流社区...
- python 实现日期计算器
- 【0】依照Django官网:实现第一个django app 安装必要的工具/模块
- 苏州市软件行业协会第五届第四次理事会暨元宇宙专委会成立决议会在苏召开
热门文章
- 强制绕过硬件检查,并升级Windows11
- babel : 无法加载文件 C:\Users\Lenovo\AppData\Roaming\npm\babel.ps1 ,因为在此系统上禁止运行脚本。
- Ant Design Vue 组件或图标的引入和使用
- HTML+CSS实现炫酷的登录界面
- flex布局,没有justify-self,如何实现一左一中布局
- 萨特《禁闭》由他人来解读“他人即地狱”
- Centos文件上传,并用Compose, Dockerfile部署容器
- win10兼容模式怎么设置_Win10游戏模式,你真的会用吗?只有这样设置,游戏操作才流畅...
- 命令行下转换amr为mp3
- 数据可视化之文本情绪(极性)分析