Geohash介绍

Geohash是一种地址编码,能把二维的经纬度编码成字符串,某一区域范围内的经纬度是一致的,其中有编码长度控制区域的范围 精度参考

使用场景

实时LBS应用

LBS应用中,搜索某某(地点) 附近 的什么(地点),重点在于附近,如果没有Geohash算法,你可能需要做。

  1. 圈定经度在某范围
  2. 圈定纬度在某范围
  3. 一般还会加上时间来做匹配

在数据量不多的时候这个方案确实可行,可是一旦数据量上去之后,这个方式别说实时应用甚至连离线场景都不合适。另外基本上应用基于LBS后,数据都是海量的。

所以通过对经纬度做Geohash成为字符串后,然后对该字符串以及时间在数据库中添加索引,再加上业内最常用的分库分表,即使海量基于LBS方面的数据实时查询也成为可行。

地理位置信息回溯

某打车公司,偶尔需要配合公安破案以及xx方面诉求的数据回溯,要调出某一时间段某一地区所有司机的信息,由于司机是实时上报坐标,数据量异常之大(日均几百G的,约500亿记录)

如果利用常规的圈定经度,纬度,时间范围的方式来查询根本不可行,所以利用Geohash在Hadoop中去查询的方式使得从大量数据中回溯特定数据方案可行。

当然这种诉求还有更佳的解决方案来做,由于并非高频需求,目前只是简单入Hive然后离线跑数据

简单使用

下边简单介绍在pythonphp中使用Geohash,以及遇到的问题

python

推荐使用Google上边的这个包,Download下来之后,解压到任意位置

1
2
3
4
5
6
7
8
9
10
11
12
13
16:02 liujb@localhost /Users/liujb/Dropbox/Didi/python-geohash
% ll
total 104
-rw-r--r--@ 1 liujb staff 25B Jan 15 15:14 MANIFEST.in
-rw-r--r--@ 1 liujb staff 3.7K Jan 15 15:14 README
-rw-r--r--@ 1 liujb staff 14K Jan 15 15:14 geohash.py
-rw-r--r--@ 1 liujb staff 11K Jan 15 15:15 geohash.pyc
-rw-r--r--@ 1 liujb staff 3.3K Jan 15 15:14 jpgrid.py
-rw-r--r--@ 1 liujb staff 2.1K Jan 15 15:14 jpiarea.py
-rw-r--r--@ 1 liujb staff 2.6K Jan 15 15:14 quadtree.py
-rw-r--r--@ 1 liujb staff 525B Jan 15 15:14 setup.py
drwxr-xr-x@ 6 liujb staff 204B Jan 15 15:14 src
drwxr-xr-x@ 7 liujb staff 238B Jan 15 15:14 test

然后在该目录

    大专栏  Geohash介绍i>输入python,进入python环境,
  1. 输入import geohash,导入geohash包
  2. print geohash.encode(30.725014, 104.257957)
  3. 得到wm6nu3q64mxr

整个过程如下

1
2
3
4
5
6
7
8
9
10
11
% python
Python 2.7.11 (default, Dec 12 2015, 20:37:07)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import geohash
>>> print geohash.encode(30.725014, 104.257957)
wm6nu3q64mxr
>>> print geohash.encode(30.725014, 104.257957, 5)
wm6nu
>>> print geohash.encode(30.735014, 104.267957)
wm6nuejs7mzg

看得出 30.725014, 104.25795730.735014, 104.267957 的hash值分别是wm6nu3q64mxr, wm6nuejs7mzg

两个字符串的前5位相同,两个地点相隔大约2公里左右

注意遇到的坑

