2

我有一个充满经度和纬度的数组。我的用户位置有两个双重变量。我想测试我的用户位置与我的阵列之间的距离,以查看哪个位置最近。我该怎么做呢?

这将获得 2 个位置之间的距离,但很难理解我如何针对一系列位置进行测试。

CLLocation *startLocation = [[CLLocation alloc] initWithLatitude:userlatitude longitude:userlongitude];
CLLocation *endLocation = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:annotation.coordinate.longitude];
CLLocationDistance distance = [startLocation distanceFromLocation:endLocation];
4

2 回答 2

3

您只需要遍历数组检查距离。

NSArray *locations = //your array of CLLocation objects
CLLocation *currentLocation = //current device Location

CLLocation *closestLocation;
CLLocationDistance smallestDistance = DOUBLE_MAX;

for (CLLocation *location in locations) {
    CLLocationDistance distance = [currentLocation distanceFromLocation:location];

    if (distance < smallestDistance) {
        smallestDistance = distance;
        closestLocation = location;
    }
}

在循环结束时,您将拥有最小的距离和最近的位置。

于 2014-07-16T14:51:22.760 回答
2

@雾迈斯特

我认为这是一个错误,必须正确设置 DBL_MAX 和分配。

第一:使用 DBL_MAX 而不是 DOUBLE_MAX。

DBL_MAX 是 math.h 中的 #define 变量
它是最大可表示的有限浮点(双)数的值。

第二:在您的情况下,您的分配是错误的:

if (distance < smallestDistance) {
        distance = smallestDistance;
        closestLocation = location;
}

你必须这样做:

if (distance < smallestDistance) {
        smallestDistance = distance;
        closestLocation = location;
}

不同之处在于将距离值分配给 minimumDistance,而不是相反。

最终结果:

NSArray *locations = //your array of CLLocation objects
CLLocation *currentLocation = //current device Location

CLLocation *closestLocation;
CLLocationDistance smallestDistance = DBL_MAX; // set the max value

for (CLLocation *location in locations) {
    CLLocationDistance distance = [currentLocation distanceFromLocation:location];

    if (distance < smallestDistance) {
        smallestDistance = distance;
        closestLocation = location;
    }
}
NSLog(@"smallestDistance = %f", smallestDistance);

你能确认这是正确的吗?

于 2015-04-24T11:35:58.150 回答