如何存储GPS坐标并从NoSQL的DBMS在半径搜索的地方(如DynamoDB)(How to st

2019-07-29 11:28发布

我的球队需要一个像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类似的东西?

Answer 1:

我们有同样的问题,我们特别是使用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))

我不知道这是最好的解决办法,但是这就是我们想出了



Answer 2:

你可以使用geohashing做基于字符串,而非计算附近物体的查询。

地理散列将使您节点的位置存储到一个能够通过使用字符串作为dynamodb范围或散列关键字查询“桶”。

这里是一个很好的例子https://github.com/davetroy/geohash-js在JavaScript中,可以很容易地在其他语言重写完成。



Answer 3:

我目前正在研究这个问题我自己。 我使用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)