7
votes

Empêchant les superpositions de disparaître lorsque zoomé - mkmapview & mkoverlay

Je travaille sur une application iPhone / iPad utilisant des superpositions de cartes carrelées semi-transparantes via mkapView et Mkoverlay.

Je veux que les utilisateurs puissent zoomer profondément dans les cartes, mais la résolution de mes superpositions de cartes ne va qu'au niveau 6.

Je ne veux pas limiter le zoom.

Mais ... si un utilisateur zoom sur "trop ​​loin" puis fait défiler vers une nouvelle tuile, si elles sont zoomées plus profondes que l'arbre de tuiles de superposition, ma superposition n'est pas dessinée.

Je veux que la superposition dessine même lorsque l'utilisateur est zoomé en profondeur.

Y a-t-il des meilleures pratiques pour y parvenir?

Les deux options que j'ai proposées:

1) Définissez une limite sur la façon dont les utilisateurs peuvent zoomer. Pas idéal car même si la superposition est faible, ils sont probablement toujours dans la plage de la transparence colorée et que la sur-couche transparente disparaît semble trompeuse.

2) Pré-restituer des carreaux qui vont bien plus loin que ce qu'ils ne seraient autrement ... cela fonctionne, mais ça ballons mon application par un ordre de grandeur de grandeur.

Il doit y avoir une meilleure façon. Des idées ???

Mise à jour: le code d'exemple le plus proche de ce que je fais que je peux trouver, c'est que l'exemple de Tilemap d'Apple de WWDC 2010. Leur code souffre du même problème - si vous êtes zoomé dans "trop ​​loin", la superposition de carte n'est pas affichée. < / p>


0 commentaires

3 Réponses :


1
votes

Je recommande de vérifier le HazardMap Sample Code sur Apple's Site ... C'est un excellent exemple de prise de zoom sur tous les niveaux avec un mkoverlay .


1 commentaires

HazardMap est un bon exemple, mais il génère des carreaux générant algorithmique. J'utilise des carreaux coupés à partir d'une autre carte à l'aide de Gdal2Tiles.



4
votes

J'ai modifié le code d'échantillon Tilemap d'Apple en ajoutant un mode "overzoom". J'ai posté plus de détails et mon code comme réponse à cette question .

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


0 commentaires

4
votes

MKTILEOVERLAY a une propriété MAXIMULZ. Pour moi, mon serveur de carreaux n'a rendu que zoomer 18 (Mapnik à partir de données OSM), donc j'ai défini ma superposition.maximze = 18, et maintenant, lorsque je zoomez à 19 ou 20 (la plus haute sur iPhone), il garde juste le zoom 18 tuiles.

qui a dit que je initialise ma superposition via initwithurltemplate: p>

dans la vue ViewDiDload (ou où vous initialisez votre superposition): p> xxx pré>

implense ensuite les éléments suivants Méthode: P>

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


1 commentaires

C'est une bonne solution de contournement, mais si l'utilisateur fait défiler l'utilisateur à ce «trop haut niveau», il n'ayera pas afficher les carreaux non chargés.