LBS地理位置距离计算方法之geohash算法
来源:互联网 发布:软件界面翻译官 编辑:程序博客网 时间:2024/05/21 22:48
基础数据中,一般保存了目标位置的经纬度;利用用户提供的经纬度,进行对比,从而获得是否在附近。这里需要在设置出一个字段,是关于编码的字段,一会看下文哈……
地理位置距离实现目标:
查找附近多少公里内的人或者商家
比如:微信、陌陌、美团、基于O2O的一些APP这些应用或者移动网页都需要用到地理位置计算
目前来说:移动地理位置距离计算比较好的算法是geohash,特此整理分享。
geohash有以下几个特点:
第一:geohash用一个字符串表示经度和纬度两个坐标。
某些情况下无法在两列上同时应用索引 (例如MySQL 4之前的版本,Google App Engine的数据层等),利用geohash,只需在一列上应用索引即可。
(这里插一句:我们的mysql为字段创建的索引,其实原理就是利用二分法算法来做路径查询简化,快速查找出想要的字段位置)
第二:geohash表示的并不是一个点,而是一个矩形区域。比如编码wx4g0ec19,它表示的是一个矩形区域。
使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。
第三:编码的前缀可以表示更大的区域。
例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围。 这个特性可以用于附近地点搜索。首先根据用户当前坐标计算geohash(例如wx4g0ec1)然后取其前缀进行查询 (SELECT * FROM place WHERE geohash LIKE 'wx4g0e%'),即可查询附近的所有地点。
Geohash比直接用经纬度的高效很多。
Geohash的原理
Geohash的最简单的解释就是:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码
geohash能做到:
- https://github.com/CloudSide/geohash
https://github.com/lyokato/objc-geohash
例如: 假设我的数据库里存储着1亿条包含经纬度的用户数据,用iPhone/Android手机定位得到 新浪总部(理想国际大厦)的经纬度: 39.98123848, 116.30683690 然后去数据库查找附近的妞
require_once('geohash.class.php');$geohash = new Geohash;//得到这点的hash值$hash = $geohash->encode(39.98123848, 116.30683690);//取前缀,前缀约长范围越小$prefix = substr($hash, 0, 6);//取出相邻八个区域$neighbors = $geohash->neighbors($prefix);array_push($neighbors, $prefix);print_r($neighbors);
- 得到9个geohash值
//得到9个geohash值
Array
(
[top] => wx4eqx
[bottom] => wx4eqt
[right] => wx4eqy
[left] => wx4eqq
[topleft] => wx4eqr
[topright] => wx4eqz
[bottomright] => wx4eqv
[bottomleft] => wx4eqm
[0] => wx4eqw
)
- 范围如图:
- 用sql语句查询
- 123456789
SELECT
*
FROM
xy
WHERE
geohash
LIKE
'wx4eqw%'
;
SELECT
*
FROM
xy
WHERE
geohash
LIKE
'wx4eqx%'
;
SELECT
*
FROM
xy
WHERE
geohash
LIKE
'wx4eqt%'
;
SELECT
*
FROM
xy
WHERE
geohash
LIKE
'wx4eqy%'
;
SELECT
*
FROM
xy
WHERE
geohash
LIKE
'wx4eqq%'
;
SELECT
*
FROM
xy
WHERE
geohash
LIKE
'wx4eqr%'
;
SELECT
*
FROM
xy
WHERE
geohash
LIKE
'wx4eqz%'
;
SELECT
*
FROM
xy
WHERE
geohash
LIKE
'wx4eqv%'
;
SELECT
*
FROM
xy
WHERE
geohash
LIKE
'wx4eqm%'
;
- 看一下是否用上索引 (一共有50多万行测试数据):
索引:
其他资料:
- geohash演示: http://openlocation.org/geohash/geohash-js/
- wiki: http://en.wikipedia.org/wiki/Geohash
- 原理: https://github.com/CloudSide/geohash/wiki
- LBS地理位置距离计算方法之geohash算法
- LBS地理位置距离计算方法之geohash算法
- LBS地理位置距离计算方法之geohash算法
- 地理位置距离计算方法之geohash算法
- LBS的球面距离计算及Geohash方案探讨(LBS之一)
- LBS:附近搜索(geohash算法:经纬度编码搜索)
- 图解GeoHash算法--MongoDB 地理位置索引的实现原理
- HTML5地理位置定位 lbs
- GeoHash距离大致估计
- Geohash算法
- Geohash算法
- Geohash算法
- Geohash算法
- Geohash算法
- geohash算法
- GeoHash算法
- geohash算法
- 开发LBS应用之 根据一点的经纬度实现附近点的查询 - geohash
- 21分钟 MySQL 入门教程
- 代码自动生成(-)数据库表字段转换成java bean
- POJ 3300 Tour de France 再想想
- 渲染树构建、布局及绘制
- iOS MJRefresh简单刷新
- LBS地理位置距离计算方法之geohash算法
- CSS基础知识
- Oracle中rownum的使用
- java的ssm框架整合详细步骤,复制粘贴,直接可用(初级)
- shiro管理下MD5加密的使用
- Mongo操作教程之PHP扩展
- 【.Net Framework 体积大?】不安装.net framework 也能运行!?原理简介补充附带工具-2
- 如何看jar 里面的内容
- 蓝桥杯 历届试题 大臣的旅费