在从共享出行服务到社交媒体签到的位置感知应用时代,高效处理 GPS 坐标至关重要。虽然经度和纬度很精确,但使用、存储和共享起来可能很麻烦。这就是 Geohash 发挥作用的地方。
📋 目录
核心要点
- 什么是 Geohash? Geohash 是一种将地理坐标(纬度和经度)编码为短字符串的系统。
- 为什么使用它? 它可以生成适合共享、分桶和空间过滤的候选键。
- 它是如何工作的? 它通过将世界递归地划分为网格并将每个单元格分配一个唯一的字符串来实现。字符串越长,位置越精确。
- 边界: 更长字符串代表更小单元,前缀代表父单元;两者都不等于距离度量。
Geohash 是一种地理编码约定,可将位置编码为简短的字母数字字符串。它适合表示坐标、生成候选集和索引空间分桶;实际采用的库仍需核对许可证与实现细节。
什么是 Geohash,它是如何工作的?
Geohash 是一种分层的空间数据结构,它将空间细分为单元格网格。其核心思想是用一维字符串表示二维位置(经度和纬度)。
该算法通过将世界地图逐步划分为越来越小的矩形单元格来工作。划分的每一步都会向 Geohash 字符串添加另一个字符,从而提高其精度。
Geohash 系统最出色的功能之一是字符串越长,位置越精确。这种分层特性使其非常有用。
为什么使用 Geohash?
Geohashing 具有几个显着优势:
| 特性 | 描述 |
|---|---|
| 候选检索 | 共享前缀表示处于同一父单元,并不保证真实邻近。半径查询应覆盖查询单元和相关邻居,再使用测地距离或空间谓词复核。 |
| 数据库索引 | 字符串前缀可以在许多数据库中建立索引,但查询计划、选择性、写入率、纬度和邻居扩展决定性能;原生空间索引可能更合适。 |
| URL 友好且可共享 | 像 gcpvj0d 这样的 Geohash 比一对坐标 (41.8781, -87.6298) 更容易包含在 URL 中、在短信中发送或通过电话读出。 |
如何编码和解码 Geohash
底层算法并不复杂,但生产系统应使用经过测试的库或数据库实现,并验证坐标参考系、精度和边界行为。
编码:从经纬度到 Geohash
要编码一个位置,您需要提供其经度和纬度,以及所需的精度(字符串的长度)。字符串越长,生成的网格单元格就越小。
- 输入: 纬度
41.8781,经度-87.6298,精度7 - 输出 Geohash:
dp3wjcf
解码:从 Geohash 到经纬度
要解码 Geohash,您只需提供字符串即可。该工具将返回相应矩形区域中心的经纬度坐标。它还提供该区域的边界框(东北角和西南角)。
- 输入: Geohash
dp3wjcf - 输出: 纬度
~41.8781,经度~-87.6298
解码得到的坐标通常是单元中心点,而不是原始坐标;需要准确性时,应同时保留解码单元的边界框。
边界与查询规则
- 半径跨越单元边界时查询邻居单元。
- 将字典序视为实现细节,不要当作距离排序。
- 显式处理日界线、极区变形、重复点和无效坐标。
- 候选检索后再执行精确距离、多边形谓词、租户过滤和授权检查。
结论
Geohash 是解决软件开发中一个常见问题的巧妙而实用的解决方案:如何高效地处理地理坐标。通过将复杂的经纬度对转换为简单的、可索引的字符串,它开启了快速邻近搜索,简化了数据存储,并使位置数据易于共享。
当分层矩形分桶适合负载时可以使用 Geohash;球面几何、六边形索引、大半径查询或复杂多边形场景应比较 H3、S2、R-tree 和数据库原生空间索引。