Je travaille sur une application qui utilise les vues MKOverlay pour superposer mes propres cartes personnalisées en haut de la carte de base Google. J'ai utilisé l'excellent exemple de code TileMap d'Apple (de la WWDC 2010) comme guide. Mon problème - lorsque "overzoomed" à un niveau de détail plus profond que mon ensemble de tuiles générées, le code affiche rien parce qu'il n'y a pas de tuiles disponibles au niveau Z calculé.Calcul de mosaïques à afficher dans un MapRect en cas de "sur-zoom" au-delà de l'ensemble de mosaïques de superposition
Le comportement que je veux - lorsque l'application est "sur-agrandie", il ne faut que grossir le niveau le plus profond des tuiles. C'est une bonne expérience pour l'utilisateur de devenir plus flou - c'est une très mauvaise expérience de faire disparaître le recouvrement.
Voici le code qui retourne les tuiles à dessiner - J'ai besoin de comprendre comment modifier cela pour plafonner la profondeur Z sans casser la mise à l'échelle de la trame étant calculée pour la tuile de superposition. Des pensées???
- (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;
}
Pour votre information, voici la fonction d'aide zoomScaleToZoomLevel que quelqu'un a demandé sur:
// 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 - vous êtes un sauveur. Je n'avais pas envie de créer une solution de contournement, alors j'ai fait une recherche, et votre réponse est apparue. J'ai copié la fonction 'zoomScaleToZoomLevel' et la constante' TILE_SIZE' dans le fichier TileOverlayView.m de TileOverlay.m afin de ne pas lancer une erreur, mais à part cela, cela fonctionne parfaitement. Merci un million! –
commentaire supprimé, le code fonctionne bien – Craig
J'utilise une manière différente de trouver mes tuiles comme décrit à https://github.com/mtigas/iOS-MapLayerDemo, mais l'idée est la même fondamentalement. J'ai du mal à porter le zoom sur. Quelqu'un a fait ça? –