2012-10-12 4 views
5

Sto riscontrando un problema sia con un MKOverlayView personalizzato che con MKPolygonView standard che viene ritagliato a determinati livelli di zoom quando sono presenti più sovrapposizioni aggiunte a una mappa.Personalizzato MKOverlayView/non modificato MKPolygonView è ritagliato a determinati livelli di zoom

The overlay of Algeria at two double tap zoom level.

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

Alcune osservazioni:

  • Questo si verifica indipendentemente dal fatto che io uso una consuetudine MKOverlayView o restituire un MKPolygonView con gli stessi poligoni.
  • Se disegno solo una sovrapposizione, questo problema non si verifica.
  • Questo non si verifica per tutti gli overlay, solo alcuni.

Per quanto riguarda il codice va: questo aggiunge la sovrapposizione a un NSMutableArray (borderOverlays), che viene poi letta altrove per caricare la sovrapposizione per uno specifico ID paese. minX/minY/maxX/maxY sono valori di latitudine/longitudine; poligono è un percorso costruito da uno shapefile 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]; 

La sovrapposizione viene aggiunto alla mappa attraverso:

[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; 
    } 
} 

Quando si utilizza MKPolygonView, non v'è alcun codice di disegno (nell'esempio illustrato). Per motivi di completezza, tuttavia, ecco il mio codice di disegno personalizzato e si verifica lo stesso problema. I contorni normalmente disegnano - questo è in realtà il debug del disegno, che disegna un rettangolo attorno al limite di mappatura della sovrapposizione e lo riempie senza aggirarlo con i contorni.

- (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); 
} 

Basti dire, io sono un po 'perplesso, a questo punto - è quasi come se la zoomata in maiolica che viene caricato disegna sopra la sovrapposizione. Ho analizzato vari esempi riguardanti TileMap e HazardMap, ma poiché non sto caricando le mie tessere della mappa, non sono molto utili.

Probabilmente mi manca qualcosa di dolorosamente ovvio. Qualsiasi aiuto sarebbe apprezzato. Sono felice di fornire più codice/contesto se necessario.

risposta

3

Sembrerebbe che il colpevole è:

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

delimitazione rettangoli MKOverlays a quanto pare devono essere basati sul nord-ovest/coordinate sud-est della regione di delimitazione, e non sud-ovest/nord-est (che è il formato del Il file di forma ESRI memorizza le sue coordinate di delimitazione in). Modifica del codice all'origine:

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

Appare risolvere tutti i problemi con lo zoom e anomalie anomale di contorni. Spero che questo aiuti qualcuno che si imbatte in questo problema in futuro (e mi piacerebbe sentirne parlare se non lo fa, dal momento che questa soluzione funziona per me).

Inoltre: se qualcuno può indicare qualsiasi documentazione che lo dichiari, mi piacerebbe vederlo.

Problemi correlati