2012-10-12 9 views
5

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

The overlay of Algeria at two double tap zoom level.

The overlay of Algeria at three double tap zoom level. Note the clipping.

いくつかの観察:

  • これは関係なく、私がカスタム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に関するさまざまな例を書いてきましたが、自分のマップタイルをロードしていないので、あまり役に立ちません。

私はおそらく何かが痛いほど分かりません。どんな助けもありがとう。必要に応じてより多くのコード/コンテキストを提供できることを嬉しく思います。

答えて

3

犯人であると思われる:

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

がMKOverlaysのための長方形のバウンディング明らかフォーマットである(北西/南東境界領域の座標ではなく、南西/北東に基づいてする必要がありますESRI shapefileはその境界座標を格納します)。問題のコードを次のように変更します。

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

ズームや奇妙なアウトラインの異常に関するすべての問題を解決するように表示されます。私はこれが将来この問題を横断している人に役立つことを願っています(この解決策は私のために働くので、それがないと聞いてみたいのですが)。

また、誰かがこれを述べた文書を指し示すことができるなら、私はそれを見たいと思います。

関連する問題