geohash的特点,局限性和思考
来源:互联网 发布:中国的地位知乎 编辑:程序博客网 时间:2024/05/18 00:18
geohash原理
原理参考: http://blog.jobbole.com/80633/,其实就是有限二分法而已
使用场景
一般用于查找周边,具体可以网上百度
为什么不直接使用经纬度
- 如果查找周边,使用经纬度,需要用到经度>多少,经度<多少,纬度>多少,纬度<多少,在数据库中就用不到索引
- 有的人认为如果确定了多少米的范围,那么直接使用经纬度的某个经度,合在一起,也可以作为一维,例如纬经度分别为22.21315,41.59874 作为一个字段,只需要控制纬度多少位,经度多少位即可。但是这也意味着固定死了某个经纬度,geohash的优势还在于,根据不同的位数,可以得到不同的范围
局限性
个人认为的局限性有以下几点:
1. 不能做排序,真要做排序,而且还用geohash,那只能查出来,然后对查出来的部分做排序
2. 由于用的是经纬度的有限二分,并且使用的是5个bit位做一个base32编码,那么geohash的精度问题就比较固定。官方的经纬度
当然这个精度可以进行改进,只需要控制好经纬度的位数,就可以控制好经纬度的误差,当然就能控制km的误差,参考这篇文章的改进: https://my.oschina.net/shipley/blog/704964
当然,基于这篇文章,还可以根据自己的需求进一步进行改进,比如前几位用5位进行base32编码,后几位可以用三位,或者二位进行base32编码,这需要看自己的精度控制。但是整体说来,精度还是如下:
现在的每一位,可以更精确了。
3. 求的周边并不是一个圆,也不是一个正方形,大多数情况是一个长方形,具体参考上面的两个表
- 部分点不准确
位于格子边界两侧的两点, 虽然十分接近,但编码会完全不同,可以同时搜索当前格子周围的8个格子,即可解决这个问题
有没有其他的办法
栅格法: 其实geohash就类似于一种栅格法:
下面介绍自己曾用过的两种栅格的方法
方法1: 例如对桂林进行栅格化,那么找出桂林左下角纬经度为原点,lat0,lng0, 对整个北京进行栅格的划分,比如10m作为一个栅格,我们可以计算出每10米的纬度为0.00009°,经度大约为0.0001°,那么按照这个经纬度进行划分栅格即可。如果有一个点,需要计算落在哪个经纬度内,那么x=(lat-lat0)/0.00009,y=(lng-lng0)/(0.0001)
方法二:对每一个经纬度*1000000,例如32.1256232,114.2135123 乘以1000000为 321256232,1142135123, 对于纬度,我们圆整900,经度,圆整1000,计算出栅格的左下角经纬度
例如 (321256232/900)*900, (1142135123*1000)/1000,算出的就是左下角的经纬度了,对于一个栅格内的,圆整后,都属于这个左下角的经纬度
代码
原理很简单,代码更简单,直接去github上搜索geohash就行了,各种语言的都有
- geohash的特点,局限性和思考
- CRM的特点及其局限性
- DRA的功能和局限性
- 机器翻译的能力和局限性
- NAND的局限性和使用寿命
- NAND的局限性和使用寿命
- 时间局限性和空间局限性
- 139说客的优势和局限性
- CSS定位属性的优点和局限性
- 增强for循环的比较和局限性
- CT和MRI的局限性分析
- 优化编译器的能力和局限性
- Java泛型的约束和局限性
- FragmentPagerAdapter和FragmentStatePagerAdapter的区别以及局限性
- 测试的局限性和自动化随机测试
- geohash算法原理及实现方式 1、geohash特点
- CT和MRI的局限性和克服措施
- Geohash的原理、算法和具体应用探究(优秀)
- 高斯消元模板
- MR英语单词频次统计案例-----wordcount
- Lesson03_python3之 编码格式
- 剑指Offer_面试题04_替换空格
- Python中的字典与C语言中的switch结构类比
- geohash的特点,局限性和思考
- 学习之旅3
- 为什么 react 中要使用 redux
- Android开发 之 activity跳转动画(补间动画跳转)
- Unity中协程方法使用
- Java并发编程基础
- linux驱动 并发策略
- 数组(java)
- 研究外链对seo还有效果