geohash:多维空间点的编码方法和索引算法

Geohash是一种地理编码方法,基于Z阶曲线的空间填充原理,常用于空间数据检索。它将空间划分为网格,通过字符串表示地理位置,允许快速查找邻近点。在数据库如PostGIS、MySQL等中,Geohash被用于存储和检索几何数据。其优点在于利用局部保序性简化搜索,但也存在突变性和选择合适网格大小的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能是专业限制吧,相对于索引算法,我更偏向于geohash是一种编码方式,但编码也是为了方便检索嘛;就像Rtree也算是一种索引算法,但我还是更偏向于它是一种数据组织形式。

我们了解geohash的原理就行,因为它毕竟是最常用的空间数据检索算法或编码方法。常用的空间数据库或程序包,很多都内嵌了geohash,例如postgis、jts、shapely等。Postgresql、MySQL等数据库,存储几何数据,用的也是geohash编码。

所以不要太纠结,geohash到底是一个索引算法,还是编码方式,它都是。

 

以下原理部分,我仅仅是从(https://halfrost.com/go_spatial_search/)做了个搬运,这个是我看写geohash比较清楚的了。

 

1. Geohash 算法简介

Geohash 是一种地理编码,由 Gustavo Niemeyer 发明的。它是一种分级的数据结构,把空间划分为网格。Geohash 属于空间填充曲线中的 Z 阶曲线(Z-order curve)的实际应用。

 

何为 Z 阶曲线?

 

 

上图就是 Z 阶曲线。这个曲线比较简单,生成它也比较容易,只需要把每个 Z 首尾相连即可。

 

Z 阶曲线同样可以扩展到三维空间。只要 Z 形状足够小并且足够密,也能填满整个三维空间。

Geohash算法的理论基础就是基于Z曲线的生成原理。继续说回 Geohash。

 

Geohash 能够提供任意精度的分段级别。一般分级从 1-12 级。

 

geohash简介: geohash是一种地址编码,它能把二维的经纬度编码成一维的字符串。geohash有以下几个特: 首先,geohash用一个字符串表示经度纬度两个坐标。某些情况下无法在两列上同时应用索引 (例如MySQL 4之前的版本,Google App Engine的数据层等),利用geohash,只需在一列上应用索引即可。 其次,geohash表示的并不是一个,而是一个矩形区域。比如编码wx4g0ec19,它表示的是一个矩形区域。 使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。 第三,编码的前缀可以表示更大的区域。例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围。 这个特性可以用于附近地搜索。首先根据用户当前坐标计算geohash(例如wx4g0ec1)然后取其前缀进行查询 (SELECT * FROM place WHERE geohash LIKE 'wx4g0e%'),即可查询附近的所有地Geohash比直接用经纬度的高效很多。用途: 移动互联网,lbs可以说是一个基础应用,geohash对于解决附近地搜索提供了一个有效的解决方案。扩展: 这个php扩展,提供了三个函数:/**     *  $latitude    //纬度     *  $longitude   //经度     *  $precision   //精密度, 默认是12     *  返回 $precision 长度的 string     */    geohash_encode($latitude, $longitude, $precision=12);      /**     *  $hash    //geohash_encode后的值     *  返回 array // Array     *                    (     *                        [latitude] => 39.416916975752     *                        [longitude] => 100.92223992571     *                        [north] => 39.416917059571     *                        [east] => 100.92224009335     *                        [south] => 100.92223992571     *                        [west] => 100.92223975807     *                    )     */    geohash_decode($hash);    /**     *  $hash    //geohash_encode后的值     *  返回 在$hash 8个 (东南西北各二个)附近的hash值     */    geohash_neighbors($hash); 标签:geohash
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值