0

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

这是我的 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)

问题是去索引的数据不准确,不像原始数据,我需要准确的索引,小数点后至少有 6 个第一位数字。

程序的输出(去索引的数据)

24.664232570759083 46.692474695432026 2678400
4

2 回答 2

4

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

通常,您会使用一维索引值来缩小查询范围,然后检索存储在它们旁边的确切值。

于 2017-05-25T13:29:44.757 回答
4

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

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

作为一个简单的示例,假设您对经度/纬度进行编码/索引,每个维度只有 1 位信息。这将创建 4 个单元格;每个都是半个半球。如果是这种情况,北半球西半部的所有数据都将在同一个桶中。

给定该索引中的一个点,有两个操作/问题值得提出。首先是要求覆盖该点的整个边界框。第二个是在索引单元格中要求一个代表点。您提到的“反转”方法是后者。作为一个实现细节,我相信它会选择边界框的中心。这就是为什么编码和反转一个点可能会“移动”一点。

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

于 2017-05-25T16:06:22.440 回答