我正在使用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)
答案 0 :(得分:4)
GeoMesa索引是一种有损编码 - 它旨在快速缩小搜索空间以进行查询。如您所见,它精确到大约3个小数位 - 大致相当于100 meters。它并不意味着完美地编码和解码位置数据。
通常,您可以使用1维索引值来缩小查询范围,然后检索与它们一起存储的确切值。
答案 1 :(得分:4)
为了扩展Emilio的答案,GeoMesa使用空间填充曲线方法为多维数据创建一维索引。
这是一个两步过程。第一步是选择要在每个维度中使用的位数。此选项设置曲线/索引的分辨率。
作为一个简单的例子,假设您为每个维度仅使用1位信息编码/索引经度/纬度。这会产生4个细胞;每个都是半个半球。如果是这种情况,北半球西半部的所有数据都将在同一个桶中。
鉴于该指数中的一点,有两个值得询问的操作/问题。第一个是要求覆盖该点的整个边界框。第二是要求索引单元格中的代表点。 '倒置'你提到的方法是做后者。作为一个实现细节,我相信它选择了边界框的中心。这就是为什么编码和反转一个点可以移动'它有点。
为了在像GeoMesa这样的系统中使用这种方法,空间范围查询需要查看空间范围覆盖的所有单元格。 GeoMesa和SFCurve中的库代码就是为此而设计的。