2012-02-16 52 views
1

当我绘制MKOverlays(有时具有5000多个单独MKPolylines)的路径时,绘制所有叠加层的时间很长,每次将地图视图滚动到新的地区,必须绘制该地区的覆盖图,并且还有另一个明显的冻结。绘制多个MKOverlay时的性能问题

我的两难处境是,我有两套代码都能正确绘制路径。第一条将路径绘制成一条长线,并且绘制速度非常快。第二条将每条线段绘制成一条线,并且需要很长的时间。

现在,为什么我会考虑第二种方式?因为我必须分析每条线,以查看线条应该是什么颜色。例如,如果该行的title属性为“红色”,那么我将该行变成红色,但如果它是“蓝色”,则该行是蓝色的。用第一种技术,这种特异性是不可能的(据我所知,但也许别人知道不同?),因为路径只是一条大路线,访问每个单独的分段是不可能的。第二种方式很简单,但需要很长时间。

这里是我的两套代码:

第一种方式(快,但不能访问单个段):

CLLocationCoordinate2D coords[sizeOverlayLat]; 

for(int iii = 0; iii < sizeOverlayLat; iii++) { 
    coords[iii].latitude = [[overlayLat objectAtIndex:iii] doubleValue]; 
    coords[iii].longitude = [[overlayLong objectAtIndex:iii] doubleValue]; 
} 

MKPolyline* line = [MKPolyline polylineWithCoordinates:coords count:sizeOverlayLat]; 

[mapViewGlobal addOverlay:line]; 

方式二(慢,但我可以得出每行一个特定的颜色):

NSMutableArray* lines = [NSMutableArray new]; 

for(int idx = 1; idx < sizeOverlayLat; idx++) { 
    CLLocationCoordinate2D coords[2]; 
    coords[0].latitude = [[overlayLat objectAtIndex:(idx - 1)] doubleValue]; 
    coords[0].longitude = [[overlayLong objectAtIndex:(idx - 1)] doubleValue]; 

    coords[1].latitude = [[overlayLat objectAtIndex:idx] doubleValue]; 
    coords[1].longitude = [[overlayLong objectAtIndex:idx] doubleValue]; 

    MKPolyline* line = [MKPolyline polylineWithCoordinates:coords count:2]; 
    [line setTitle:[overlayColors objectAtIndex:idx]]; 
    [lines addObject:line]; 
} 

[mapViewGlobal addOverlays:lines]; 

我的问题是:我可以通过第二种方法为我提供的每一行控件获得第一种方式的性能吗?

回答

1

你绝对可以得到这样的表现,但你可能需要创建自己的覆盖视图。

在该图中,您可以通过重复呼叫CGAddLineToPoint来绘制多段线,同时使用CGMoveToPoint跳过零件。为每种颜色单独做这件事,你就完成了。所以如果你有2种颜色(红色+蓝色),你可以通过你的多边形两次循环,首先绘制红色(跳过蓝色块),然后绘制蓝色(跳过红色块)。

+0

这个工作到底如何在地图视图上工作? – 2012-02-16 23:29:28

+0

它有点超出了简单的答案的范围。首先阅读文档。您需要创建一个'MKOverlayView'子类,在其中有一个执行绘制的' - (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context'。从那里你可以绘制你的多段线。 – mvds 2012-02-16 23:34:59

+0

哦,男孩。听起来像我有一些阅读要做! – 2012-02-16 23:47:51