如何在NoSQL DBMS(如DynamoDB)的半径内存储GPS坐标和搜索位置

Mar*_*ero 7 database gis nosql coordinate

我的团队需要像DynamoDB这样的DBMS来存储大量数据,主要是位置和坐标.我考虑使用一些基于GIS的DBMS(如PostGIS)和POINT上的索引,但DynamoDB似乎很适合我们使用.

存储坐标并快速检索特定半径内的所有对象的最佳方法是什么?

在PostGIS中,它很简单,如下所示:

SELECT *
FROM places
WHERE ST_DWithin(coordinate, ST_GeomFromText('POINT(45.07085 7.68434)', 4326), 100.0);
Run Code Online (Sandbox Code Playgroud)

如何在NoSQL DBMS中执行类似的操作?

Era*_*ras 5

我们遇到了同样的问题,我们特别使用AWS和DynamoDB.我们通过使用CloudSearch Service解决了这个问题,每次我们在数据库中存储一些"地理可搜索"数据时,我们使用lat,lon作为过滤器将CloudSearch实例中的数据编入索引(要做到这一点,你必须在lat和lon把它变成一个uint).

那么假设你想在特定的纬度/经度和半径上搜索你计算相应的geobox(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);
Run Code Online (Sandbox Code Playgroud)

然后是CloudSearch实例上的查询示例:

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

我不确定这是最好的解决方案,但这就是我们想出来的