找到靠近我的物品

时间:2011-03-18 09:58:44

标签: iphone map annotations

我正在构建一个iphone应用程序,我正在寻找一个如何让物体接近我的位置的想法。对象具有我的数据库中列出的地址。现在我有兴趣在地图上显示我附近的物体。我怎么得到那个房产?起初我想到了floyd-warshall但是有没有比自己编码更好的解决方案?

3 个答案:

答案 0 :(得分:1)

您需要做的第一件事是在数据库中获取Lat Long位置而不是Addresses。谷歌提供的工具可以做到这一点。还有manual approach

然后,您可以使用Haversine公式计算出是否在您所在位置的某个半径范围内。

这是一个例子。您可以在地图上循环浏览对象(位置)并查看它们离您有多远。

-(CGFloat) getDistance :(CGFloat)objLatitude :(CGFloat)objLongitude :(CGFloat)currentLocationLatitude :(CGFloat)currentLocationLongitude
{
    CGFloat earthRadius = 6371;

    CGFloat deltaLat = deg2rad(currentLocationLatitude - objLatitude);
    CGFloat deltaLong = deg2rad(objLongitude - currentLocationLongitude);

    CGFloat a = sin(deltaLat/2) * sin(deltaLat/2) +
        cos(deg2rad(objLatitude)) * cos(deg2rad((double)currentLocationLatitude)) * 
        sin(deltaLong/2) * sin(deltaLong/2);

    CGFloat c = 2 * atan2(sqrt(a), sqrt(1 - a));
    CGFloat d = earthRadius * c;

    d = round(d, 4); // round to 4dp
    d = d * 1000; // convert from km to m
    d = d * 0.621371192; // convert from km to miles

    return d; // m
}

您可以修改此方法,如果它在特定距离内,则返回TRUE,如果不是,则返回FALSE:

-(BOOL) doesObjFallWithinMyRadius :(CGFloat)objLatitude :(CGFloat)objLongitude :(CGFloat)currentLocationLatitude :(CGFloat)currentLocationLongitude :(CGFloat)distanceLimit
{
    CGFloat earthRadius = 6371;

    CGFloat deltaLat = deg2rad(currentLocationLatitude - objLatitude);
    CGFloat deltaLong = deg2rad(objLongitude - currentLocationLongitude);

    CGFloat a = sin(deltaLat/2) * sin(deltaLat/2) +
        cos(deg2rad(objLatitude)) * cos(deg2rad((double)currentLocationLatitude)) * 
        sin(deltaLong/2) * sin(deltaLong/2);

    CGFloat c = 2 * atan2(sqrt(a), sqrt(1 - a));
    CGFloat d = earthRadius * c;

    d = round(d, 4); // round to 4dp
    d = d * 1000; // convert from km to m
    d = d * 0.621371192; // convert from km to miles

    if(d < distanceLimit) return TRUE;
    else return FALSE;
}

要查找您当前的位置,您需要使用属于iOS SDK的CLLocationManager

答案 1 :(得分:1)

这可能不是您想要的解决方案,但这有助于您获得位置之间的距离。如果您在地图上绘制它们,您可能有坐标。然后,您可以使用distanceFromlocation: CLLocation方法获取距离这些点到您所在位置的距离。然后你可以根据距离绘制它们。

答案 2 :(得分:0)

你见过KD-Tree吗?您可以使用它来查找您附近的地方。

当然,你必须假设地球是扁平的,但我不敢相信这会导致问题吗? :)尽管如此,这是一个有趣的数据结构。