1

MKOverlays (場合によっては 5000 以上の個別の MKPolylines) でパスを描画すると、すべてのオーバーレイが描画されるまで非常に長い時間がかかり、マップ ビューが新しい領域にスクロールされるたびに、その領域のオーバーレイが描画する必要があり、別の顕著なフリーズアップがあります。

私のジレンマは、パスを正しく描画する 2 つのコード セットがあることです。1 つ目はパスを 1 本の長い線として描画し、非常に高速に描画します。2 つ目は、各線分を個別の線として描画するため、長い時間がかかります。

さて、なぜ私は2番目の方法を検討するのでしょうか? 個々の線を分析して、線の色を確認する必要があるためです。たとえば、線のtitleプロパティが「赤」の場合は線を赤にしますが、「青」の場合は線を青にします。最初の手法では、パスが 1 本の大きな線にすぎず、個々のセグメントにアクセスできないため、この種の特異性は不可能です (私の知る限りでは、他の誰かが別の方法で知っているのではないでしょうか?)。2 番目の方法は簡単ですが、時間がかかります。

これが私の2セットのコードです:

最初の方法 (高速ですが、個々のセグメントにアクセスできません):

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];

2番目の方法(遅いですが、特定の色で各線を描くことができます):

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];

私の質問は次のとおりです。2 番目の方法で提供される各行を制御して、最初の方法のパフォーマンスを得ることができますか?

4

1 に答える 1

2

確かにそのようなパフォーマンスを得ることができますが、おそらく独自のオーバーレイ ビューを作成する必要があります。

CGAddLineToPointそのビューでは、を使用してパーツをスキップしながら、 を繰り返し呼び出してポリラインを描画できますCGMoveToPoint。これを色ごとに別々に行えば完成です。したがって、2 つの色 (赤 + 青) がある場合、ポリゴンを 2 回ループし、最初に赤を描画 (青の部分をスキップ) し、次に青を描画 (赤の部分をスキップ) します。

于 2012-02-16T23:19:04.820 に答える