iPhone MKMapView注释聚类

时间:2011-10-18 00:01:01

标签: iphone annotations mkmapview markerclusterer

我有很多针脚放在我的地图上,所以我认为将这些注释聚类是个好主意。我不确定如何在iPhone上实现这一点,我能够使用谷歌地图和一些JavaScript示例来解决问题。但iPhone使用其mkmapview,我不知道如何在那里聚集注释。

您知道并且很好的任何想法或框架?感谢。

9 个答案:

答案 0 :(得分:38)

您不一定需要使用第三方框架,因为自iOS 4.2起,MKMapView有一个名为- (NSSet *)annotationsInMapRect:(MKMapRect)mapRect的方法,您可以使用它来进行群集。

查看WWDC11会话视频' Visualizing Information Geographically with MapKit'。大约一半的时间解释了如何做到这一点。但我会为您总结一下这个概念:

  • 使用两张地图(第二张地图永远不会添加到视图层次结构
  • 第二张地图包含所有注释(再次,它从未被绘制
  • 将地图区域划分为正方形网格
  • 使用-annotationsInMapRect方法从中获取注释数据 隐形地图
  • 可见地图根据隐形地图
  • 中的数据构建其注释

enter image description here

答案 1 :(得分:13)

由于这是一个非常常见的问题,我需要一个解决方案,我已经编写了一个支持群集的MKMapView自定义子类。然后我把它开源了!你可以在这里得到它:https://github.com/yinkou/OCMapView

它管理注释的聚类,您可以自己处理他们的视图。 您不必做任何事情,只需将OCMapView文件夹复制到项目中,在您的笔尖中创建MKMapView并将其类设置为OCMapView。 (或者在代码中创建和委托它,如常规MKMapView

答案 2 :(得分:11)

幸运的是,您不再需要第三方框架了。 iOS 11具有本机群集支持。

您需要实施mapView:clusterAnnotationForMemberAnnotations:方法。

在Apple示例中获取更多详细信息:https://developer.apple.com/sample-code/wwdc/2017/MapKit-Sample.zip

答案 3 :(得分:7)

通过使用Apple演示代码,我们可以轻松地在代码中实现集群概念。 Reference link

我们可以使用以下代码进行群集

实施群集的步骤

Step1:重要的是聚类我们使用两个mapview(allAnnotationsMapView),一个用于参考(allAnnotationsMapView)。

a -> Actor
b -> Country
c -> Revenue
id -> Costomer_Name, Employee_Number

viewDidLoad

@property (nonatomic, strong) MKMapView *allAnnotationsMapView;
@property (nonatomic, strong) IBOutlet MKMapView *mapView;

Step2:将所有注释添加到_allAnnotationsMapView,下面_photos是注释数组。

    _allAnnotationsMapView = [[MKMapView alloc] initWithFrame:CGRectZero];

Step3:添加以下方法进行聚类,在此PhotoAnnotation中是自定义注释。 MapViewDelegate方法

        [_allAnnotationsMapView addAnnotations:_photos];
        [self updateVisibleAnnotations];

群集处理方法

 - (void)mapView:(MKMapView *)aMapView regionDidChangeAnimated:(BOOL)animated {

    [self updateVisibleAnnotations];
}

- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views {

    for (MKAnnotationView *annotationView in views) {
        if (![annotationView.annotation isKindOfClass:[PhotoAnnotation class]]) {
            continue;
        }

        PhotoAnnotation *annotation = (PhotoAnnotation *)annotationView.annotation;

        if (annotation.clusterAnnotation != nil) {
            // animate the annotation from it's old container's coordinate, to its actual coordinate
            CLLocationCoordinate2D actualCoordinate = annotation.coordinate;
            CLLocationCoordinate2D containerCoordinate = annotation.clusterAnnotation.coordinate;

            // since it's displayed on the map, it is no longer contained by another annotation,
            // (We couldn't reset this in -updateVisibleAnnotations because we needed the reference to it here
            // to get the containerCoordinate)
            annotation.clusterAnnotation = nil;

            annotation.coordinate = containerCoordinate;

            [UIView animateWithDuration:0.3 animations:^{
                annotation.coordinate = actualCoordinate;
            }];
        }
    }
}

通过以上步骤,我们可以在mapview上实现集群,没有必要使用任何第三方代码或框架。请在此处查看Apple sample code。如果您对此有任何疑问,请告诉我。

答案 4 :(得分:2)

你看过ADClusterMapView吗? https://github.com/applidium/ADClusterMapView

确实就是这样。

答案 5 :(得分:2)

我只是想集中别针,只显示它的数字。以下一个 https://www.cocoacontrols.com/controls/qtree-objc符合我的期望。

答案 6 :(得分:1)

我最近在另一个答案中提到了ADClusterMapView,并解决了很多(如果不是全部)与项目相关的问题。它是一种kd-tree算法并为群集设置动画。

这里有可用的开源https://github.com/ashare80/TSClusterMapView

答案 7 :(得分:0)

试试这个框架(XMapView.framework);它现在支持iOS 8。

此框架不需要您更改当前的项目结构,它可以直接用于您的MKMapView。有一个zip文件。它为您提供了一次集群200个引脚的示例。我在iPod上测试后发现它非常流畅。

http://www.xuliu.info/xMapView.html

此库支持:

  1. 聚类不同的类别
  2. 群集所有类别
  3. 设置您自己的群集半径等
  4. 隐藏或显示某些类别
  5. 单独处理和控制地图中的每个图钉

答案 8 :(得分:0)

这里有一个非常酷且维护良好的Objective-C和Swift库:https://github.com/bigfish24/ABFRealmMapView

它集群非常好,并且由于与Realm的集成而处理了大量的点。