ジオポイントと関連データをブラウザのIndexedDBに保存し、緯度/経度の位置を指定してX個の最も近いポイントを見つけられるようにしたいと思います。データセットには数千のポイントが含まれる可能性があるため、効率を考慮する必要があります。このタイプのクエリに利用できる既存のソリューションはありますか?特定のジオポイントに近いポイントを見つけることができるように、インデックスを作成するにはどうすればよいですか?
質問する
1754 次
1 に答える
2
2つの変数をクエリするために、IndexedDBには、手動マージと複合インデックスの使用という2つのオプションがあります。
手動でマージする場合は、latとlongにインデックスを付けるだけで済みます。次に、キーカーソルでキー範囲クエリを実行します。交差点が結果です。結果は主キーです。結果の主キーを使用して、完全なレコードを取得します。
var r = 10; // require distance
lat_range = IDBKeyRange.bound(query_lat - r, query_lat + r);
long_range = IDBKeyRange.bound(query_long - r, query_long + r);
obj_store = db.objectStore('geopoint');
lat_key_cursor = obj_store.index('lat').openKeyCursor(lat_range);
long_key_cursor = obj_store.index('long').openKeyCursor(long_range);
// get primary keys from cursors, sort and find intersection as results
var cursor = obj_store.openCursor(results.shift());
cursor.onsuccess = function(e) {
console.log(e.target.result);
if (results.length > 0) {
cursor.continue(results.shift());
}
}
Latとlongは、index keyPathをarray、['lat'、'long']として指定することにより、配列複合インデックスとしてインデックスを付けることができます。次に、「lat」の範囲クエリをクエリします。有効なキーの結果は「長い」です。指定された範囲で「long」をフィルタリングし、完全なレコードを照会します。
var compound_index = obj_store.index('lat, long');
var range = IDBKeyRange.bound([query_lat - r], [query_lat + r]);
var cursor = compound_index.openKeyCursor(range);
cursor.onsuccess = function(e) {
var key = e.target.result.key();
var lat = key[0];
var long = key[1];
if (long > query_long - r && long < query_long + r) {
// we get result
var req = obj_store.get(e.target.result.primaryKey());
req.onsuccess = function(e2) {
console.log(e2.target.result);
}
}
}
于 2012-12-24T02:08:17.947 に答える