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]; |