空间查询关于AWS的SimpleDB(Spatial queries on AWS SimpleDB

2019-07-30 19:42发布

我想知道是什么人建议在一个Amazon Web Services的SimpleDB做空间查询的有效途径?

通过空间查询我的意思是找到一个纬度和经度的给定半径的对象。

Answer 1:

SimpleDB的目前不提供任何内置的空间搜索业务,但并不意味着它不能做。 有实现非地理空间感知数据库如SimpleDB的,他们都围绕着使用你的应用程序使用的数据库检索基于地理空间边界框粗略的第一选择,然后过滤返回的数据的想法地理空间搜索的几种方法更准确的算法,如半正矢式 。

可以存储的纬度和经度为(零填充和归一化)的数值属性,然后执行双范围查询( lat >= minLat and lat <= maxLat and lon >= minLat and lon <= maxLat ),但因为无论theese的谓词是选择性的(每个谓词很多项目的比赛),这是不理想(见调整查询 )。

更好的办法是使用GeoHashes 。

Geohashes提供像任意精度,对于附近的位置的相似的前缀,并且逐渐从代码的末尾去除字符以减小其尺寸(和逐渐失去精度)的可能性的特性。

作为一个实际的例子中,地理散列6gkzwgjzn820解码的坐标-25.382708 -49.265506和,而地理散列6gkzwgjz将解码到-25.383和-49.266,如果我们采取在同一区域中的类似位置,如-25.427和-49.315 ,我们可以看到它被编码为6gkzmg1w(注意类似的前缀)。

从http://geohash.org/site/tips.html

与您的项目位置为GeoHashes你可以使用like操作符来搜索边界框( where GeoHash like '6gkzmg1w%' ),但由于like运营商是昂贵( 比较运算符 )一个更好的方式是通过存储每个非规范化的数据地理散列前缀水平(多少取决于你需要的搜索精度)作为一个单独的属性(GeoHash6 GeoHash8等),然后使用一个简单的等式谓词( where Geohash8 = '6gkzmg1w' )。

现在到GeoHashes的缺点。 因为你不能让一个地理散列的任何假设您正在搜索框内居中你必须寻找所有相邻前缀为好。 该方法极好地通过描述地理散列-JS

地理散列还具有作为的位数减少(从右侧),精度下降的性质。 这个属性可以用来做边界框搜索,如点附近彼此会分享相似的地理散列前缀。

然而,因为给定的点可以在给定的地理散列边框的边缘出现,这是必要的,以便进行围绕一个点一个真正的接近搜索生成地理散列值的列表。 由于地理散列算法使用碱-32编号系统,它可以导出周围使用简单的查找表中的任何其它给定地理散列值的地理散列值。

因此,例如,宾夕法尼亚大道1600号,华盛顿特区解析为:38.897,-77.036

使用地理散列算法,这个纬度和经度转换为:dqcjqcp84c6e

围绕这一点简单的边框可以通过截断该地理散列来描述:dqcjqc

然而,“dqcjqcp84c6e”不居中内“dqcjqc”,并在“dqcjqc”搜索可能会错过一些预期目标。

因此,相反,我们可以使用地理散列的数学特性快速计算“dqcjqc”的邻居; 我们发现,它们是: 'dqcjqf', 'dqcjqb', 'dqcjr1', 'dqcjq9', 'dqcjqd', 'dqcjr4', 'dqcjr0', 'dqcjq8'

这给了我们一个边框围绕“dqcjqcp84c6e”大致2公里X 1.5公里,允许在短短9键数据库搜索:SELECT * FROM表WHERE LEFT(地理散列,6)(“dqcjqc”,“dqcjqf”,“dqcjqb” , 'dqcjr1', 'dqcjq9', 'dqcjqd', 'dqcjr4', 'dqcjr0', 'dqcjq8');

转换为SimpleDB的查询会是where GeoHash6 in('dqcjqc', 'dqcjqf', 'dqcjqb', 'dqcjr1', 'dqcjq9', 'dqcjqd', 'dqcjr4', 'dqcjr0', 'dqcjq8')和那么你会做对结果的半正矢过滤,以仅获得搜索半径范围内是这样的项目。



Answer 2:

我要离开这个在这里,因为它可以帮助你!

14年前,我们试图做的半径范围内的位置地理查找表。 有没有明显的地理空间索引或类似的东西。 有字面上的唯一标准SQL和Oracle ......无论如何,我们最终将所有纬度/经度为从固定平面场公里。 基本上就是地理空间索引做这些天。

为了解释正是它,它变成世界变成一个平面上,有位SQL弄虚作假,你甚至可以通过半径选择,你甚至从你选择两个点之间的距离。 由于它的原料也充分整数查询速度极快。

这里是PHP一个简单的例子和​​一个非常复杂的寻找,但很容易,一旦你了解它的SQL查询:

https://gist.github.com/tobsn/899413



文章来源: Spatial queries on AWS SimpleDB