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的數值。
S2共30級,范圍:

2.geohash
Geohash 是一種地理編碼,它是一種分級的數據結構,分為12級,把空間划分為網格。Geohash屬於二維空間填充曲線中的Z階曲線的實際應用。
表示范圍如下:
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個格子。
如果選擇 Geohash 字符串為7的話,那變成黃色的小格子。這樣距離紅星星最近的點就只有一個了
-
geohash是按照1-12級把空間划分成cell,不同級別的cell范圍從5000KM到3.7cm。不同級別間跳變很大。比如選擇字符串長度為4,它對應的 cell 寬度是39.1km,需求可能是50km,那么選擇字符串長度為3,對應的 cell 寬度就變成了156km,瞬間又大了3倍了。實際中選擇合適的level比較困難。
-
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:
大部分算法,采用level 4,9個cell覆蓋巴黎,如下:
采用S2算法,9個cell覆蓋巴黎與geohash對比如下:
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條) |