gpt4 book ai didi

nosql - 如何从 NoSQL DBMS(如 DynamoDB)存储 GPS 坐标和搜索半径范围内的地点

转载 作者:太空狗 更新时间:2023-10-30 01:47:00 25 4
gpt4 key购买 nike

我的团队需要像 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,计算边界框并进行纬度/经度转换。

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))

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

关于nosql - 如何从 NoSQL DBMS(如 DynamoDB)存储 GPS 坐标和搜索半径范围内的地点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10691547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com