解法
2008 年 2 月,Gustavo Niemeyer 推出了 geohash,并上线了 geohash.org:一个公共领域的编码系统,可以把地理位置编码成由字母和数字组成的短字符串。这个想法是让坐标变得可以写在邮件、URL 或数据库键里。
关键在于前缀的分层结构。geohash 将纬度和经度的比特位交错,并用 base32 编码;每增加一个字符就增加五位精度,同时表示前一个单元的 32 个子单元之一。通常,相邻的位置共享前缀,去掉末尾的字符会缩小范围,但编码仍然有效。
正是这个特性让它成了标准。Elasticsearch 在文档中说明,地理点可以用 geohash 表示——即经纬度比特交错后的 base32 字符串——并用它来做索引和网格聚合,这样邻近搜索就变成了对已有索引的字符串前缀搜索。
What it achieved
一个字符串,其前缀即可表示邻近程度
为什么有效
前缀长度同时表示精度和邻近程度,一个字段就能做两件事。
短字符串比坐标对更容易分享。
现有的字符串索引无需新机制就能支持地理空间查询。
公共领域发布扫清了许可上的障碍。
可以借鉴什么
把二维问题压缩成一维键,所有现有的字符串索引就都变成了空间索引——前缀长度同时编码了精度和邻近程度,无需新机制。
后续
Geohash 成了表达和索引位置的标准方式:Elasticsearch 支持 geohash 地理点和 geohash 网格聚合,字符串形式让它天然适用于缓存、URL 和数据库键。如今它已成为地理空间索引的默认编码之一。
从这里,追溯依据
参考来源
- Geohash (lat/lon encoding) movable-type.co.uk
- Geo-point field type elastic.co
- Geohash en.wikipedia.org