有效地绘制大量MKPolylines。可能吗?

时间:2015-01-22 07:39:10

标签: ios objective-c cocoa-touch mapkit

我的应用程序的功能是在后台运行,收集位置数据(' runkeeper'样式应用程序)。它可能会运行数小时,并收集数千个点。

这些'运行'在tableview中列出,在选择时它将重绘在地图上运行。我也为这些折线着色,所以为了在看似单一的线上有多种颜色,我连接了一堆不同的折线。当我去添加一个包含(比如700)行的NSArray时,使用

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
            lineArray = [self polylinesFromSession]; 
            dispatch_async(dispatch_get_main_queue(), ^{
                [map addOverlays:lineArray] // lineArray.count = ~700
            });
});

真的,真的,把应用程序搞砸了10-15秒。我不能在除main之外的任何线程上使用addOverlays,所以我在这里看不到很多选项。是否可以将一堆线连接到一个叠加层中,然后将其添加到地图中?或者,有什么想法可以更好地实现这一目标吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您的数据点是连续的,而不是添加数百个不同的行,请尝试将它们组合成一个包含多个点的行。

答案 1 :(得分:0)

您可以尝试动态创建线条的栅格图块(具有Alpha透明度),并将其作为MKTileOverlay添加到地图中。对于一行中的每个点,您可以在“图块空间”中找出它对应的点,并使用Core Graphics在该图块中绘制。您还可以跳过在前一行的点之上或之下的点(除非您使用不同的颜色绘图或想要以特定方式对线进行分层)。

这里的数学是一个答案的范围,但是球形墨卡托相对容易掌握,因为世界是一个连续平铺成较小正方形的大正方形,投影数学是相对简单的三角函数。

但是,只要您不需要在应用中单独与各种线注释进行交互,就可以通过这种方式获得更高的性能,但只需显示它们。