Geohash 编码

简介: Geohash编码将经纬度转换为字符串,通过不断二分地球经纬度区间,交叉组合生成区域编码,再转为Base32简化表示。它用于高效存储和查询地理位置,广泛应用于Redis、MySQL等系统,具有相同前缀的编码代表相近区域,便于空间索引与检索。

什么是 Geohash 编码?

说到这,你可能会有疑问了,在实际工作中,用户对应的都是实际的地理位置坐标,那它和二维空间的区域编码又是怎么联系起来的呢?别着急,我们慢慢说。

实际上,我们会将地球看作是一个大的二维空间,那经纬度就是水平和垂直的两个切分方向。在给出一个用户的经纬度坐标之后,我们通过对地球的经纬度区间不断二分,就能得到这个用户所属的区域编码了。这么说可能比较抽象,我来举个例子。

我们知道,地球的纬度区间是[-90,90],经度是[-180,180]。如果给出的用户纬度(垂直方向)坐标是 39.983429,经度(水平方向)坐标是 116.490273,那我们求这个用户所属的区域编码的过程,就可以总结为 3 步:

  1. 在纬度方向上,第一次二分,39.983429 在[0,90]之间,[0,90]属于空间的上半边,因此我们得到编码 1。然后在[0,90]这个空间上,第二次二分,39.983429 在[0,45]之间,[0,45]属于区间的下半边,因此我们得到编码 0。两次划分之后,我们得到的编码就是 10。
  2. 在经度方向上,第一次二分,116.490273 在[0,180]之间,[0,180]属于空间的右半边,因此我们得到编码 1。然后在[0,180]这个空间上,第二次二分,116.490273 在[90,180]之间,[90,180]还是属于区间的右半边,因此我们得到的编码还是 1。两次划分之后,我们得到的编码就是 11。
  3. 我们把纬度的编码和经度的编码交叉组合起来,先是经度,再是纬度。这样就构成了区域编码,区域编码为 1110。

你会发现,在上面的例子中,我们只二分了两次。实际上,如果区域划分的粒度非常细,我们就要持续、多次二分。而每多二分一次,我们就需要增加一个比特位来表示编码。如果经度和纬度各二分 15 次的话,那我们就需要 30 个比特位来表示一个位置的编码。那上面例子中的编码就会是 11100 11101 00100 01111 00110 11110。

这样得到的编码会特别长,那为了简化编码的表示,我们可以以 5 个比特位为一个单位,把长编码转为 base32 编码,最终得到的就是 wx4g6y。这样 30 个比特位,我们只需要用 6 个字符就可以表示了。

这样做不仅存储会更简单,而且具有相同前缀的区域属于同一个大区域,看起来也非常直观。这种将经纬度坐标转换为字符串的编码方式,就叫作 Geohash 编码。大多数应用都会使用 Geohash 编码进行地理位置的表示,以及在很多系统中,比如,Redis、MySQL 以及 Elastic Search 中,也都支持 Geohash 数据的存储和查询。

那在实际转换的过程中,由于不同长度的 Geohash 代表不同大小的覆盖区域,因此我们可以结合 GeoHash 字符长度和覆盖区域对照表,根据自己的应用需要选择合适的 Geohash 编码长度。这个对照表让我们在使用 Geohash 编码的时候方便很多。

不过,Geohash 编码也有缺点。由于 Geohash 编码的一个字符就代表了 5 个比特位,因此每当字符长度变化一个单位,区域的覆盖度变化跨度就是 32 倍(2^5),这会导致区域范围划分不够精细。

因此,当发现粒度划分不符合自己应用的需求时,我们其实可以将 Geohash 编码转换回二进制编码的表示方式。这样,编码长度变化的单位就是 1 个比特位了,区域覆盖度变化跨度就是 2 倍,我们就可以更灵活地调整自己期望的区域覆盖度了。实际上,在许多系统的底层实现中,虽然都支持以字符串形式输入 Geohash 编码,但是在内存中的存储和计算都是以二进制的方式来进行的。

重点回顾

