如何自动对MKAnnotations进行缩放级别分组?

时间:2010-07-07 12:29:27

标签: iphone mapkit mkmapview zoom mkannotation

如果用户缩小MKMapView,我希望彼此接近的MKAnnotations自动分组为一个“组”注释。 如果用户放大,则应将“组”注释再次拆分为唯一/原始注释。

apple已经在iOS 4 Photos.app中做到了这一点

是否有一种常见的“预定义”方式来执行此操作?

3 个答案:

答案 0 :(得分:6)

它在地图上正常使用超过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];
}

答案 1 :(得分:4)

这是个好主意。我正在开发一个类似的应用程序,我希望你不介意我是否实现这个概念:)。

要尽我所能回答你的问题,不,我认为没有预先确定的方法来做到这一点。

我能想到的最佳方式(在查看iOS4照片应用程序之后)是使用mapView:regionDidChangeAnimated:委托方法。每次用户滚动/缩放时,都会调用此方法。

在该方法中,您可以使用一些快速几何数学来确定您的点是否“足够接近”以考虑合并。一旦它们“合并”,你将删除一个或两个注释,并将另一个注释放回到同一个地方,这是两者的引用(你可以非常容易地创建一个符合MKAnnotation的AnnotationCluster类,但也可以NSArray注释,还包含“分解”或“吸收”其他注释和/或AnnotationCluster实例的方法等。)

当我说“快速几何数学”时,我指的是两个点相对于地图范围的距离,并将它们的相对距离作为整个地图范围的百分比。

如果您有数百个注释,那将会变得棘手,因为我无法想象实现没有双循环的好方法。

你觉得怎么样?

答案 2 :(得分:0)

project做了一些有趣的事情。但是,在更改代码中的太多内容之前,请先查看已报告的问题。因为它可能不足以满足您的需求。

我个人最终实施this