GPS座標と検索場所をNoSQL DBMSのように保存する方法(DynamoDBのように)
-
12-12-2019 - |
質問
私のチームは、大量のデータ、主に場所と座標を保存するためにDynamoDBのようなDBMSを必要とします。 ポイント上のインデックスを持つGISベースのDBMS(Postgisのような)を使用すると考えられていましたが、DynamoDBは私たちの使いのために素晴らしいようです。
座標を保管する最良の方法とは何ですか?
Postgisでは簡単です、このようなもの:
SELECT *
FROM places
WHERE ST_DWithin(coordinate, ST_GeomFromText('POINT(45.07085 7.68434)', 4326), 100.0);
.
NoSQL DBMSのようなものをどうすればよいですか?
解決
私たちは同じ問題を抱えていました、特にAWSとDynamoDBを使用しています。 私たちのデータベースにいくつかの「地理検索」データを保存するたびに、CloudSearchサービスを使用することで問題を解決しました。それを船体に変えるためにlon。
それからあなたが特定のLAT / LONとRADIUSで検索をしたいとしましょう。データ、情報を取得するために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:// [SearchRul] / 2011-02-01 /検索?BQ=(そしてLAT:22300347 ~22309340(およびLON:28379282社))
私はそれが最善の解決策であると確信していませんが、それが私たちが思いついたものです
他のヒント
計算ではなく弦に基づいて近くのオブジェクトのクエリを実行するようにGeoHashingを使用することができます。
GeoHashを使用すると、ノードの位置を「バケット」に保存することができます。これは、DynamoDBの範囲またはハッシュキーとして文字列を使用して照会することができます。
これは良い例です。他の言語で簡単に書き直すことができるJavaScriptで行われます。
私は現在この主題を私自身の研究しています。私は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);
.