相关文章
|
6月前
|
云安全 人工智能 搜索推荐
客户案例|皇家宠物食品:以“懂我”的温暖服务,延续每一份人宠羁绊
皇家宠物食品携手阿里云与Salesforce,打造高性能本地化客户关怀平台,实现多渠道服务整合,为宠主提供个性化、温暖的服务体验,助力科学养宠新时代。
|
6月前
|
消息中间件 人工智能 Apache
Apache RocketMQ EventBridge:为什么 GenAI 需要 EDA?
本文探讨了事件驱动架构(EDA)在AI时代的重要价值。首先,通过RAG技术缓解AI幻觉问题,提高大模型回答的准确性;其次,作为推理触发器,实现自动化任务处理和系统联动;最后,构建Agent通信基础设施,推动AI系统间的高效协作。EDA以其事件为中心、实时响应的特点,为AI系统提供感知与行动能力,是构建智能系统的关键支撑。
272 10
|
5月前
|
存储 人工智能 安全
企业级 AI Agent 开发指南:基于函数计算 FC Sandbox 方案实现类 Chat Coding AI Agent
通过 Sandbox 与 Serverless 的深度融合,AI Agent 不再是“黑盒”实验,而是可被企业精准掌控的生产力工具。这种架构不仅适配当前 AI Agent 的动态交互特性,更为未来多模态 Agent、跨系统协作等复杂场景提供了可复用的技术底座。若您的企业正面临 AI Agent 规模化落地的挑战,不妨从 Sandbox 架构入手,结合函数计算 FC 的能力,快速验证并构建安全、高效、可扩展的 AI 应用系统。
|
2月前
|
缓存 搜索推荐 算法
特别加餐丨倒排检索加速(二):如何对联合查询进行加速?
本文介绍工业界联合查询的四种加速方法:调整次序法利用集合大小差异优化求交顺序;快速多路归并法借助跳表提升多列表归并效率;预先组合法对高频查询提前计算结果;缓存法则通过LRU机制缓存热点查询,避免重复计算,全面提升检索性能。
|
2月前
|
存储 定位技术 索引
空间检索(下)
本文探讨“查找最近的加油站”与“查找附近的人”的本质区别,前者需动态调整查询范围以获取最近K个结果。通过GeoHash编码实现高效空间检索,提出逐步扩大查询范围的策略,并利用其一维排序特性,采用统一索引结构支持多级范围查询,在减少查询次数的同时降低存储开销,提升检索效率。
|
2月前
|
消息中间件 网络协议 Java
04 | 网络通信:RPC 框架在网络通信上更倾向于哪种网络 IO 模型?
本讲深入讲解RPC框架中的网络通信机制,重点分析同步阻塞IO与IO多路复用模型的原理及适用场景,阐明高并发下IO多路复用的优势。结合Netty等主流框架,探讨零拷贝技术在提升性能中的关键作用,涵盖操作系统层与用户空间的优化策略,助力构建高效、稳定的RPC通信体系。(239字)
|
2月前
|
存储 算法 搜索推荐
01 | 线性结构检索:从数组和链表的原理初窥检索本质
本文探讨数组与链表的检索原理及效率。数组支持随机访问,适合二分查找,检索效率为O(log n);链表虽检索较慢,但插入删除高效。通过合理组织数据结构,可提升检索性能,掌握其核心思想对构建高效系统至关重要。(238字)
49 0
|
5月前
|
存储 Oracle Java
|
4月前
|
Kubernetes 网络协议 Linux
ASM Ambient 模式下如何实现 L4 代理优雅升级
ASM 在 1.25 正式支持了 Ambient 模式。在 Ambient 模式下,您可以获得更好的数据面转发性能和更低的资源占用,并且仍然可以使用网格提供的绝大部分高级功能。然而由于目前 Ztunnel 组件代理了 Node 上的所有流量,很多用户对 Ztunnel 升级或重启过程中的流量中断十分关心。本文我们将详细解释Ztunnel 升级时的下线原理以及最佳实践。
267 0