SimpleDB - 位置比较选择表达式

时间:2013-01-03 13:53:50

标签: objective-c ios core-location amazon-simpledb coordinate

我有一个坐标,假设任何纬度和经度值。

我在SimpleDB上有一个域设置,它有许多项(简单字符串),属性为“Latitude”和“Longitude”。现在我想要做的是查询SimpleDB并查看当前位置坐标是否与SimpleDB的项目坐标相距“x”米。 'x'应为10.

我的应用程序使用包含纬度和经度的属性将项目上传到SimpleDB。我检测到用户位置,获取坐标,我想使用选择表达式来查看坐标是否相距'x'米。他们这样做是一个更好的方法吗?或者这是最好的方式,如果是这样,我该怎么做?

以下是select表达式的示例,我只是不知道在这种情况下如何使用它以及'%@'值将被填充的内容。整个格式可能会关闭,这只是我的想法。

select * from test-app-simpledb where Latitude >= '%@' AND Latitude <= '%@' AND Longitude >= '%@' AND Longitude <= '%@'

所以“test-app-simpledb”是我的SimpleDB域名,Latitude和Longitude是我与坐标比较的属性。它们都被转换为字符串。

那么,我该如何进行位置比较选择表达式。查询项目的坐标(纬度和经度属性)是否为'x'(在这种情况下为10)米。

有什么办法吗?谢谢!

1 个答案:

答案 0 :(得分:4)

在修订后的问题中,很明显实际问题是如何对Amazon SimpleDB数据库进行查询,以查看数据库中的位置是否在iOS应用程序提供的某个位置的某个半径范围内。

正如您所正确指出的那样,如果可能的话,您确实希望在服务器端而不是客户端执行此操作。特定的解决方案将高度依赖于特定的数据库技术(在这种情况下为SimpleDB)。

Spatial queries on AWS SimpleDB中提到了这个问题。我建议检查一下以获取更多信息。

作为适当距离算法的代理,您可以将以米为单位的距离转换为纬度和经度范围。因此,您可以在iOS中计算纬度和经度的最小值和最大值,然后将WHERE子句中的那些传递到远程数据库。然后,服务器可以根据这些标准过滤结果。这无疑给了你一个方形区域(而不是通过正确计算距离得到的圆形区域),但它使得很容易快速限制结果集而服务器上不需要特殊的地理定位逻辑。为此,您可以使用MKCoordinateRegionMakeWithDistance定义某个区域,然后抓住其span

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(originalCoordinate, 200, 200);
MKCoordinateSpan span = region.span;

这会为您提供span.latitudeDeltaspan.longitudeDelta,您可以围绕给定位置的纬度和经度居中,以定义一个位置周围的方形区域。为了证明在行动中,这里的中心针是我在时代广场的位置,阴影区是一个区域(使用上面span建造,宽200米,高),覆盖100米东100米之间的经度。我当前位置的西边,以及我当前位置以北100米和100米以南的纬度。

using span to define a square region

这是一种使用MapKit.framework函数来大大简化远程数据库的SQL查询以根据地理距离过滤位置的方法。如果方形区域存在问题,您还可以使用CLLocation实例方法distanceFromLocation将结果下载到iOS应用后进一步过滤结果,以确定实际距离。但是,通过限制服务器检索的位置的经度和纬度,您可以大大简化服务器检索过程,同时不会因为地理位置计算过多而妨碍服务器检索过程。

但是你真的想让SimpleDB做完整,适当的距离计算,我不得不把它留给别人。


下面是我的原始答案。在最初的问题中,我误解了它是“我如何构建围绕特定位置的圆圈坐标列表?”正如修订后的问题所表明的那样,这根本不是问题,但我会在这里保留我的旧答案以供历史参考。

原始回答:

如果您使用Calculate new coordinate x meters and y degree away from one coordinate,则实现可能如下所示:

NSInteger numberOfPoints = 10;

for (double bearing = 0.0; bearing < 360.0; bearing += (360.0 / numberOfPoints))
{
    CLLocationCoordinate2D coordinate = [self coordinateFromCoord:originalCoordinate
                                                     atDistanceKm:distanceKm 
                                                 atBearingDegrees:bearing];
    // do whatever you want with this coordinate
}

似乎工作正常。例如,我有一个应用程序使用这个例程在时代广场下降10米的100英尺:

times square