【发布时间】:2011-02-04 07:29:19
【问题描述】:
我有一个场景,很多人住在同一所房子里,因此被映射到相同的经度和纬度。我希望每个人都有一个注释。我必须在同一个位置有很多注释/图钉有哪些选择?其他人是如何解决类似问题的?
干杯
尼克
【问题讨论】:
标签: cocoa-touch ios4 annotations mkmapview
我有一个场景,很多人住在同一所房子里,因此被映射到相同的经度和纬度。我希望每个人都有一个注释。我必须在同一个位置有很多注释/图钉有哪些选择?其他人是如何解决类似问题的?
干杯
尼克
【问题讨论】:
标签: cocoa-touch ios4 annotations mkmapview
我通过引入“聚合”注解的概念解决了这个问题,该注解表示否则会靠得太近而无法区分的注解。
我采用了一种简单(又名幼稚)的算法,当我添加新注释时,我会检查它是否与现有注释的距离 d。如果是,我创建一个新的聚合注释,将现有注释和新注释放在它下面。然后我删除现有注释并添加聚合注释。聚合注释的坐标是其成员的平均值。
这个特定的算法很容易实现,但是非常复杂,因为它会检查每个现有的注解来添加每个注解。一种优化是使用kd tree 来减少搜索空间。
在用户界面方面,点击这样的聚合注释会显示一个标注,显示聚合注释的数量,以及关于聚合注释的一些摘要信息。
此外,标注的MKAnnotationView 的rightCalloutAccessoryView 可以深入到列出聚合注释成员的表格视图中,以便用户可以选择特定的成员进行检查。
另一个考虑因素是如何确定两个注释何时太接近。您可以根据实际距离进行操作,在这种情况下,如果您缩小注释仍然会重叠;或者您可以根据屏幕上的逻辑距离执行此操作,同时考虑注释视图的逻辑大小。后者可以确保您永远不会有重叠的注释,但计算量更大,因为您需要在地图区域更改时重新计算聚合。
【讨论】:
https://stackoverflow.com/a/15438440/2482283
您不一定需要使用 3rd 方框架,因为从 iOS 4.2 开始,MKMapView 有一个名为 - (NSSet *)annotationsInMapRect:(MKMapRect)mapRect 的方法,您可以使用它来进行集群。
观看 WWDC11 会议视频“使用 MapKit 在地理上可视化信息”。大约一半的时候解释了如何去做。但我会为你总结一下这个概念:
【讨论】: