【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

相关文章
|
4月前
|
SQL 关系型数据库 分布式数据库
用Ganos低代码实现免切片遥感影像浏览
本文介绍了一种基于PolarDB兼容PostgreSQL 14的高效栅格数据管理和可视化方案。推荐配置包括4核CPU、16GB内存、50GB磁盘等。通过创建扩展并上传影像至OSS,利用SQL语句完成数据导入、镶嵌、匀色及金字塔构建。重点介绍了使用ST_AsTile函数动态生成标准瓦片的方法,支持多种格式和增强方式。前端通过Python实现服务接口,实现实时、高效的数据展示。此方案具有实时性强、存储成本低等优点,适合快速可视化大量栅格数据。
58 0
|
5月前
|
编解码
ENVI无缝镶嵌、拼接栅格数据的方法
【8月更文挑战第10天】使用ENVI进行无缝镶嵌的方法包括:准备具有一致空间参考的栅格数据;通过“File”菜单逐个加载数据;启动“Seamless Mosaic”工具;添加待镶嵌图像;调整几何校正、颜色平衡及羽化参数以平滑过渡;设定输出路径与格式;最后执行镶嵌并检查结果质量,必要时微调参数直至满意。
437 1
|
8月前
|
存储 数据可视化 Cloud Native
用Ganos低代码实现免切片遥感影像浏览(二):动态栅格瓦片
本文介绍了Ganos全新发布了动态栅格瓦片能力,帮助用户将库内栅格数据或栅格分析结果快速可视化,无需依赖类似GeoServer等空间服务中间件,技术栈短平快,使用灵活高效。
|
NoSQL 定位技术 Redis
Redis学习笔记-GEO经纬度编码原理&地理划分
Redis学习笔记-GEO经纬度编码原理&地理划分
265 1
|
前端开发 关系型数据库 定位技术
用Ganos低代码实现免切片遥感影像浏览(一)
本文介绍了使用PolarDB-PG数据库配合Ganos时空数据库引擎,不借助第三方工具仅利用SQL语句快速管理与展示遥感影像数据的一种方法。Ganos共提供两种影像免切浏览的方法,一种使用窗口范围获取影像数据展示,另一种通过固定瓦片范围获取影像数据展示,本文详细介绍第一种方法并提供了前后端实操代码帮助用户可以快速理解Ganos Raster的使用细节。
|
存储 编解码 算法
GIS开发:切片格式说明(翻译)-墨卡托
GIS开发:切片格式说明(翻译)-墨卡托
196 0
|
存储 JavaScript 前端开发
GIS开发:简单的数据差值
GIS开发:简单的数据差值
170 0
GIS开发:简单的数据差值
|
存储 编解码 定位技术
GIS开发:tianditu切片计算
GIS开发:tianditu切片计算
256 0
|
前端开发 定位技术 Python
GIS开发:分享osm切片计算
GIS开发:分享osm切片计算
266 0
|
算法 定位技术 C#
分享常用的gis算法(C#)
分享常用的gis算法(C#)
181 0