同一个MKMapView位置上的许多引脚

时间:2011-02-04 07:29:19

标签: cocoa-touch ios4 annotations mkmapview

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

干杯

的Nik

2 个答案:

答案 0 :(得分:10)

我通过引入“聚合”注释的概念来解决这个问题,这种注释表示注释,否则这些注释会过于接近而无法区分。

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

这种特殊算法易于实现,但由于它为每个添加的注释检查每个现有注释,因此复杂度非常高。优化是使用kd tree来减少搜索空间。

用户界面方式,点击这样的聚合注释会显示一个标注,显示聚合的注释数量,以及一些有关聚合注释的摘要信息。

此外,标注MKAnnotationView的{​​{1}}可以深入查看列表聚合注释成员的表视图,以便用户可以选择要检查的特定成员。

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

答案 1 :(得分:1)

https://stackoverflow.com/a/15438440/2482283

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

查看WWDC11会话视频'使用MapKit在地理上可视化信息'。大约一半的时间解释了如何做到这一点。但我会为你总结一下这个概念:

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