前文我們介紹了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...