空间填充曲线是指,一维曲线去包含整个二维甚至多维空间的一种函数曲线。而根据不同的排列规则,可以得到不同的空间填充曲线。
如Z-order曲线, 如图1(也就是geohash采取的曲线),Peano曲线如图2,以及本文将介绍的Hilbert曲线如图3。
图1
图2
图3
Hilbert曲线以及其离散近似表示方法都非常实用,因为其将多维空间转换为一维空间的方法很好地保留了空间邻近性。(x,y)是一个单元方格中的点,d代表该点在Hilbert曲线上的位置,而由于其空间的邻近性,在单元格上近似的点,其对应Hilbert的d值也比较接近。
正因为这种邻近性,空间填充曲线被广泛用于计算机科学,且在多维数据库索引中,经常用Hilbert曲线取代Z order曲线。接下来我们看如何用代码实现Hilbert算法。
现在假设我们以U字形来访问区域。在每个象限中,我们同样以U字形来访问子象限,但是要调整好U字形的朝向使得和相邻的象限衔接起来。如果我们正确地组织了这些U字形的朝向,我们就能完全消除不连续性,不管我们选择了什么分辨率,都能连续地访问整个区域。
图4
如图4,在第一层,枚举这些点很简单:选定一个方向和一个起始点,环绕四个象限,用0到3给他们编号。当我们要确定访问子象限的顺序