2010-12-04 53 views
5

Je travaille sur une application iPhone/iPad qui utilise des superpositions de cartes carrelées semi-transparentes via MKMapView et MKOverlay.Empêche la disparition des superpositions lors du zoom - MKMapView & MKOverlay

Je veux que les utilisateurs soient en mesure de zoomer profondément dans les cartes, mais la résolution de mes superpositions de carte ne passe au niveau 6.

Je ne veux pas limiter le zoom.

Mais ... Si un utilisateur zoome "trop ​​loin" puis fait défiler une nouvelle vignette, s'il est zoomé plus loin que l'arbre des vignettes de superposition, ma superposition n'est pas dessinée.

Je souhaite que l'incrustation soit dessinée même lorsque l'utilisateur a effectué un zoom avant profond.

Existe-t-il des meilleures pratiques pour y parvenir?

Les deux options que je suis venu avec:

1) Définissez une limite sur la façon dont les utilisateurs distants peuvent zoomer. Pas idéal parce que même si la superposition est basse résolution, ils sont probablement encore dans la gamme de transparence colorée, et avoir la surcouche transparente apparemment disparaître est trompeuse.

2) Pré-rendre les carreaux qui vont bien au-delà de ce qu'ils feraient autrement ... Cela fonctionne, mais il gonfle mon application d'un ordre de grandeur en taille.

Il doit y avoir un meilleur moyen. Des idées??? MISE À JOUR: L'exemple le plus proche de ce que je suis en train de faire est l'exemple TileMap d'Apple de WWDC 2010. Leur code souffre du même problème - si vous avez zoomé trop loin, la superposition de carte n'est pas affichée.

Répondre

2

J'ai modifié l'exemple de code TileMap d'Apple en ajoutant un mode «OverZoom». J'ai posté plus de détails et mon code comme réponse à this question.

J'espère que je peux aider quelqu'un d'autre qui trébuche sur ce problème.

1

Je recommande de vérifier le HazardMap sample code sur le site d'Apple ... c'est un excellent exemple de la façon de prendre en charge le zoom à tous les niveaux avec un MKOverlay en mosaïque.

+0

HazardMap est un bon exemple, mais il génère des tuiles par algorithme. J'utilise des carreaux qui sont coupés d'une autre carte en utilisant gdal2tiles. – radven

2

MKTileOverlay a une propriété maximumZ. Pour moi, mon serveur de tuiles n'affiche que le zoom 18 (mapnik à partir des données osm), donc je mets mon overlay.maximumZ = 18, et maintenant quand je zoome vers 19 ou 20 (le plus haut sur iPhone), il garde juste le zoom 18 tuiles.

Cela dit je suis Initialisation mon overlay via initWithURLTemplate:

En viewDidLoad (ou chaque fois que vous initialisez votre superposition):

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]; 

implment Ensuite, la méthode suivante:

-(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

C'est une bonne solution, mais si l'utilisateur fait défiler ce "niveau trop élevé", il n'affichera pas les tuiles non chargées. – dulgan