Geohash
Geohash 如何把经纬度编码成字符串?
- Geohash: 把经纬度编码成 Base32 字符串的分层空间索引,字符串前缀代表一个地理网格;
- 细分: 每增加一个字符,把前缀对应区域再分成 32 个子区域,字符串越长表示的区域越小;
- 例子: 原文将旧金山附近坐标
37.7564, -122.4016编码为9q8yy9mf; - 使用价值: 便于存储、构建字符串索引和在 URL 中表达位置,也可降低暴露位置的精度;
- 隐私边界: 缩短编码只能模糊单次位置,连续轨迹仍可能识别用户,不能称为充分匿名;
| 长度 | 原文给出的近赤道网格宽 × 高约值 |
|---|---|
| 1 / 2 | 5000 × 5000 km / 1250 × 625 km |
| 3 / 4 | 156 × 156 km / 39.1 × 19.5 km |
| 5 / 6 | 4.89 × 4.89 km / 1.22 × 0.61 km |
| 7 / 8 | 153 × 153 m / 38.2 × 19.1 m |
| 9 / 10 | 4.77 × 4.77 m / 1.19 × 0.596 m |
| 11 / 12 | 149 × 149 mm / 37.2 × 18.6 mm |
- 数值修正: 原文长度 2 的高度误写为 1250 km;根据经纬各占位数推算约为 625 km,网格东西宽度随纬度变化;
Geohash 查询如何避免漏掉网格边界附近的邻居?
- 前缀意义: 相同长前缀说明位于同一小网格,但距离很近的两点可能跨越边界而具有不同前缀;
- 查询路径: 查询覆盖目标范围的多个网格,合并去重后,再用实际坐标计算距离过滤;
- 误差处理: 网格包围区域不是精确圆形,需要移除矩形角落等假阳性结果;
- 参考: Firestore 地理查询文档展示了多范围查询与距离过滤;
- 原文示例: MySQL、Redis、DynamoDB、Firestore 可结合各自能力支持空间查询,不代表接口完全相同;