【GIS新探索】GeoHash原理和编解码实现

简介: 1.什么是GeoHash         geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码。不好理解,没关系,我来找个图。         就像上面这张图,一个坐标点,可以当做一个小格子,而格子的标注就是该坐标点geohash值,当然格子越小精度越高,这个看实际应用吧。

1.什么是GeoHash

        geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码。不好理解,没关系,我来找个图。

        就像上面这张图,一个坐标点,可以当做一个小格子,而格子的标注就是该坐标点geohash值,当然格子越小精度越高,这个看实际应用吧。

2.为什么要用GeoHash

        现在我们来说说为什么要用geohash,普通的经纬度坐标不是挺好的么?

        举个栗子:我有1W+个经纬度坐标点,我现在需要查询其中一个点周围5KM范围内有哪些点,可以怎么做?

        答案一:以该点为圆心,半径5KM做圆,循环这1W+个点与圆心的直线距离,判断是否小于5KM。这种做法其实是非常常用也非常高效的。

        答案二:采用GIS二次开发组件,调用GIS接口查询该点周围5KM范围内点数据,这种做法也没有问题,虽然我不清楚GIS组件具体实现的方案是什么,但是我觉得性能应该比方案一要差点,原因很简单GIS组件都非常的庞大和复杂(以AE或者ArcGIS JS API为例)。

        以上的答案我都没有测试过,不过设想如果我把数据量扩大到100W+个坐标点呢?循环计算的计算量可想而知,如果再要求点时效性,那就为难了。这个时候我们来谈谈geohash,还是举个栗子,我选4个点,A B C D,每个点之间的距离都约5KM,如下表。

 

序号 坐标 geohash geohash长度
A 116.280159,39.9138 111001110100100011011010 5
B 116.316816,39.913551 111001110100100011011010 5
C 116.404036,39.91405 111001110100100011110000 5
D 116.46663,39.914354 111001110100100011110010 5

 

        看不懂没关系,我们再来看一张图。

 

        这张图说明什么呢,我们来对应看一下两张表的“geohash长度”,拿5级别为例,看KM误差,意思是在5级别如果geohash相同,说明两个点的距离误差在2.4*2=4.8KM左右(+-算左右两次)。再看看表中A和B的geohash是一样的,说明A和B距离在5KM范围内,而A与C、D都不在5KM范围内。不信,我们来看看地图。

        由于是手动取点坐标有一定误差,不过不影响结果演示。这时候我们再回来开始那个问题,我有1KW+个点,需要找到某点5KM范围内的数据,我可以把这些坐标全部转为第5级别的geohash值,然后SQL查询等于这个点geohash值的所有数据即可。所以geohash适合于快速查询且对绝对精度要求不高的业务场景。

        下图是某年参加ArcSummit会议滴滴某位技术大咖分享的滴滴内部使用geohash快速查询周边车辆信息的PPT截图。PPT下载

 

3.JS实现GeoHash编解码

具体代码麻烦移步个人博客:http://www.88gis.cn/web/pages/blog/blogInfo.html?id=fd587a3e-f7df-41c8-8503-8f4a298e80c4

相关文章
|
8月前
|
JavaScript 前端开发 关系型数据库
GIS开发:GeoJSON坐标和WKT的转换
GIS开发:GeoJSON坐标和WKT的转换
498 0
|
29天前
|
编解码 API 数据处理
【摄像头数据处理】摄像头数据处理:使用FFmpeg合并、编码和封装视频流
【摄像头数据处理】摄像头数据处理:使用FFmpeg合并、编码和封装视频流
48 0
|
1月前
|
Web App开发 存储 网络协议
C/C++ 数据结构设计与应用(四):C++数据压缩与传输:从理论到实践的全景解析
C/C++ 数据结构设计与应用(四):C++数据压缩与传输:从理论到实践的全景解析
58 3
|
4月前
|
监控 算法 数据库
入门了解——三维人脸数据的优点
入门了解——三维人脸数据的优点
24 0
|
6月前
|
NoSQL 定位技术 Redis
Redis学习笔记-GEO经纬度编码原理&地理划分
Redis学习笔记-GEO经纬度编码原理&地理划分
63 1
|
9月前
|
编解码 算法 定位技术
GIS开发:切片格式说明(翻译)-wgs84
GIS开发:切片格式说明(翻译)-wgs84
|
9月前
|
存储 编解码 算法
GIS开发:切片格式说明(翻译)-墨卡托
GIS开发:切片格式说明(翻译)-墨卡托
112 0
|
存储 编解码 定位技术
GIS开发:tianditu切片计算
GIS开发:tianditu切片计算
134 0
|
前端开发 定位技术 Python
GIS开发:分享osm切片计算
GIS开发:分享osm切片计算
166 0
|
存储 JavaScript 前端开发
GIS开发:简单的数据差值
GIS开发:简单的数据差值
102 0
GIS开发:简单的数据差值

热门文章

最新文章