2010-12-04 17 views
5

Estoy trabajando en una aplicación para iPhone/iPad que utiliza superposiciones de mapas en mosaico semi-transparentes a través de MKMapView y MKOverlay.Evitar que las superposiciones desaparezcan al hacer zoom: MKMapView & MKOverlay

que desea que los usuarios puedan hacer un zoom profundamente en los mapas, pero la resolución de mis mapa superposiciones sólo llega hasta el nivel 6.

no quiero limitar el zoom.

Pero ... Si un usuario acerca el zoom "demasiado lejos" y luego se desplaza a un nuevo mosaico, si se hace un zoom más profundo que el árbol de las superposiciones, mi superposición no se dibuja.

Quiero que la plantilla se dibuje incluso cuando el usuario amplía profundamente.

¿Existen mejores prácticas para lograr esto?

Las dos opciones que he llegado con:

1) Establecer un límite en la medida de los usuarios pueden hacer zoom. No es ideal, porque incluso si la superposición es de baja resolución, es probable que aún se encuentre dentro del rango de transparencia coloreado, y que la superposición transparente desaparezca es engañosa.

2) Pre-renderizar fichas que van mucho más allá de lo que harían de otra manera ... Esto funciona, pero muestra mi aplicación en orden de magnitud.

Tiene que haber una manera mejor. ¿¿¿Algunas ideas???

ACTUALIZACIÓN: El código de ejemplo más cercano a lo que estoy haciendo es la muestra de Apple TileMap de WWDC 2010. Su código sufre del mismo problema: si se acerca demasiado, no se muestra la superposición del mapa.

Respuesta

2

Modifiqué el código de muestra de TileMap de Apple agregando un modo "OverZoom". He publicado más detalles y mi código como respuesta al this question.

Espero poder ayudar a cualquier otra persona que tropiece con este problema.

1

Recomiendo ver el HazardMap sample code en el sitio de Apple ... es un gran ejemplo de cómo apoyar el zoom en todos los niveles con un MKOverlay embaldosado.

+0

HazardMap es un buen ejemplo, pero está generando algorítmicamente fichas. Estoy usando mosaicos que se cortan desde otro mapa usando gdal2tiles. – radven

2

MKTileOverlay tiene una propiedad maximumZ. Para mí, mi servidor de mosaico solo renderizó hasta zoom 18 (mapnik de datos de osm), así que configuré mi overlay.maximumZ = 18, y ahora cuando acerco a 19 o 20 (el más alto en iPhone), solo mantiene el zoom 18 fichas

Dicho esto estoy inicializando mi superposición a través de initWithURLTemplate:

En viewDidLoad (o donde usted hace funcionar su superposición):

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

Entonces implment el siguiente método:

-(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 una buena solución, pero si el usuario se desplaza en este "nivel demasiado alto", no mostrará mosaicos cargados. – dulgan

Cuestiones relacionadas