我的球队需要一个像DBMS对DynamoDB存储大量的数据,主要是地方和坐标。 我已经考虑到与上点的指数使用一些基于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服务,每次我们存储在我们的数据库中,我们的索引一些“地理搜索的”数据过滤与纬度,经度一CloudSearch实例的数据(这样做的时候,你必须做LAT转型和解决了这个问题LON把它变成一个uint)。
然后让我们说你想要做一个特定的纬度/经度和半径您计算相应的地理方块(latmin,latmax公司,Lonmin,lonmax)的搜索,并与具体的过滤器查询您CloudSearch实例来检索数据的主要模式,你然后可以查询DynamoDB来获取信息。
在Java中的一些代码来做到这上面:
从com.javadocmd.simplelatlng.window包泰勒科尔斯使用RectangularWindows,计算边界框并执行转换为纬度/经度。
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 /搜索BQ =(和纬度:22300347..22309340(和经度:28379282..28391589))
我不知道这是最好的解决办法,但是这就是我们想出了
你可以使用geohashing做基于字符串,而非计算附近物体的查询。
地理散列将使您节点的位置存储到一个能够通过使用字符串作为dynamodb范围或散列关键字查询“桶”。
这里是一个很好的例子https://github.com/davetroy/geohash-js在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);
文章来源: How to store GPS coordinate and search places in a radius from a NoSQL DBMS (like DynamoDB)