5

マップに複数のオーバーレイが追加されている場合、カスタム MKOverlayView と標準 MKPolygonView の両方が特定のズーム レベルでクリップされるという問題があります。

2 回ダブルタップ ズーム レベルでのアルジェリアのオーバーレイ。

3 回ダブルタップ ズーム レベルでのアルジェリアのオーバーレイ。クリッピングに注意してください。

いくつかの観察:

  • これは、カスタム MKOverlayView を使用するかどうか、または同じポリゴンで MKPolygonView を返すかに関係なく発生します。
  • オーバーレイを 1 つだけ描画すると、この問題は発生しません。
  • これはすべてのオーバーレイで発生するわけではなく、一部のオーバーレイでのみ発生します。

コードに関する限り、これはオーバーレイを NSMutableArray (borderOverlays) に追加し、特定の国 ID のオーバーレイをロードするために別の場所にアクセスします。minX/minY/maxX/maxY は緯度/経度の値です。ポリゴンは、ESRI シェープファイルから構築されたパスです。

CLLocationCoordinate2D mbrMin = CLLocationCoordinate2DMake(minY, minX);
CLLocationCoordinate2D mbrMax = CLLocationCoordinate2DMake(maxY, maxX);
MKMapPoint minPoint = MKMapPointForCoordinate(mbrMin);
MKMapPoint maxPoint = MKMapPointForCoordinate(mbrMax);
MKMapSize size = MKMapSizeMake(maxPoint.x - minPoint.x, maxPoint.y - minPoint.y);
MKMapRect rect = MKMapRectMake(minPoint.x, minPoint.y, size.width, size.height);

if ( spans180 ) {
    rect = MKMapRectMake(minPoint.x, minPoint.y, MKMapSizeWorld.width * 2, size.height);
}

CustomMKOverlay* overlay = [[CustomMKOverlay alloc] initWithPolygon:polygon withBoundingMapRect:rect];
[borderOverlays addObject:overlay];

オーバーレイは、次の方法でマップに追加されます。

[mapView addOverlay:overlay];

viewForOverlay:

- (MKOverlayView *)mapView:(MKMapView*)aMapView viewForOverlay:(id<MKOverlay>)overlay
{
    if ( [overlay isKindOfClass:[CustomMKOverlay class]] ) {
        /* Note: the behaviour if this chunk is not commented is the exact same as below. 
        CustomMKOverlayView* overlayView = [[[CustomMKOverlayView alloc] initWithOverlay:overlay withMapView:aMapView] autorelease];
        [borderViews addObject:overlayView];
        return overlayView; */

        MKPolygonView* view = [[[MKPolygonView alloc] initWithPolygon:((CustomMKOverlay*)overlay).polygon] autorelease];
        view.fillColor = [((CustomMKOverlay*)overlay).colour colorWithAlphaComponent:0.5f];
        view.lineWidth = 5.0f;
        view.strokeColor = [UIColor blackColor];
        [borderViews addObject:view];
        return view;
    }
}

MKPolygonView を使用する場合、描画コードはありません (表示例)。ただし、完成のために、ここに私のカスタム描画コードを示しますが、同じ問題が発生します。アウトラインは通常描画します - これは実際にはデバッグ描画であり、オーバーレイのboundingMapRectの周りに四角形を描画し、アウトラインをいじらずに塗りつぶします。

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{    
    CustomMKOverlay* overlay = (CustomMKOverlay*)self.overlay;

    CGRect clipRect = [self rectForMapRect:overlay.boundingMapRect];
    CGContextAddRect(context, clipRect);
    CGContextClip(context);

    UIColor* colour = [UIColor redColor];
    colour = [colour colorWithAlphaComponent:0.5f];
    CGContextSetFillColorWithColor(context, [colour CGColor]);
    CGRect fillRect = [self rectForMapRect:overlay.boundingMapRect];
    CGContextFillRect(context, fillRect);
}

私はこの時点で少し困惑しています - ロードされているズームされたタイルがオーバーレイ上に描画されているかのようです。TileMap と HazardMap に関するさまざまな例を示しましたが、独自のマップ タイルを読み込んでいないため、あまり役に立ちません。

私はおそらく痛々しいほど明らかな何かを見逃しています。どんな助けでも大歓迎です。必要に応じて、より多くのコード/コンテキストを提供させていただきます。

4

1 に答える 1

3

犯人は次のようです。

CLLocationCoordinate2D mbrMin = CLLocationCoordinate2DMake(minY, minX);
CLLocationCoordinate2D mbrMax = CLLocationCoordinate2DMake(maxY, maxX);

MKOverlays の境界矩形は、境界領域の北西/南東座標に基づく必要があり、南西/北東 (ESRI シェープファイルが境界座標を格納する形式) ではないようです。問題のあるコードを次のように変更します。

CLLocationCoordinate2D mbrMin = CLLocationCoordinate2DMake(maxY, minX);
CLLocationCoordinate2D mbrMax = CLLocationCoordinate2DMake(minY, maxX);

ズーミングと奇妙なアウトラインの異常に関するすべての問題を解決しているように見えます。これが、将来この問題に遭遇した人に役立つことを願っています(この解決策は私にとってはうまくいくので、そうでない場合はそれについて聞きたいです)。

また、誰かがこれを述べているドキュメントを指摘できる場合は、それを見たいと思います。

于 2012-10-13T23:21:18.123 に答える