1

膨大な量の注釈 (8000 以上) を含む MapView があります。すべての注釈が表示されているときにマップをスクロールすると、パフォーマンスが低下します。そのため、可視領域にあるときにいくつかの注釈を非表示にするという考えがありました。フォーラムでこのスレッドを見つけましたが、問題は解決しません。

このコードを書いて別の解決策を試しました

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated
{
    NSSet *annoSet = [[NSSet alloc] initWithSet:[_mapView annotationsInMapRect:_mapView.visibleMapRect]];
    NSMutableSet *annotationsSet = (NSMutableSet *)annoSet;

    NSLog(@"Annos: %i", [annotationsSet count]);

    if([annotationsSet count]>500)
    {
        for(MapViewAnnotation* annotation in annotationsSet)
        {
            [[_mapView viewForAnnotation:annotation] setHidden:YES];
        }
    }
}

これは機能しますが、その操作の後、mapView はほぼ完全に故障しています。何を改善できますか?

編集:

私の新しいコードは次のようになります。

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated
{
    NSSet *annoSet = [[NSSet alloc] initWithSet:[_mapView annotationsInMapRect:_mapView.visibleMapRect]];
    //NSMutableSet *annotationsSet = (NSMutableSet *)annoSet;

    NSLog(@"Annos: %i", [annoSet count]);

    if([annoSet count]>500)
    {
        for(MapViewAnnotation* annotation in annoSet)
        {
            [[_mapView viewForAnnotation:annotation] setHidden:YES];
        }

    }
    else if([annoSet count] <= 500)
    {
        for(MapViewAnnotation* annotation in annoSet)
        {
            [[_mapView viewForAnnotation:annotation] setHidden:NO];
        }

    }
}

しかし、私はすべての注釈をvisibleRectに隠したくありません。効率的な方法でそれを行う方法はありますか?

4

1 に答える 1

3

探しているのは、注釈をクラスター化する方法です。つまり、複数の注釈が近接している場所に単一の注釈を表示することです。これは、正しく実行しようとするとやや複雑になる可能性がありますが、ネットを検索すると、クラスタリングの戦略とアルゴリズムについて説明している場所がいくつか見つかります。以下にそれらのいくつかにリンクしました。

Applidium Web サイトのこのブログ投稿では、そのような戦略の 1 つについて説明しています。現在、Github には、クラスタリングを処理できるいくつかのプロジェクト ( mapkit-clusterskingpinRevClusterMap ) があります。他に何もない場合は、コードを見てください。問題に対処する方法のアイデアが得られます。

しかし、私のチームがこの問題に取り組んでいたとき、WWDC ビデオの1 つ (これは、おそらく(開発者アカウントが必要)) で説明されている解決策を採用し、パフォーマンスを向上させるために多少変更を加えました。

クラスター化された注釈をクリックしたときにユーザーに知らせる方法を見つける必要があることに注意してください。これは、その単一の注釈によって表されるすべての注釈を一覧表示するカスタム コールアウトで行いました。

于 2013-01-02T13:07:50.480 に答える