1
2
3
4
5
6
7
8
9
10
11
>>> print geohash.encode(104.257957, 30.725014, 5)
File "<stdin>", line 1
print geohash.encode(104.257957, 30.725014, 5)
^
SyntaxError: invalid syntax
>>> print geohash.encode(104.257957, 30.725014, 5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "geohash.py", line 79, in encode
raise Exception("invalid latitude.")
Exception: invalid latitude.

这是因为经纬度弄反了,所以geohash.encode()第一个参数是纬度,第二个参数是经度,第三个参数是编码长度。这个坑是因为一开始使用的是vinsci这个包,该包经纬度弄反了不会报错,也是会出来一个编码。当时并没有注意到该环节,导致匹配了很多很远的经纬度数据

php

参考此处

本文参考

Geohash介绍的更多相关文章

  1. lucene索引文件大小优化小结

    http://www.cnblogs.com/LBSer/p/4068864.html 随着业务快速发展,基于lucene的索引文件zip压缩后也接近了GB量级,而保持索引文件大小为一个可以接受的范围 ...

  2. 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现

    本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...

  3. GeoHash原理解析

    GeoHash 核心原理解析       引子 一提到索引,大家脑子里马上浮现出B树索引,因为大量的数据库(如MySQL.oracle.PostgreSQL等)都在使用B树.B树索引本质上是对索引字段 ...

  4. 【转】GeoHash核心原理解析

    好久没更新过博客了,先转载一篇文章吧. 源地址:http://www.cnblogs.com/LBSer/p/3310455.html 引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按 ...

  5. GeoHash核心原理解析

    http://www.cnblogs.com/LBSer/p/3310455.html 引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西.某一天机机到北海公园游玩, ...

  6. [转]GeoHash核心原理解析

    原文出处: zhanlijun    引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西.某一天机机到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐 ...

  7. 基于GeoHash算法的附近点搜索实现(一)

    1. 引入 最近在参加学校的计算机仿真大赛,时间好像有点不够,所以只完成了前面的一部分最基础的功能,中途还是选择了放弃.但是之前的部分的确觉得完成得还不错,在这里分享一下.题目是要完成一个宇宙飞船加油 ...

  8. GeoHash核心解析

    GeoHash核心解析 引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西.某一天机机到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐馆,并选了其中 ...

  9. 空间索引 - GeoHash算法及其实现优化

    h1,h2,h3,h4,h5,h6,p,blockquote { margin: 0; padding: 0 } body { font-family: "Helvetica Neue&qu ...

随机推荐

  1. 吴裕雄--天生自然 pythonTensorFlow自然语言处理:文本数据预处理--生成训练文件

    import sys import codecs # 1. 参数设置 MODE = "PTB_TRAIN" # 将MODE设置为"PTB_TRAIN", &qu ...

  2. 统计学中比较重要的分布及python中使用方法

    比较重要的四种分布:正态分布.卡方分布.F分布.t分布 卡方分布概率密度曲线 t分布概率密度曲线 F分布概率密度曲线 参考资料: 统计学中四个概率分布 重要抽样分布

  3. 搭建rocketmq

    安装maven和java环境,此处省略.如果没有安装,请先安装maven和java环境!或者安装openjdk 首先下载rockermq官方地址:http://rocketmq.apache.org/ ...

  4. Centos7.5 firewalld防火墙配置

    CentOS 7.0默认使用的是firewall作为防火墙 1.查看firewall服务状态 systemctl status firewalld 2.查看firewall的状态 firewall-c ...

  5. Perl:只是把“^”作为匹配的单字:只是匹配每一行的开头 $lines =~ s/^/file_4_ex_ch7.txt: /gm;

    Perl:只是把“^”作为匹配的单字:只是匹配每一行的开头                     $lines =~ s/^/file_4_ex_ch7.txt: /gm;

  6. Servlet中转发和重定向的路径问题以及表单提交路径问题

    一.请求转发与响应重定向的种类 有两种方式获得Servlet转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher() ...

  7. 二十四、SSH介绍

    1.ssh介绍: SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输,确保了传递的数据安全.(运维的一大重视点就是要对安全敏感) 在当前的生产环境运维工作中,绝大多数企业都是SSH协议 ...

  8. iOS 去掉导航栏最下面线的方法

    导航栏透明,但是字体就不显示了,所以不可行. 下面两种方法是让导航栏下面的线不显示. // 方法1: [[self.navigationController.navigationBar.subview ...

  9. ESTScan|EORF|Augustus|nr|PSM|

    生物信息学方法的目的有二:1.常规找鉴定已知蛋白2.鉴定新蛋白 控制数据库大小可以通过增多酶切使得大数据库灵敏性增高数据量变小: 分步搜索是对于经典方法使用后找不到的新蛋白进行补充挖掘,预测蛋白与高可 ...

  10. 识别ios系统设备并获取版本号

    let isIOS = userAgent.toLowerCase().indexOf("like mac os x") > 0; //ios终端 if (isIOS) { ...