2009-07-22 56 views
83

Estoy familiarizado con el uso de la API de JavaScript de Google Maps. Recientemente comencé a usar el framework MapKit para un proyecto de iphone, pero estoy teniendo un momento difícil para descifrar y establecer una región en el mapa.MKMapView Zoom y región

En la API de Google Maps solía usar niveles enteros de zoom como 8, 9, 10 junto con la función simple setZoom(). El único método equivalente que puedo ver en el marco de MapKit es setRegion: animado. Según tengo entendido, necesito establecer los valores de "delta" de latitud y longitud del tramo de una región para especificar el nivel de zoom. Pero realmente no tengo una idea de lo que representan estos valores (leí la documentación).

Cuando uso un delegado MKMapView y rastreo los valores de span en regionDidChange los resultados del método delegado no parecen correlacionarse entre sí. Está bien cuando alejo y veo que los valores delta del span están aumentando según lo especificado en la documentación. Pero de repente arrastro el mapa sin hacer zoom y los valores delta se convierten en 0.0.

¿Alguien puede explicar cuál es el punto de referencia para estos tramos y delta? ¿O hay algún algoritmo para convertir un nivel de zoom entero (como 9) a estos valores delta?

Como pregunta extra ¿Hay alguna forma para especificar un nivel de zoom mínimo-máximo en un MKMapView :)

Gracias

Respuesta

133

En primer lugar, MKMapView no utiliza/tiene un conjunto predefinido de niveles de zoom como lo hace Google Maps.

lugar de ello, el área visible de un MKMapView se describe utilizando MKCoordinateRegion, que consiste en dos valores:

  1. centro (el punto central de la región), y
  2. lapso (el tamaño del área visible alrededor del centro).

El punto central debe ser obvio (es el punto central de la región.)

Sin embargo, el período de (que es un MKCoordinateSpan) se compone de:

  1. latitudeDelta (la distancia vertical representado por la región), y
  2. longitudeDelta (la distancia horizontal representados por la región).

Un breve ejemplo. He aquí una MKCoordinateRegion juguete:

  1. centro:
    • la latitud: 0
    • longitud: 0
  2. útil:
    • latitudeDelta: 8
    • longitudeDelta: 6

La región podría describirse utilizando su min y max coordina como sigue:

  1. min de coordenadas (menor punto de la izquierda):
    • latitud: -4
    • longitud : -3
  2. coordenada máxima (punto superior derecho):
    • la latitud: 4
    • longitud: 3

Por lo tanto, puede especificar los niveles de zoom alrededor de un punto central mediante el uso de un tamaño adecuado MKCoordinateSpan. Como una aproximación de los niveles de zoom numérico de Google, podría realizar una ingeniería inversa de los tamaños de tramo que utiliza Google para un nivel de zoom dado y crear un tramo, en consecuencia. (Google describe sus regiones de vista de la misma manera que MKMapView, como un centro + intervalo, por lo que puede extraer estos valores de Google Maps.)

En cuanto a restringir la región, puede jugar con este método delegado :

mapView:regionWillChangeAnimated 

por ejemplo al cambiar el tamaño de la región a los niveles de zoom permitidos. (Algo parecido a cómo las vistas de tabla le permitirán desplazarse más allá del borde, pero luego la banda de goma volverá a su lugar). Sin embargo, su kilometraje puede variar, ya que no lo he usado para este propósito.

Por cierto, hay correcciones/mejoras definitivas en OS 3.1 a los aspectos de MapKit que me estaban dando problemas en 3.0.

+0

Niza descrito, que me dejó sabía lo básico. ¡¡Voto arriba !!! – NSPratik

+0

@ Kelvin, ¿puedes describir más detalles sobre cómo "aplicar ingeniería inversa al tamaño del tramo que utiliza Google para un nivel de zoom determinado y crear un tramo"? Realmente lo necesito –

4

El lapso es en grados de latitud y longitud. Hay un método para construir estructuras de MKCoordinateRegion que toma distancia, en cambio. Puede ser que estés usando MKCoordinateRegionMakeWithDistance para especificar el span, y luego cuando lo controles en regionDidChange, estás viendo en el lat/long span, que es como está almacenado en una estructura MKCoordinateRegion.

Por lo que yo sé, los niveles de zoom enteros no están disponibles o son útiles en absoluto cuando se trabaja con MKMapKit. Yo personalmente prefiero usar las cifras de tramo, es más flexible.

No se puede especificar el zoom máximo y mínimo, y no sé de una forma de hackearlo. MKMapKit es bastante débil en este momento, estoy bastante decepcionado por la falta de funciones.

3

Una comparación rápida de los niveles de zoom para una ubicación usando maps.google.com mediante la inspección de la cadena de consulta de enlace muestra que el dx y dy valores de referencia aumento por un factor de 2:

(0.005334, 0.011834) starting span 
(0.010668, 0.023668) dx: x2, dy: x2 
(0.021335, 0.047337) dx: x2, dy: x2 
(0.042671, 0.094671) dx: x2, dy: x2 
    ... 
117

Si prefiere utilizar niveles de zoom explícitos en lugar de definir un MKCoordinateSpan, escribí una categoría que incluye soporte para la especificación el nivel de zoom de un MKMapView. El código se puede encontrar here.

+0

Publicaciones realmente interesantes, gracias por el enlace. –

+4

Las publicaciones de Troy en el blog me dieron una gran comprensión de cómo funcionan Mapkit y Google Maps. Recomiendo fuertemente leer esto. – afarnham

+1

gran hombre de trabajo ... en análisis en profundidad ... – harshalb

2

La categoría de Brant en MKMapView funciona bien. Sin embargo, parece que no se ha actualizado para admitir dispositivos más nuevos con pantallas Retina al calcular mapSizeInPixels.

Se puede fijar mediante la sustitución de esta línea:

CGSize mapSizeInPixels = mapView.bounds.size; 

Con esta línea:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale); 
Cuestiones relacionadas