Ich arbeite an einer App, die MKOverlay-Ansichten verwendet, um eigene benutzerdefinierte Karten über der Google-Basiskarte zu erstellen. Ich habe Apples exzellenten TileMap-Beispielcode (von WWDC 2010) als Leitfaden verwendet.Berechnen von Kacheln zur Anzeige in einem MapRect, wenn über den Zoom hinausgezoomt wird
Mein Problem - wenn es auf eine Detailtiefe "überzoomt" wurde, die tiefer als meine generierte Kachelmenge ist, zeigt der Code nichts an, da auf der berechneten Z-Ebene keine Kacheln verfügbar sind.
Das Verhalten, das ich will - wenn die App "overzoomed" sollte einfach nur die tiefste Ebene der Fliesen zu vergrößern. Es ist eine gute Benutzererfahrung, dass das Overlay verschwommener wird - es ist eine sehr schlechte Erfahrung, das Overlay verschwinden zu lassen.
Hier ist der Code, der die Kacheln zum Zeichnen zurückgibt - ich muss herausfinden, wie man dies ändert, um die Z-Tiefe zu überdecken, ohne die Skalierung des Rahmens zu brechen, der für die Überlagerungskachel berechnet wird. Irgendwelche Gedanken ???
- (NSArray *)tilesInMapRect:(MKMapRect)rect zoomScale:(MKZoomScale)scale
{
NSInteger z = zoomScaleToZoomLevel(scale);
// PROBLEM: I need to find a way to cap z at my maximum tile directory depth.
// Number of tiles wide or high (but not wide * high)
NSInteger tilesAtZ = pow(2, z);
NSInteger minX = floor((MKMapRectGetMinX(rect) * scale)/TILE_SIZE);
NSInteger maxX = floor((MKMapRectGetMaxX(rect) * scale)/TILE_SIZE);
NSInteger minY = floor((MKMapRectGetMinY(rect) * scale)/TILE_SIZE);
NSInteger maxY = floor((MKMapRectGetMaxY(rect) * scale)/TILE_SIZE);
NSMutableArray *tiles = nil;
for (NSInteger x = minX; x <= maxX; x++) {
for (NSInteger y = minY; y <= maxY; y++) {
// As in initWithTilePath, need to flip y index
// to match the gdal2tiles.py convention.
NSInteger flippedY = abs(y + 1 - tilesAtZ);
NSString *tileKey = [[NSString alloc]
initWithFormat:@"%d/%d/%d", z, x, flippedY];
if ([tilePaths containsObject:tileKey]) {
if (!tiles) {
tiles = [NSMutableArray array];
}
MKMapRect frame = MKMapRectMake((double)(x * TILE_SIZE)/scale,
(double)(y * TILE_SIZE)/scale,
TILE_SIZE/scale,
TILE_SIZE/scale);
NSString *path = [[NSString alloc] initWithFormat:@"%@/%@.png",
tileBase, tileKey];
ImageTile *tile = [[ImageTile alloc] initWithFrame:frame path:path];
[path release];
[tiles addObject:tile];
[tile release];
}
[tileKey release];
}
}
return tiles;
}
FYI, hier ist die zoomScaleToZoomLevel Helferfunktion, dass jemand gefragt:
// Convert an MKZoomScale to a zoom level where level 0 contains 4 256px square tiles,
// which is the convention used by gdal2tiles.py.
static NSInteger zoomScaleToZoomLevel(MKZoomScale scale) {
double numTilesAt1_0 = MKMapSizeWorld.width/TILE_SIZE;
NSInteger zoomLevelAt1_0 = log2(numTilesAt1_0); // add 1 because the convention skips a virtual level with 1 tile.
NSInteger zoomLevel = MAX(0, zoomLevelAt1_0 + floor(log2f(scale) + 0.5));
return zoomLevel;
}
Chris - du bist ein Lebensretter. Ich habe mich nicht darauf gefreut, einen Workaround zu erstellen, also habe ich eine Suche durchgeführt und Ihre Antwort ist direkt aufgetaucht. Ich habe die 'zoomScaleToZoomLevel' -Funktion und' TILE_SIZE' -Konstante in die TileOverlayView.m-Datei von TileOverlay.m kopiert, damit es keinen Fehler auslöst, aber ansonsten funktioniert es einwandfrei. Tausend Dank! –
Kommentar entfernt, Code funktioniert gut – Craig
Ich verwende einen anderen Weg, um meine Kacheln zu finden, wie unter https://github.com/mtigas/iOS-MapLayerDemo beschrieben, aber die Idee ist im Grunde die gleiche. Ich habe es jedoch schwer, den Over Zoom darauf zu portieren. Hat jemand das getan? –