我的团队需要像 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 服务解决了这个问题,每次我们在数据库中存储一些“地理可搜索”数据时,我们都会使用经纬度作为过滤器对 CloudSearch 实例中的数据进行索引(为此,您必须对纬度和经度进行转换) lon 将其转换为 uint )。
然后,假设您想要对特定的纬度/经度和半径进行搜索,您计算相应的地理框( latmin, latmax , lonmin, lonmax )并使用特定过滤器查询您的 CloudSearch 实例以检索数据的关键架构,您然后可以查询 DynamoDB 以获取信息。
Java 中的一些代码可以完成上述操作:
使用 Tyler Coles 的 com.javadocmd.simplelatlng.window 包中的 RectangleWindows,计算边界框并对 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=(和纬度:22300347..22309340(和经度:28379282..28391589))
我不确定这是最好的解决方案,但这就是我们想出的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)