2012-10-12 118 views
5

Tengo un problema tanto con un MKOverlayView personalizado como con un MKPolygonView estándar recortado en ciertos niveles de zoom cuando hay varias superposiciones agregadas a un mapa.Personalizado MKOverlayView/no modificado MKPolygonView está recortado en ciertos niveles de zoom

The overlay of Algeria at two double tap zoom level.

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

Algunas observaciones:

  • Esto ocurre independientemente de si o no utilizo una costumbre MKOverlayView o devolver un MKPolygonView con los mismos polígonos.
  • Si solo dibujo una superposición, este problema no ocurre.
  • Esto no ocurre con todas las superposiciones, solo algunas.

En lo que respecta al código: esto agrega la superposición a un NSMutableArray (borderOverlays), que luego se accede a otra parte para cargar la superposición para un ID de país específico. minX/minY/maxX/maxY son valores de latitud/longitud; polígono es una ruta construida a partir de un archivo shape de 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 superposición se añade al mapa a través de:

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

Cuando se utiliza MKPolygonView, no hay código de dibujo (el ejemplo mostrado). Sin embargo, para completar, aquí está mi código de dibujo personalizado, y ocurre el mismo problema. Los contornos normalmente dibujan: esto es, en realidad, dibujo de eliminación de fallas, que dibuja un rect alrededor del delimitadorMapRect de la superposición y lo rellena sin ensuciar con los contornos.

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

Basta con decir que estoy un poco perplejo en este momento - es casi como si el que está siendo cargado ampliada de baldosas atrae a más de la superposición. He publicado varios ejemplos sobre TileMap y HazardMap, pero como no estoy cargando mis propios mosaicos de mapas, no son muy útiles.

Probablemente me esté perdiendo algo dolorosamente obvio. Cualquier ayuda sería apreciada. Me complace proporcionar más código/contexto si es necesario.

Respuesta

3

Parece que el culpable es:

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

delimitador rectángulos de MKOverlays aparentemente tienen que basarse en el noroeste/coordenadas del sureste de la región de borde, y no suroeste/noreste (que es el formato del El archivo shape de ESRI almacena sus coordenadas de delimitación en). Cambiar el código erróneo a:

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

aparece para resolver todos los problemas con la función de zoom y anomalías contorno extraños. Espero que esto ayude a cualquiera que se encuentre con este problema en el futuro (y me gustaría saber si no lo hace, ya que esta solución funciona de maravilla para mí).

También: si alguien puede señalar cualquier documentación que establezca esto, me gustaría verlo.

Cuestiones relacionadas