Длинный ответ, в основном уже написанный, когда Стивен Полетто опубликовал, и содержащий пример кода о том, как использовать встроенные методы для сортировки массива, так что я все же стоил публиковать, хотя основной ответ тот же (т. Е."выберите пять ближайших для себя, передайте только те, которые включены"):
Вам нужно будет отсортировать свои аннотации по расстоянию для себя и представить только самые близкие пять в MKMapView.Если у вас есть два CLLocations, вы можете получить расстояние между ними, используя метод distanceFromLocation: (который был getDistanceFrom: до iOS 3.2; это имя устарело).
Итак, дляНапример, предположим, что у вашего класса Annotation есть метод 'setReferenceLocation:', в который вы передаете CLLocation и получатель 'distanceFromReferenceLocation', который возвращает расстояние между ними, вы можете сделать:
// create and populate an array containing all potential annotations
NSMutableArray *allPotentialAnnotations = [NSMutableArray array];
for(all potential annotations)
{
Annotation *annotation = [[Annotation alloc]
initWithCoordinate:...whatever...];
[allPotentialAnnotations addObject:annotation];
[annotation release];
}
// set the user's current location as the reference location
[allPotentialAnnotations
makeObjectsPerformSelector:@selector(setReferenceLocation:)
withObject:mapView.userLocation.location];
// sort the array based on distance from the reference location, by
// utilising the getter for 'distanceFromReferenceLocation' defined
// on each annotation (note that the factory method on NSSortDescriptor
// was introduced in iOS 4.0; use an explicit alloc, init, autorelease
// if you're aiming earlier)
NSSortDescriptor *sortDescriptor =
[NSSortDescriptor
sortDescriptorWithKey:@"distanceFromReferenceLocation"
ascending:YES];
[allPotentialAnnotations sortUsingDescriptors:
[NSArray arrayWithObject:sortDescriptor]];
// remove extra annotations if there are more than five
if([allPotentialAnnotations count] > 5)
{
[allPotentialAnnotations
removeObjectsInRange:NSMakeRange(5,
[allPotentialAnnotations count] - 5)];
}
// and, finally, pass on to the MKMapView
[mapView addAnnotations:allPotentialAnnotations];
В зависимости от того, где выПри загрузке из, вам необходимо создать локальное хранилище (в памяти или на диске) для аннотаций и выбрать пять ближайших, когда пользователь перемещается.Либо зарегистрируйте себя в качестве делегата CLLocationManager, либо наблюдайте значение ключа в свойстве userLocation представления карты.Если у вас достаточно много потенциальных аннотаций, то сортировка всех них немного расточительна, и вам лучше использовать quadtree или kd-tree.