Cocoa touch 同一MKMapView位置上的多个管脚

Cocoa touch 同一MKMapView位置上的多个管脚,cocoa-touch,ios4,annotations,mkmapview,Cocoa Touch,Ios4,Annotations,Mkmapview,我有一个场景,许多人住在同一所房子里,因此被映射到相同的经度和纬度。我希望每个人都有一个注释。我必须在同一位置有多个注释/插脚,哪些选项?其他人是如何解决类似问题的 干杯 Nik我通过引入“聚合”注释的概念解决了这个问题,该注释表示的注释过于接近而无法区分 我使用了一个简单的(aka.naive)算法,当我添加一个新注释时,我检查它是否与现有注释的距离d。如果是,我将创建一个新的聚合注释,并将现有注释和新注释放置在其下。然后,我删除现有注释并添加聚合注释。聚合注释的坐标是其成员的平均值 这个特定

我有一个场景,许多人住在同一所房子里,因此被映射到相同的经度和纬度。我希望每个人都有一个注释。我必须在同一位置有多个注释/插脚,哪些选项?其他人是如何解决类似问题的

干杯


Nik

我通过引入“聚合”注释的概念解决了这个问题,该注释表示的注释过于接近而无法区分

我使用了一个简单的(aka.naive)算法,当我添加一个新注释时,我检查它是否与现有注释的距离
d
。如果是,我将创建一个新的聚合注释,并将现有注释和新注释放置在其下。然后,我删除现有注释并添加聚合注释。聚合注释的坐标是其成员的平均值

这个特定的算法很容易实现,但有相当可怕的复杂性,因为它会检查每个现有的注释和添加的注释。优化方法是采用
kd树
,以减少搜索空间

就用户界面而言,点击这样一个聚合注释将显示一个标注,显示聚合注释的数量,以及有关聚合注释的一些摘要信息

此外,调用的
MKAnnotationView
rightCalloutAccessoryView
可以深入到列出聚合注释成员的表视图中,以便用户可以选择要检查的特定成员

另一个需要考虑的问题是如何确定两个注释何时过于接近。您可以根据实际距离进行操作,在这种情况下,如果缩小,注释仍会重叠;或者,您也可以根据屏幕上的逻辑距离进行操作,同时考虑注释视图的逻辑大小。后者可以确保您永远不会有重叠的注释,但计算成本更高,因为当地图区域发生变化时,您需要重新计算聚合。

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

查看WWDC11会话视频“使用MapKit可视化地理信息”。大约一半的时候,它解释了如何做。但我将为您总结一下这个概念:

  • 列表项
  • 使用两个贴图(第二个贴图永远不会添加到视图层次)
  • 第二个贴图包含所有注释(同样,它从未绘制)
  • 将地图区域划分为正方形网格
  • 使用-annotationsInMapRect方法从中获取注释数据 隐形地图
  • “可见地图”从“不可见地图”中的该数据构建其注释

我的回答中应该有足够的内容来实施:)