2017-05-25 10 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次元インデックスを作成します。

これは2段階の処理です。最初のステップでは、各ディメンションで使用するビット数を選択します。この選択は、カーブ/インデックスの解像度を設定します。

単純な例として、次元ごとに1ビットの情報だけを使用して経度/緯度を符号化/索引付けしたとします。これは4つの細胞を作り出します。各半球は半球である。この場合、北半球の西半分のすべてのデータは同じバケットになります。

このインデックスには、2つの操作/質問があります。最初は、ポイントをカバーするバウンディングボックス全体を尋ねることです。 2つ目は、索引付けされたセル内の代表点を求めることです。あなたが言及した '反転'方法は、後者を行うことです。実装の詳細として、私はバウンディングボックスの中心を選択すると信じています。これは、ポイントを符号化して反転することが、それを少し「動かす」ことができる理由です。

GeoMesaのようなシステムでこのアプローチを使用するには、空間範囲クエリが空間範囲でカバーされるすべてのセルを調べる必要があります。 GeoMesaSFCurveのライブラリコードは、これを正確に行うように設計されています。

関連する問題