2017-05-25 69 views
0

我正在使用Geomesa索引使用的庫索引3D位置數據(經度,緯度,時間)到1D索引數據。Geomesa位置索引是不準確的

這裏是我的Scala代碼

var z3Indexer = new Z3SFC(TimePeriod.Month); 
var z3 = z3Indexer.index(24.664152, 46.692425, 2678400) 

var invertedIndex = z3Indexer.invert(z3); 
println(invertedIndex._1+" "+invertedIndex._2+" "+invertedIndex._3) 

的問題是,deindexed數據不準確,不喜歡原來的數據,我需要小數點後至少6個相同的第一個數字精確索引。該方案的

輸出(deindexed數據)

24.664232570759083 46.692474695432026 2678400 

回答

4

的GeoMesa索引是一種有損編碼 - 它的目的是迅速縮小搜索空間進行查詢。正如你所看到的,它精確到約3位小數 - 大致相當於100 meters。這並不意味着完美編碼和解碼位置數據。

通常,您將使用1維索引值來縮小查詢範圍,然後檢索存儲在其旁邊的確切值。

3

爲了擴展Emilio的答案,GeoMesa使用空間填充曲線方法爲多維數據創建一維索引。

這是一個兩步過程。第一步是在每個維度中選擇一些位來使用。該選項設置曲線/指數的分辨率。

作爲一個簡單的例子,假設您爲每個維度僅用1位信息編碼/索引經度/緯度。這將創建4個單元格;每個都是半個半球。如果是這種情況,北半球西半部的所有數據都會在同一個桶中。

鑑於此索引中的一點,有兩個值得詢問的操作/問題。首先是要求覆蓋點的整個邊界框。第二個要求索引單元中的代表點。你提到的'反轉'方法是做後者。作爲一個實現細節,我相信它選擇了邊界框的中心。這就是爲什麼編碼和反轉點可能會「移動」一點點。

爲了在像GeoMesa這樣的系統中使用這種方法,空間範圍查詢需要查看空間範圍覆蓋的所有單元。 GeoMesaSFCurve中的庫代碼旨在完成此操作。