我的团队需要像 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);
我怎样才能在 NoSQL DBMS 中做类似的事情? 最佳答案
我们遇到了同样的问题,我们特别使用 AWS 和 DynamoDB。
我们通过使用 CloudSearch 服务解决了这个问题,每次我们在我们的数据库中存储一些“地理可搜索”数据时,我们都会使用 lat,lon 作为过滤器对 CloudSearch 实例中的数据进行索引(为此,您必须对 lat 和lon 把它变成一个 uint )。
然后假设您想在计算相应地理框( 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);
然后是 CloudSearch 实例上的查询示例:
http://[SEARCHURL]/2011-02-01/search?bq=(and lat:22300347..22309340 (and lon:28379282..28391589))
我不确定这是最好的解决方案,但这就是我们想出的
关于nosql - 如何从 NoSQL DBMS(如 DynamoDB)存储 GPS 坐标和搜索半径范围内的地点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10691547/