Ver la versión completa : Dudas con los overlays en MapKit con acceso a un server WMS (XCode)
Holas!
Recientemente estoy intentando hacer una pequeña aplicación, muy básica, en la cual únicamente hay un mapa (MKMapView). En teoría lo que me gustaría conseguir es que se mostrara una capa por encima, un overlay, con una imagen en transparencia (o no). La imagen provendría de un server WMS, en el que sólo tengo que pasarle la coordenada superior izquierda, la inferior derecha, el tamaño de la imagen y poco más. En principio parece fácil, pero llevo más de dos días con el protocolo de los Overlays y no hay forma de conseguirlo. El usuario al ir ampliando o moviéndose por el mapa se le tendria que mostrar las imágenes que en teoría le devolvería el WMS.
La llamada al server por ejemplo seria: http://www.serverwms.com/getImage?box=xx.xxxxx,xx.xxxxx,xx.xxxxx,xx.xxxxx&width=xxx&height=xxxx (básicamente estos parámetros).
Hay algún parámetro más, pero lo he omitido ya que no hace falta para entender como va a funcionar el sistema.
Alguno lo ha probado alguna vez? Tiene algún ejemplo básico? He mirado algunos ejemplos en OSM pero no son lo mismo, en mi caso no importa el ZOOM, simplemente es pasarle en rectángulo visible de la pantalla, la resolución de la imagen y nada más.
Un saludo y muchas gracias.
^MiSaTo^
28/05/2013, 18:15
Quieres poner un overlay encima del mapView? No termino de entender qué es lo que quieres hacer, pero por qué no pones un UIImageView con alpha encima del MKMapView y ya está?
Hola,
Sí, un MKOverlayView. Es para mostrar capas encima del mapa. Lo que pasa es que el protocolo de los MKOverlays no lo acabo de ver claro, bueno sí, lo entiendo en algunos ejemplos que he visto por ahí pero en mi caso en concreto no.
http://www.ericbinnion.com/adding-custom-overlays-to-ios-mapkit-framework/
Sería algo similar a lo anterior pero cargando imágenes de un server WMS con la url de ejemplo que antes he posteado.
Un saludo.
^MiSaTo^
28/05/2013, 18:35
Ah! el MKOverlayView! Había entendido otra cosa distinta. Pues nunca lo he usado, pero este tutorial (http://i.ndigo.com.br/2012/05/ios-maps-with-image-overlays/) parece que lo explica bastante bien :)
Sólo tendrías que hacer una llamada a tu webservice, que te devuelva la imagen y usarla con ello.
Por cierto, ese código es para iOS4 pero no creo que tengas ningún problema en adaptarlo para que use ARC y demás nuevo de iOS5/6
Hola ^Misato^. He mirado el tutorial pero no me acaba de funcionar correctamente, hay cosas que no veo claras. Ellos muestran una imagen estática, en mi caso cada vez que te mueves o canvias el zoom debe recargar el overlay dependiendo de la posición en donde te encuentras. Voy a probar luego de cenar otra vez... a ver si me sale! Jejjeeje.
Gracias ^Misato^ por la ayuda. Luego te comento como ha ido.
Un saludo.
^MiSaTo^
28/05/2013, 22:04
En el método :
- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)ctx
{
UIImage *image = [[UIImage imageNamed:@"indigo_eiffel_blog.png"] retain];
CGImageRef imageReference = image.CGImage;
MKMapRect theMapRect = [self.overlay boundingMapRect];
CGRect theRect = [self rectForMapRect:theMapRect];
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextTranslateCTM(ctx, 0.0, -theRect.size.height);
CGContextDrawImage(ctx, theRect, imageReference);
[image release];
}
Te he marcado en negrita donde asigna la imagen. Como ves, es siempre la misma. Ya tendrás que jugar tú a hacer la llamada al webservice y coger la imagen cuando mueves el mapa (seguramente haya algún delegate que te lo indique) y meter la imagen ahí que te devuelva (por ejemplo guardándola en una variable de la clase).
No hagas la llamada al servidor en ese mismo método porque eso se llamará cada 2x3 (básicamente en cada frame) y ralentizarás muchísimo la aplicación.
No se ahora mismo qué métodos tiene MKMapView como delegate, pero estoy segura que tiene algo para saber cuándo has movido el mapa.
Y bueno si estás usando ARC, no puedes usar retain y release, pero de eso se quejará el propio compilador ;)
Hola,
Sí, sí, sé que la tengo que leer ahí la imagen pero hay algo que no me cuadra del todo. No sé, déjame hacer un par de pruebas y te comento. Lo de leer la imagen ahí cada vez no tendría que tener problemas ya que utilizo un gestor de caché y en principio si es la misma imagen no la leerá otra vez. Hasta dónde yo sé el delegado de re-pintar sólo se lanza cuando se produce zoom o algún. Corrígeme si me equivoco.
-----Actualizado-----
Mira, ahora lo estaba mirado bien....
Lo que no veo claro es que aquí sitúa el overlay siempre en un punto, en centro estático. En mi caso siempre tendría que conseguir las coordenadas del centro del mapa. Luego en el "MapOverlay.m" pone:
- (MKMapRect)boundingMapRect {
//Latitue and longitude for each corner point
MKMapPoint upperLeft = MKMapPointForCoordinate(CLLocationCoordinate2DMake (48.85995, 2.2933));
.....
Pues esos puntos me los tiene que sacar del mapa en cuestión, no ser fijos.
No se ahora mismo qué métodos tiene MKMapView como delegate, pero estoy segura que tiene algo para saber cuándo has movido el mapa.
Efectivamente, si que tiene métodos delegados cuando se mueve el mapa, porque yo lo estuve mirando hace un tiempo por encima.
MKMapViewDelegate
Responding to Map Position Changes
– mapView:regionWillChangeAnimated: (http://developer.apple.com/library/ios/documentation/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html#//apple_ref/occ/intfm/MKMapViewDelegate/mapView:regionWillChangeAnimated:)
– mapView:regionDidChangeAnimated: (http://developer.apple.com/library/ios/documentation/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html#//apple_ref/occ/intfm/MKMapViewDelegate/mapView:regionDidChangeAnimated:)
Sí, tiene pero no sé si servirán para los overlays.
-----Actualizado-----
Lo único que podría hacer es detectar cuando ha cambiado la región y luego borrar overlay y volver a cargar uno con los nuevos datos del mapa.
Hola!
He conseguido el efecto que quería.... pero haciendo un pequeño truquillo: pongo un UIImageView por encima del mapa con la imagen en cuestión, que se va actualizando cuando el usuario modifica el mapa. En principio parece que está correcto pero claro, si tengo MKAnnotation's en el mapa ya no los veo. He hecho que la carga de imágenes sea asíncrona y el efecto no queda mal del todo, pero como comenté yo creo que lo correcto es hacerlo con MKOverlayView. De momento sigo intentándolo....
Un saludo.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.