2012-10-12 12 views
5

Mam problem z obcinaniem niestandardowego MKOverlayView i standardowego MKPolygonView przy określonych poziomach powiększenia, gdy do mapy dodanych jest wiele nakładek.Niestandardowy MKOverlayView/niezmodyfikowany MKPolygonView jest obcięty z pewnymi poziomami powiększenia

The overlay of Algeria at two double tap zoom level.

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

Kilka obserwacji:

  • Dzieje się tak niezależnie od tego, czy mogę użyć niestandardowego MKOverlayView lub zwrócić MKPolygonView z tych samych wielokątów.
  • Jeśli narysuję tylko jedną nakładkę, ten problem nie występuje.
  • Nie dotyczy wszystkich nakładek - tylko niektórych.

Odnośnie kodu: dodaje nakładkę do obiektu NSMutableArray (borderOverlays), który jest następnie dostępny w innym miejscu w celu załadowania nakładki dla określonego identyfikatora kraju. minX/minY/maxX/maxY są wartościami szerokości/długości geograficznej; wielokąt jest ścieżką zbudowaną z pliku kształtu 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]; 

Nakładka dodaje się do mapy przez:

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

Gdy stosuje MKPolygonView nie ma kod rysunku (w przedstawionym przykładzie). Na zakończenie jednak, oto mój niestandardowy kod rysunkowy i pojawia się ten sam problem. Kontury normalnie rysują - jest to faktycznie debugowanie rysunku, który rysuje prostokąt wokół obwiedniMapRect nakładki i wypełnia ją bez obrysu konturów.

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

Wystarczy powiedzieć, że jestem trochę zakłopotany w tym momencie - to prawie tak, jakby powiększony kaflowy, który jest ładowany rysuje na nakładce. Rozlewałem różne przykłady dotyczące TileMap i HazardMap, ale ponieważ nie ładuję własnych kafelków mapy, nie są one zbyt pomocne.

Prawdopodobnie brakuje mi czegoś boleśnie oczywistego. Każda pomoc będzie doceniona. W razie potrzeby chętnie udostępnimy więcej kodu/kontekstu.

Odpowiedz

3

Wydaje się, że winowajcą jest:

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

Bounding prostokątów dla MKOverlays widocznie muszą być oparte na Northwest/południowo współrzędnych regionie okalającym, a nie zachód/północny wschód (czyli format, ESRI shapefile przechowuje swoje współrzędne graniczne w). Zmiana kodu naruszającego do:

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

Pojawia się rozwiązać wszystkie problemy z powiększaniem i dziwnych anomalii zarys. Mam nadzieję, że pomoże to każdemu, kto natknie się na ten problem w przyszłości (i chciałbym o tym usłyszeć, jeśli tak się nie stanie, ponieważ to rozwiązanie działa dla mnie jak smakołyk).

Ponadto: jeśli ktokolwiek może wskazać dowolną dokumentację, która to stwierdza, chciałbym ją zobaczyć.

Powiązane problemy