空間數據庫系列二:空間索引S2與Z3分析對比

1.S2

Google S2 被用在Google Map、MongoDB、Foursquare上,用來解決多維空間點索引的問題的。S2主要是把三維空間數據降維爲一維UINT64表示的數據。球面上的點S(lat,lng) -> f(x,y,z) -> g(face,u,v) -> h(face,s,t)->cellid(uint64)。球面經緯度座標轉換成球面xyz座標,再轉換成外切正方體投影面上的座標,再變換成修正後的座標h(face,s,t),最後經過希爾伯特曲線變換爲64bit的數值。git

S2共30級,範圍:github

2.geohash

Geohash 是一種地理編碼,它是一種分級的數據結構,分爲12級,把空間劃分爲網格。Geohash屬於二維空間填充曲線中的Z階曲線的實際應用。算法

表示範圍以下:數據結構

image

3.Geomesa Z3

Z3是geomesa提供的基於三維Z階填充曲線的索引編碼,對經緯度+時間進行編碼。因此空間處理上與geohash具備形同特色。函數

4.S2對比geohash

目前大數據領域處理時空數據的方式是,經過geohash/S2對用戶空間或軌跡數據降維爲一維字符串,存儲到DB(例如hbase)系統裏面。查詢時,根據給出的範圍(用BBOX,DISTANCE表示)等,在geohash/S2上映射出知足對應精度及範圍的一組一維range(每組range表示知足條件的cell)。經過這些一維數據的前綴鄰近性原則在DB的key上搜索知足條件的解碼後二次過濾。測試

4.1 geohash存在的問題

  • geohash鄰近點查詢是先查找點所在的單元,而後根據所在的單元查詢相同level相鄰的8個單元,這就意味着須要在咱們的DB(Hbase)中查詢9個cell範圍內的數據,來過濾出來進步二次查詢。網格大小選擇很差,會引入較大查詢。大數據

例如:查詢離紅星最近點,若是Geohash 字符串爲6的話,就是藍色的大格子。紫色的圓點是搜索出來的目標點。若是用 Geohash 算法查詢的話,距離比較近的多是 wtw37p,wtw37r,wtw37w,wtw37m。可是其實距離最近的點就在 wtw37q。若是選擇這麼大的網格,就須要再查找周圍的8個格子。ui

若是選擇 Geohash 字符串爲7的話,那變成黃色的小格子。這樣距離紅星星最近的點就只有一個了編碼

  • geohash是按照1-12級把空間劃分紅cell,不一樣級別的cell範圍從5000KM到3.7cm。不一樣級別間跳變很大。好比選擇字符串長度爲4,它對應的 cell 寬度是39.1km,需求多是50km,那麼選擇字符串長度爲3,對應的 cell 寬度就變成了156km,瞬間又大了3倍了。實際中選擇合適的level比較困難。spa

  • geohash範圍覆蓋時,一樣存在level選擇上問題,可能用較大的cell覆蓋查詢範圍。

  • Z曲線突變性,會致使某些編碼相近可是實際距離很遠的狀況。

4.2.S2優點

  • S2 有30級,表示範圍從0.7cm² 到 85,000,000km²,中間變化平緩。

  • S2主要優點是他的範圍覆蓋算法。給定一個查詢範圍以及指望返回的最多網格數,S2就能夠返回覆蓋查詢區域不一樣等級level的cell,每一個cell對應在DB(HBASE)中查詢的範圍。S2的返回很精確,會減小從DB的讀取數據量。

  • 功能上:S2提供了較豐富的查詢函數。很容易實現distance,多邊形範圍查詢等,以及各類計算面積,距離等處理。參考這裏S2 doc

4.3.實際對比例子

採用矩形覆蓋巴黎,level 5 9個cell不能覆蓋巴黎左邊區域,能夠增長3個cell,總計12個cell:

image

大部分算法,採用level 4,9個cell覆蓋巴黎,以下:

image

採用S2算法,9個cell覆蓋巴黎與geohash對好比下:

image

5.測試

在TSDB上實現S2索引存儲到Hbase。hbase rowkey格式相似:shard(2B)+days(2B)+z3/S2(8B)+point(4B+4B)+time(8B)+objid

分別對比了S2和Z3,在兩個數據集上的表現

  • 2400W geo_life
數聽說明:182我的三年的GPS活動軌跡。
查詢:BBOX[100.21831, 30.0, 127.21831,80.136253] time:[2007-08-04 11:30:32, 2007-08-13 16:32:52]
真實命中11條數據。
數據Z3編碼耗時 Z3 BBOX 查詢 數據S2編碼耗時 S2 BBOX 查詢
518ms Z3索引命中hbase:15309條數據,查詢耗時1461ms 1318ms S2索引命中hbase:15310條,查詢耗時877ms
  • 100W軌跡數據
數聽說明:從[-30,-20]移動到[-20,-10],每秒經緯度移動0.00001,每秒位置記錄;特色數據密度大。
查詢:BBOX[-25.50, -18.60, -20.00,-15.40] time:[2018-07-14 01:58:15,2018-07-19 20:51:35]
真實命中:10001條數據
100W數據Z3編碼耗時 Z3 BBOX 查詢 100W數據S2編碼耗時 S2 BBOX 查詢
1185ms 查詢耗時2975ms (Z3索引命中hbase:211400條數據) 518ms 查詢耗時375ms (S2索引命中hbase:60969條)

參考

1. geohash在線驗證
2. 高效的多維空間點索引算法 — Geohash 和 Google S2

相關文章
相關標籤/搜索