1

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

我在 SimpleDB 上有一个域设置,其中包含许多具有“纬度”和“经度”属性的项目(简单字符串)。现在我想要做的是查询 SimpleDB 并查看当前位置坐标是否与 SimpleDB 的项目坐标相距“x”米。“x”应该是 10。

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

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

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

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

那么,我该如何做位置比较选择表达式。查询项目的坐标(纬度和经度属性)是否相距“x”(在本例中为 10)米。

有什么办法可以做到这一点?谢谢!

4

1 回答 1

4

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

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

这个问题在 AWS SimpleDB 上的空间查询中有所涉及。我建议检查一下以获取更多信息。

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

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

这使您可以以给定位置的纬度span.latitudeDeltaspan.longitudeDelta经度为中心,以定义位置周围的方形区域。为了证明这一点,这里的中心图钉是我在时代广场的位置,阴影区域是一个区域(使用上面span的 200m 宽和高构造),它涵盖了我当前位置以东 100m 到以西 100m 之间的经度,以及我当前位置以北 100m 和以南 100m 的纬度。

使用 span 定义一个正方形区域

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

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


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

原答案:

如果您使用计算新坐标 x 米和 y 度距一个坐标,实现可能如下所示:

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
}

它似乎工作正常。例如,我有一个应用程序使用此例程在时代广场距离我 100m 处放置 10 个大头针:

时代广场

于 2013-01-03T17:04:21.670 回答