关于ios:按距离(纬度和经度)排序表

Sort Table by distance (latitude and longitude)

我正在像这样通过JSON获取值:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
        id = 1;
        latitude ="-23.0002";
        longitude ="-43.2438";
        name = Vips;
}

{
        id = 2;
        latitude ="-22.9283";
        longitude ="-43.1746";
        name = Elegance;
}

...

我需要在表格视图中显示此值,并按与用户位置的距离排序。并且必须始终更新此值。我该怎么办?

displayObject是一个NSMutableArray,我从WS中获取值。
在viewWillappear中,我正在尝试做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
NSArray *rawData = [NSArray arrayWithArray:displayObject];

rawData = [rawData sortedArrayUsingComparator: ^(id a, id b) {

    CLLocationDistance dist_a= [[a objectForKey:@"coordinate"] distanceFromLocation: locAtual];
    CLLocationDistance dist_b= [[b objectForKey:@"coordinate"] distanceFromLocation: locAtual];
    if ( dist_a < dist_b ) {
        return (NSComparisonResult)NSOrderedDescending;
    } else if ( dist_a > dist_b) {
        return (NSComparisonResult)NSOrderedDescending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }
}];

但是它不起作用。我只有纬度和经度。我没有"坐标"。
有人吗?

谢谢!


如果要计算距离,请将其与数组中存储的数据相加,然后根据距离进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for (int idx = 0; idx<[displayObject count];idx++) {

    NSMutableDictionary *dict = [displayObject[idx] mutableCopy];
    CLLocationDegrees latitude = [dict[@"latitude"] doubleValue];
    CLLocationDegrees longitude = [dict[@"longitude"] doubleValue];
    CLLocation *location = [[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
    CLLocationDistance distance = [userLocation distanceFromLocation:location];
    //Storing as string since latitude and longitude is also string values
    //Since its a dictionary storing as NSNumber is better
    dict[@"distance"] = [@(distance) stringValue];

    displayObject[idx] = dict;

}

//sorting based on distance
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES];
[displayObject sortUsingDescriptors:@[descriptor]];


您的比较器错误。请尝试以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rawData = [rawData sortedArrayUsingComparator: ^(id a, id b)
{
    CLLocation *locationA = [[CLLocation alloc] initWithLatitude:[[a objectForKey:@"latitude"] doubleValue] longitude:[[a objectForKey:@"longitude"] doubleValue]];
    CLLocation *locationB = [[CLLocation alloc] initWithLatitude:[[b objectForKey:@"latitude"] doubleValue] longitude:[[b objectForKey:@"longitude"] doubleValue]];

    CLLocationDistance dist_a = [locationA distanceFromLocation:currentLocation];
    CLLocationDistance dist_b = [locationB distanceFromLocation:currentLocation];

    if ( dist_a < dist_b ) {
        return (NSComparisonResult)NSOrderedAscending;
    } else if ( dist_a > dist_b) {
        return (NSComparisonResult)NSOrderedDescending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }
}];

首先创建纬度和经度的位置对象:

1
2
CLLocation *location = [[CLLocation alloc] initWithLatitude:-23.0002 longitude:-43.2438];
CLLocation *userLocation = [[CLLocation alloc] initWithLatitude:-23.0002 longitude:-43.2438];

使用这2个对象,可以轻松地使用以下方法检查距离:

1
 -(CLLocationDistance)distanceFromLocation:(const CLLocation *)location

例如:

1
CLLocationDistance dist_a = [locationUser distanceFromLocation:location];