7

私のチームは、主に場所と座標を含む大量のデータを保存するために、DynamoDB のような DBMS を必要としています。POINT のインデックスを使用して GIS ベースの DBMS (PostGIS など) を使用することを検討しましたが、DynamoDB は私たちの使用に適しているようです。

座標を保存し、特定の半径内のすべてのオブジェクトをすばやく取得するための最良の方法は何ですか?

PostGIS では、次のように簡単です。

SELECT *
FROM places
WHERE ST_DWithin(coordinate, ST_GeomFromText('POINT(45.07085 7.68434)', 4326), 100.0);

NoSQL DBMS でそのようなことを行うにはどうすればよいですか?

4

3 に答える 3

5

同じ問題がありました。特に AWS と DynamoDB を使用しています。CloudSearch サービスを使用してこの問題を解決しました。データベースに「地理検索可能な」データを保存するたびに、緯度、経度をフィルターとして CloudSearch インスタンスのデータにインデックスを付けます (これを行うには、緯度と経度で変換を行う必要があります)。 lon を使用して uint に変換します)。

次に、特定の緯度/経度と半径で検索を行い、対応するジオボックス ( latmin、latmax 、 lonmin、lonmax ) を計算し、特定のフィルターを使用して CloudSearch インスタンスにクエリを実行して、データのキー スキーマを取得するとします。その後、DynamoDB にクエリを実行して情報を取得できます。

上記を行うJavaのコード:

Tyler Coles による com.javadocmd.simplelatlng.window パッケージの RectangularWindows を使用して、境界ボックスを計算し、 lat / lon の変換を行います。

RectangularWindow rectangularWindow = new RectangularWindow(newLatLng(location.getLat().doubleValue(), location.getLon().doubleValue()), radius.doubleValue(), radius.doubleValue(), LengthUnit.KILOMETER);
latMin = (long) ((180 + rectangularWindow.getMinLatitude()) * 100000);     
latMax = (long) ((180 + rectangularWindow.getMaxLatitude()) * 100000);
lonMin = (long) ((360 + rectangularWindow.getLeftLongitude()) * 100000);
lonMax = (long) ((360 + rectangularWindow.getRightLongitude()) * 100000);

次に、CloudSearch インスタンスに対するクエリの例:

http://[SEARCHURL]/2011-02-01/search?bq=(and lat:22300347..22309340 (and lon:28379282..28391589))

それが最善の解決策かどうかはわかりませんが、それが私たちが思いついたものです

于 2012-05-24T19:52:01.737 に答える
4

ジオハッシュを使用して、計算ではなく文字列に基づいて近くのオブジェクトのクエリを実行できます。

Geohash を使用すると、ノードの場所を「バケット」に格納できます。このバケットは、dynamodb で文字列を範囲またはハッシュ キーとして使用してクエリできます。

これは良い例ですhttps://github.com/davetroy/geohash-jsはJavaScriptで行われ、他の言語で簡単に書き直すことができます。

于 2012-12-20T15:08:57.253 に答える
1

私は現在、このテーマについて自分で研究しています。私は MongoDb を使用しています (DynamoDb を要求したことは知っていますが、一般的な NoSql の使用も要求しました)。私のコードは次のようになります。

レコード構造:

public class FrameDocument
{
    [BsonId]
    public Guid Id { get; set; }

    [BsonElement("coordinates")]
    public Point[] Polygon { get; set; }
}

public class Point
{
    [BsonElement("name")]
    public string Orientation { get; set; }

    [BsonElement("loc")]
    public double[] Location { get; set; }
}

インデックスの接続と確保:

MongoServer server = MongoServer.Create(connectionString);
MongoDatabase database = server.GetDatabase(databaseName);
database.GetCollection(collectionName).EnsureIndex(IndexKeys.GeoSpatial("coordinates.loc"));

書き込み:

var items = database.GetCollection(collectionName);
items.InsertBatch(itemsToInsert);

検索:

double[,] points; // define you search coordinates
var items = database.GetCollection<FrameDocument>(collectionName);
var query = Query.WithinPolygon("coordinates.loc", points);
var cursor = items.Find(query);
于 2012-05-23T06:32:25.577 に答える