Geohashes 是一种将经纬度坐标( lat/lon
)编码成字符串的方式。这么做的初衷只是为了让地理位置在 url 上呈现的形式更加友好,但现在 geohashes 已经变成一种在数据库中有效索引地理坐标点和地理形状的方式。
Geohashes 把整个世界分为 32 个单元的格子 —— 4 行 8 列 —— 每一个格子都用一个字母或者数字标识。比如 g
这个单元覆盖了半个格林兰,冰岛的全部和大不列颠的大部分。每一个单元还可以进一步被分解成新的 32 个单元,这些单元又可以继续被分解成 32 个更小的单元,不断重复下去。 gc
这个单元覆盖了爱尔兰和英格兰, gcp
覆盖了伦敦的大部分和部分南英格兰, gcpuuz94k
是白金汉宫的入口,精确到约 5 米。
换句话说, geohash 的长度越长,它的精度就越高。如果两个 geohashes 有一个共同的前缀— gcpuuz
—就表示他们挨得很近。共同的前缀越长,距离就越近。
这也意味着,两个刚好相邻的位置,可能会有完全不同的 geohash 。比如,伦敦 Millenium Dome 的 geohash 是 u10hbp
,因为它落在了 u
这个单元里,而紧挨着它东边的最大的单元是 g
。
地理坐标点可以自动索引相关的 geohashes ,更重要的是,他们也可以索引所有的 geohashes 前缀 。如索引白金汉宫入口位置——纬度 51.501568
,经度 -0.141257
—将会索引下面表格中列出的所有 geohashes ,表格中也给出了各个 geohash 单元的近似尺寸:
Geohash | Level | Dimensions |
---|---|---|
|
|
~ 5,004km x 5,004km |
|
|
~ 1,251km x 625km |
|
|
~ 156km x 156km |
|
|
~ 39km x 19.5km |
|
|
~ 4.9km x 4.9km |
|
|
~ 1.2km x 0.61km |
|
|
~ 152.8m x 152.8m |
|
|
~ 38.2m x 19.1m |
|
|
~ 4.78m x 4.78m |
|
|
~ 1.19m x 0.60m |
|
|
~ 14.9cm x 14.9cm |
|
|
~ 3.7cm x 1.8cm |
{ref}/query-dsl-geohash-cell-query.html[geohash单元
过滤器] 可以使用这些 geohash 前缀来找出与指定坐标点( lat/lon
)相邻的位置。