如何管理大量的MapView批注

时间:2013-01-02 12:39:28

标签: iphone annotations

我有一个带有大量注释(8000+)的MapView。在所有注释都可见的情况下滚动地图会降低性能。所以,当我们在可见区域时,我有想法隐藏一些注释。我在论坛中找到了this thread,但它并没有解决我的问题。

我通过编写这段代码尝试了另一种解决方案

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated
{
    NSSet *annoSet = [[NSSet alloc] initWithSet:[_mapView annotationsInMapRect:_mapView.visibleMapRect]];
    NSMutableSet *annotationsSet = (NSMutableSet *)annoSet;

    NSLog(@"Annos: %i", [annotationsSet count]);

    if([annotationsSet count]>500)
    {
        for(MapViewAnnotation* annotation in annotationsSet)
        {
            [[_mapView viewForAnnotation:annotation] setHidden:YES];
        }
    }
}

这样可行,但在那次操作之后,mapView几乎完全崩溃,我可以改进什么?

编辑:

我的新代码如下:

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated
{
    NSSet *annoSet = [[NSSet alloc] initWithSet:[_mapView annotationsInMapRect:_mapView.visibleMapRect]];
    //NSMutableSet *annotationsSet = (NSMutableSet *)annoSet;

    NSLog(@"Annos: %i", [annoSet count]);

    if([annoSet count]>500)
    {
        for(MapViewAnnotation* annotation in annoSet)
        {
            [[_mapView viewForAnnotation:annotation] setHidden:YES];
        }

    }
    else if([annoSet count] <= 500)
    {
        for(MapViewAnnotation* annotation in annoSet)
        {
            [[_mapView viewForAnnotation:annotation] setHidden:NO];
        }

    }
}

但我不想隐藏其中几个注释中的所有注释。 知道如何以有效的方式做到这一点吗?

1 个答案:

答案 0 :(得分:3)

您正在寻找的是一种聚类注释的方法,这意味着显示单个注释,其中有几个注释非常接近。如果你想要做到这一点,这可能会有点复杂,但如果你搜索网络,你会发现几个讨论聚类策略和算法的地方。我已将它们中的一些链接到了下面。

Applidium网站上的

This blog post讨论了一个这样的策略,现在有几个关于Github的项目(mapkit-clusterskingpinRevClusterMap)可以处理群集为了你。如果不出意外,请查看代码,您将了解如何处理问题。

当我的团队正在处理这个问题时,我们选择了其中一个WWDC视频(this one,我认为(需要开发人员帐户))中描述的解决方案,我们对其进行了一些修改以提高性能。

请注意,您可能必须找到一种方法让用户在点击群集注释时知道。我们使用自定义标注来完成此操作,该标注列出了该单个注释所代表的所有注释。