限制显示的注释数量

时间:2012-02-10 10:19:28

标签: ios plist mapkit

您好我的应用程序运行良好,它会将注释加载到来自不同plist的几个不同的地图。

我的问题是我的一个plist上有大约5000个注释,地图视图大约需要20秒来显示注释。

有没有办法可以限制加载的注释数量,说当前位置的半径为20公里?

这会缩短加载时间吗?

我不想从头开始重做并建立一个数据库,因为我基本上已经完成,所以我有一个plist。

2 个答案:

答案 0 :(得分:1)

我建议的选项,如果你想留下plist,就是把大的plist分成更小的区域。

如果将它们分解到7个澳大利亚州,可以提供所需的性能水平,那就没关系了。但我会创建较小的区域(所有矩形),每个区域覆盖一侧固定的N个度数。 N不应该太小但也不能太大(这取决于你想要显示数据的当前位置有多远)。

例如,您可以将单个plist分解为16个这样的区域(它不必是方形数字):

         North

        A B C D
 West   E F G H   East
        I J K L
        M N O P

         South

Plist“A”将包含注释数据,例如Lat 50到51和Lon 100到110 Plist“B”将包含Lat 50至51和Lon 110至120的注释数据 Plist“E”将包含Lat 49到50和Lon 100到110的注释数据 等

我还会有一个额外的“索引”plist,让app知道给定坐标所在的plist以及plist的邻居是什么。然后,应用程序可以从当前位置的plist及其邻居读取注释数据,以防当前位置靠近区域边缘。

索引plist的结构可能如下所示:

PlistName  NWCoordinate  SECoordinate  Neighbors
A          51,100        50,110        B, E, F
F          50,110        49,120        A, B, C, E, G, I, J, K

索引plist将在应用程序开始时读取一次。

然后,一旦应用程序具有当前位置(或者只要它变得足够显着),该应用程序将执行以下操作:

  • 从地图中删除现有注释。
  • 使用索引确定要从中加载新注释的plist。假设当前位置是49.25,112.3。使用索引,应用程序将F plist及其邻居加载到某个数组中(不是一次直接添加到地图中)。
  • 使用addAnnotations一次性在阵列中添加注释。

答案 1 :(得分:1)

5,000分不是很多,我有数据库有100,000点,而且它仍然明显快于那个(我没有使用MapKit)。如果需要20秒,那么它必须为每个标记做一些网络流量吗?

你的plist是否包含每个标记的纬度/经度?如果是这样,那么您可以为地图上的每个标记创建一个CLLocation对象,并为地图中心创建一个CLLocation对象,然后使用[mapCentre distanceFromLocation:markerLocation]来计算距离(在米)从中心到标记。

删除地图上没有的任何内容,你应该好好去。

如果你想将你的plist拆分成较小的文件,我会根据它们的位置拆分它们。例如,纬度/经度以125.1 / -19.1开头的任何标记都在一个文件中。

我在澳大利亚工作的经历是,像墨尔本这样的城市在很小的区域里有很多东西,而这个国家的其他地方几乎是空的。因此很难将事情分成更小的块。

此外,通过乐器中的“时间档案”功能运行您的应用程序,以了解实际需要这么长时间。这是Xcode中的Product -> Profile菜单项。你可以找到很多关于如何在线使用它的教程。