Geomesa位置索引不准确

时间:2017-05-25 12:35:58

标签: geolocation geospatial spatial-index geomesa

我正在使用Geomesa索引使用库将3D位置数据(经度,纬度,时间)索引到1D索引数据中。

这是我的Scala代码

watch:{
   tasks(newVal){
        this.taskList = newVal;
      //do something
   }
}

问题是去索引数据不准确,与原始数据不一样,我需要在小数点后至少相同的6位数进行精确索引。

程序输出(去索引数据)

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)

2 个答案:

答案 0 :(得分:4)

GeoMesa索引是一种有损编码 - 它旨在快速缩小搜索空间以进行查询。如您所见,它精确到大约3个小数位 - 大致相当于100 meters。它并不意味着完美地编码和解码位置数据。

通常,您可以使用1维索引值来缩小查询范围,然后检索与它们一起存储的确切值。

答案 1 :(得分:4)

为了扩展Emilio的答案,GeoMesa使用空间填充曲线方法为多维数据创建一维索引。

这是一个两步过程。第一步是选择要在每个维度中使用的位数。此选项设置曲线/索引的分辨率。

作为一个简单的例子,假设您为每个维度仅使用1位信息编码/索引经度/纬度。这会产生4个细胞;每个都是半个半球。如果是这种情况,北半球西半部的所有数据都将在同一个桶中。

鉴于该指数中的一点,有两个值得询问的操作/问题。第一个是要求覆盖该点的整个边界框。第二是要求索引单元格中的代表点。 '倒置'你提到的方法是做后者。作为一个实现细节,我相信它选择了边界框的中心。这就是为什么编码和反转一个点可以移动'它有点。

为了在像GeoMesa这样的系统中使用这种方法,空间范围查询需要查看空间范围覆盖的所有单元格。 GeoMesaSFCurve中的库代码就是为此而设计的。