我们遇到了同样的问题,我们特别使用 AWS 和 DynamoDB。我们通过使用 CloudSearch 服务解决了这个问题,每次我们在数据库中存储一些“可地理搜索”数据时,我们都会在 CloudSearch 实例中使用 lat,lon 作为过滤器来索引数据(为此,您必须对 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=(和 lat:22300347..22309340 (和 lon:28379282..28391589))
我不确定这是不是最好的解决方案,但这就是我们想出的