2010-12-04 5 views
5

Ich arbeite an einer iPhone/iPad App, die halbtransparente gekachelte Karten-Overlays über MKMapView und MKOverlay verwendet.Verhindern, dass Overlays beim Zoomen verschwinden - MKMapView & MKOverlay

Ich möchte Benutzer in der Lage sein, tief in die Karten zu vergrößern, aber die Auflösung meiner Karten-Overlays geht nur auf Ebene 6.

Ich will nicht Zoomen begrenzen.

Aber ... Wenn ein Benutzer "zu weit" zoomt und dann zu einer neuen Kachel scrollt, wenn sie tiefer gezoomt sind als der Baum der Überlagerungskacheln, wird meine Überlagerung nicht gezeichnet.

Ich möchte das Overlay zeichnen, auch wenn der Benutzer tief eingezoomt ist.

Gibt es Best Practices, um dies zu erreichen?

Die beiden Optionen, die ich mit gekommen sind:

1) ein Limit setzen, wie weit Benutzer vergrößern. Nicht ideal, da selbst wenn die Überlagerung eine niedrige Auflösung aufweist, sie sich wahrscheinlich immer noch innerhalb des Farbbereichs der Transparenz befinden und das Verschwinden der transparenten Überschicht irreführend ist.

2) Pre-render Fliesen, die viel tiefer gehen als sie sonst ... Das funktioniert, aber es bringt meine App um eine Größenordnung in der Größe.

Es muss einen besseren Weg geben. Irgendwelche Ideen???

UPDATE: Das nächste Beispiel Code zu dem, was ich tue, ist Apples TileMap-Beispiel von WWDC 2010. Ihr Code leidet unter dem gleichen Problem - wenn Sie "zu weit" gezoomt wird das Karten-Overlay nicht angezeigt.

Antwort

2

Ich habe Apples TileMap-Beispielcode geändert, indem ich einen "OverZoom" -Modus hinzugefügt habe. Ich habe mehr Details und meinen Code als Antwort auf this question gepostet.

Ich hoffe, ich kann jemand anderen helfen, der über dieses Problem stolpert.

1

Ich empfehle, die HazardMap sample code auf Apples Website auszuprobieren ... es ist ein großartiges Beispiel dafür, wie Zoom auf allen Ebenen mit einem gekachelten MKOverlay unterstützt wird.

+0

HazardMap ist Ein gutes Beispiel, aber es generiert algorithmisch Kacheln. Ich verwende Kacheln, die mit gdal2tiles aus einer anderen Karte geschnitten werden. – radven

2

MKTileOverlay hat eine maximumZ-Eigenschaft. Für mich ist mein Kachelserver nur auf Zoom 18 (mapnik from osm data) gerendert, also setze ich meine overlay.maximumZ = 18, und jetzt, wenn ich auf 19 oder 20 zoome (am höchsten auf iPhone), behält sie einfach den Zoom bei 18 Fliesen.

Das sagte ich meine Overlay über initWithURLTemplate bin Initialisierung:

In viewDidLoad (oder wo auch immer Sie Ihre Overlay initialisieren):

self.mapView.delegate = self; 
NSString *urlTemplate = @"http://servername/osm/{z}/{x}/{y}.png"; 
self.mapOverlay = [[MKTileOverlay alloc] initWithURLTemplate:urlTemplate]; 
self.mapOverlay.canReplaceMapContent=YES; 
[self.map addOverlay:self.overlay level:MKOverlayLevelAboveLabels]; 

Dann implment die folgende Methode:

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {  
    if([overlay isKindOfClass:[MKTileOverlay class]]) { 
     MKTileOverlay *tileOverlay = (MKTileOverlay *)overlay; 
     tileOverlay.maximumZ = 18; // This is what sets the cap, zoom levels further in will not be rendered and instead will keep previous zoom level tiles. 
     MKTileOverlayRenderer *renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:tileOverlay]; 
     return renderer; 
    } 
    return nil; 
} 
+0

Es ist ein guter Workaround, aber wenn der Benutzer auf dieser "zu hohen Ebene" scrollt, zeigt er keine nicht geladenen Kacheln an. – dulgan

Verwandte Themen