Как я могу автоматически группировать MKAnnotations относительно уровня масштабирования?
Если пользователь меняет масштаб на MKMapView, я хочу, чтобы MKAnnotations, которые находятся рядом друг с другом, автоматически группируются в одну аннотацию "group".
если пользователь увеличит масштаб изображения, аннотация "группа" должна быть снова разделена на уникальные/оригинальные аннотации.
apple делает это уже в iOS 4 Photos.app
существует ли общий "предопределенный" способ сделать это?
Ответы
Ответ 1
Его нормальная работа с более чем 1500 аннотациями на карте:
-(void)mapView:(MKMapView *)mapView_ regionDidChangeAnimated:(BOOL)animated
{
NSMutableSet * coordSet = [[NSMutableSet alloc] init];
for(id<MKAnnotation> an in mapView_.annotations)
{
if([an isKindOfClass:[MKUserLocation class]])
continue;
CGPoint point = [mapView_ convertCoordinate:an.coordinate toPointToView:nil];
CGPoint roundedPoint;
roundedPoint.x = roundf(point.x/10)*10;
roundedPoint.y = roundf(point.y/10)*10;
NSValue * value = [NSValue valueWithCGPoint:roundedPoint];
MKAnnotationView * av = [mapView_ viewForAnnotation:an];
if([coordSet containsObject:value])
{
av.hidden = YES;
}
else
{
[coordSet addObject:value];
av.hidden = NO;
}
}
[coordSet release];
}
Ответ 2
Это блестящая идея. Я работаю над подобным приложением, надеюсь, вы не против, если я реализую концепцию:).
Чтобы ответить на ваш вопрос в меру своих возможностей, нет, я не думаю, что есть предопределенный способ сделать это.
Лучший способ, которым я могу это сделать (после просмотра приложения iOS4 для фотографий), - использовать метод делегата mapView:regionDidChangeAnimated:
. Каждый раз, когда пользователь прокручивает/увеличивает масштаб, этот метод будет вызываться.
Внутри этого метода вы можете получить некоторую математическую математику, чтобы определить, достаточно ли близки ваши точки, чтобы рассмотреть вопрос о слиянии. После того, как они будут "объединены", вы удалите одну или обе аннотации и добавите еще одну аннотацию в том же месте, что и ссылка на оба (вы можете легко сделать класс AnnotationCluster, который может соответствовать MKAnnotation, но также NSArray аннотаций, а также содержат методы для "разрыва" или "поглощения" других аннотаций и/или экземпляров AnnotationCluster и т.д.).
Когда я говорю "математика быстрой геометрии", я имею в виду расстояние между двумя точками относительно пролета карты и принимая их относительное расстояние в процентах от диапазона всей карты.
Если это будет сложно, если у вас есть сотни аннотаций, так как я не могу не думать о хорошем способе реализовать это без двойного цикла.
Что вы считаете?
Ответ 3
Этот проект делает что-то интересное. Хотя, посмотрите на сообщения о проблемах, прежде чем менять слишком много вещей в своем коде. Потому что это может быть недостаточно для ваших нужд.
I personnaly завершил реализацию этого