在修改后的问题中,很明显实际问题是如何对 Amazon SimpleDB 数据库进行查询,以查看数据库中的位置是否在 iOS 应用程序提供的位置的某个半径范围内。
正如您正确识别的那样,如果可能,您确实希望在服务器端而不是客户端执行此操作。并且特定的解决方案将高度依赖于特定的数据库技术(在这种情况下为 SimpleDB)。
这个问题在 AWS SimpleDB 上的空间查询中有所涉及。我建议检查一下以获取更多信息。
作为适当距离算法的代理,您可以将米的距离转换为纬度和经度范围。因此,您可以在 iOS 中计算纬度和经度的最小值和最大值,然后在WHERE
子句中将它们传递到远程数据库。然后服务器可以根据这些标准过滤结果。诚然,这为您提供了一个方形区域(而不是通过正确计算距离获得的圆形区域),但它可以非常容易地快速限制结果集,而无需在服务器上使用特殊的地理定位逻辑。为此,您可以使用 定义一个区域MKCoordinateRegionMakeWithDistance
,然后获取它的span
.
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(originalCoordinate, 200, 200);
MKCoordinateSpan span = region.span;
这使您可以以给定位置的纬度span.latitudeDelta
和span.longitudeDelta
经度为中心,以定义位置周围的方形区域。为了证明这一点,这里的中心图钉是我在时代广场的位置,阴影区域是一个区域(使用上面span
的 200m 宽和高构造),它涵盖了我当前位置以东 100m 到以西 100m 之间的经度,以及我当前位置以北 100m 和以南 100m 的纬度。
这是一种使用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 个大头针: