2017-05-25 48 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中的库代码旨在完成此操作。