Как я могу сгруппировать MKAnnotations автоматически по уровню масштабирования? - PullRequest
14 голосов
/ 07 июля 2010

если пользователь уменьшает масштаб на MKMapView, я хочу, чтобы MKAnnotations, которые находятся рядом друг с другом, автоматически группировались в одну «групповую» аннотацию.если пользователь снова увеличивает масштаб, аннотацию «group» следует снова разделить на уникальные / оригинальные аннотации.

apple делает это уже в iOS 4."предопределенный" способ сделать это?

Ответы [ 3 ]

6 голосов
/ 14 февраля 2012

Это нормально работает с более чем 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];
}
4 голосов
/ 17 июля 2010

Это блестящая идея.Я работаю над аналогичным приложением, надеюсь, вы не против, если я все же реализую концепцию:).

Чтобы ответить на ваш вопрос в меру своих возможностей, нет, я не думаю,есть предопределенный способ сделать это.

Лучший способ, которым я могу придумать (после просмотра приложения для фотографий iOS4), - это использовать метод делегата mapView:regionDidChangeAnimated:.Каждый раз, когда пользователь прокручивает / увеличивает масштаб, этот метод будет вызываться.

Внутри этого метода вы могли бы иметь некоторую быструю математическую математику, чтобы определить, достаточно ли близки ваши точки, чтобы рассмотреть возможность объединения.Как только они «объединены», вы удалите одну или обе аннотации и поместите другую аннотацию обратно в то же место, которое является ссылкой на обе (вы могли бы очень легко создать класс AnnotationCluster, который мог бы соответствовать MKAnnotation, но также содержатьNSArray аннотаций, а также содержит методы для "разрыва" или "поглощения" других аннотаций и / или экземпляров AnnotationCluster и т. Д.).

Когда я говорю "математика быстрой геометрии", я имею в виду расстояние между двумяточки относительно промежутка карты, и принимая их относительное расстояние как процент от промежутка всей карты.

Где это может быть сложно, если у вас есть сотни аннотаций, так как я не могу отключить-придумайте хороший способ реализации этого без двойного цикла.

Что вы считаете?

0 голосов
/ 11 ноября 2013

Этот проект делает что-то интересное. Тем не менее, обратите внимание на обнаруженные проблемы, прежде чем менять слишком много вещей в своем коде. Потому что это может быть недостаточно для ваших нужд.

Я лично реализовал это

...