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中执行类似的操作?
我们遇到了同样的问题,我们特别使用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))
我不确定这是最好的解决方案,但这就是我们想出来的