hilbert曲線用於空間索引

2021-08-03 13:00:46 字數 2324 閱讀 8814

前文我們介紹了hilbert曲線的原理以及,其在n*n方格中的排列以及編碼解碼的實現。而本文主要介紹其在空間索引中如何應用。其原理參考上文,待看懂原理之後,如下**便能一下理解

1.確定hilbert的形狀以及對映規則

hilbert_map = ,

'b': ,

'c': ,

'd': ,

}un_hilbert_map = ,

'b': ,

'c': ,

'd':

}

2.如下為編碼**,原理如前文

//編碼

defpoint_to_hilbert

(lng,lat, order=16):

print

'point_to_hilbert'

lng_range = [-180.0, 180.0]

lat_range = [-90.0, 90.0]

current_square = 'a'

position = 0

for i in range(order - 1, -1, -1):

position <<= 2

lng_mid = (lng_range[0]+lng_range[1])/2

lat_mid = (lat_range[0]+lat_range[1])/2

if lng >= lng_mid :

quad_x = 1

lng_range[0] = lng_mid

else:

quad_x = 0

lng_range[1] = lng_mid

if lat >= lat_mid :

quad_y = 1

lat_range[0] = lat_mid

else:

quad_y = 0

lat_range[1] = lat_mid

quad_position,

current_square = hilbert_map[current_square][(quad_x, quad_y)]

position |= quad_position

return position

2.如下為解碼**

//同理,解碼

defhilbert_to_point

( d , order=16):

print

'hilbert_to_point'

lng_range = [-180.0, 180.0]

lat_range = [-90.0, 90.0]

current_square = 'a'

lng=lat=lng_mid=lat_mid=0

for i in range(order - 1, -1, -1):

lng_mid = ( lng_range[0] + lng_range[1] ) / 2

lat_mid = ( lat_range[0] + lat_range[1] ) / 2

mask = 3

<< (2*i)

quad_position = (d & mask) >> (2*i)

quad_x, quad_y,

current_square= un_hilbert_map[current_square][quad_position]

if quad_x:

lng_range[0] = lng_mid

else:

lng_range[1] = lng_mid

if quad_y:

lat_range[0] = lat_mid

else:

lat_range[1] = lat_mid

lat = lat_range[0]

lng = lng_range[0]

return lng,lat

3.接下來進行檢驗:

if __name__ == '__main__':

d = point_to_hilbert(-43.2223344,72.575543,36)

print d

lng,lat = hilbert_to_point(d,36)

print lng,lat

得到結果:

point_to_hilbert

1920055405694602539487

hilbert_to_point

-43.2223344018

72.5755429978

Hilbert曲線簡單介紹及生成演算法

hilbert曲線 hilbert曲線是一種填充曲線,相似的填充曲線還包含z曲線。格雷碼等其它方法。hilbert曲線根據自身空間填充曲線的特性,能夠線性地貫穿二維或者更高維度每乙個離散單元。而且只穿過一次,並對每乙個離散單元進行線性排序和編碼。該編碼作為該單元的唯一標識。空間填充曲線能夠將高維空間...

索引 index 用於

根據 mysql 的開發文件 索引 index 用於 o 快速找出匹配乙個where子句的行 o 當執行聯結 join 時,從其他表檢索行。o 對特定的索引列找出max 或min 值 o 如果排序或分組在乙個可用鍵的最左面字首上進行 例如,order by key part 1,key part 2...

索引 index 用於

根據 mysql 的開發文件 索引 index 用於 o 快速找出匹配乙個where子句的行 o 當執行聯結 join 時,從其他表檢索行。o 對特定的索引列找出max 或min 值 o 如果排序或分組在乙個可用鍵的最左面字首上進行 例如,order by key part 1,key part 2...