85 votos

MKMapView Zoom y Región

Yo estoy familiarizado con el uso de Google Maps Javascript API. Recientemente empecé a usar MapKit marco de un iphone proyecto, pero estoy teniendo un tiempo difícil para averiguar el zoom y la configuración de una región en el mapa.

En la API de Google Maps he usado entero niveles de zoom, así como 8, 9, 10, junto con la función directa setZoom(). El único método equivalente puedo ver en el framework MapKit es setRegion:animación. Como yo lo entiendo, tengo que crear una región palmo de longitud y latitud de "delta" valores para especificar el nivel de zoom. Pero yo realmente no tienen una idea de lo que representan estos valores(he leído la documentación).

Cuando yo uso una MKMapView delegado y traza el intervalo de valores en regionDidChange delegado método resultados no parecen correlacionar cada uno de los otros. Es aceptar cuando me ampliar y ver el lapso de los valores delta están aumentando como se especifica en la documentación. Pero de repente me arrastre el mapa sin hacer zoom y los valores delta convertido en 0.0.

Puede alguien por favor explique lo que es el punto de referencia para estos span y el delta? O es que hay algún algoritmo para convertir un entero en el nivel de zoom(como 9) a estos valores delta?

Como un bono pregunta es hay alguna forma de especificar un mínimo-máximo nivel de zoom en un MKMapView :)

Gracias

134voto

Kelvin Puntos 1576

Primero de todo, MKMapView no uso/tiene un conjunto predefinido de niveles de zoom, como Google Maps.

En su lugar, el área visible de una MKMapView se describe el uso de MKCoordinateRegion, que se compone de dos valores:

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

El punto central debería ser obvio (que es el punto central de la región).

Sin embargo, span (que es un MKCoordinateSpan) se compone de:

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

Un breve ejemplo. He aquí un juguete MKCoordinateRegion:

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

La región podría ser descrita utilizando su min y max las coordenadas de la siguiente manera:

  1. min de coordenadas (inferior izquierda del punto):
    • latitud: -4
    • longitud: -3
  2. max coordenadas (esquina superior derecha de punto):
    • latitud: 4
    • longitud: 3

Así, usted puede especificar los niveles de zoom en torno a un punto central utilizando un tamaño apropiado MKCoordinateSpan. Como una aproximación de Google numérico niveles de zoom, se puede revertir la ingeniería del lapso de tamaños que Google utiliza para un determinado nivel de zoom y crear un espacio, en consecuencia. (Google describe su punto de vista, las regiones de la misma manera que MKMapView, como un centro + de intervalo, entonces usted puede tirar de estos valores fuera de los Mapas de Google.)

Como para restringir a la región, usted puede jugar con este método delegado:

mapView:regionWillChangeAnimated

por ejemplo, cambiar el tamaño de la región de vuelta a su permitió que los niveles de zoom. (Una especie de cómo las vistas de tabla le permitirá desplazarse más allá del borde, pero luego de goma de la banda de nuevo en su lugar.) Sin embargo, su millaje puede variar, ya que no he utilizado para este propósito.

por cierto, no son definitivos correcciones/mejoras en el OS 3.1 para los aspectos de MapKit que se me está dando problemas en la 3.0.

118voto

Troy Brant Puntos 2181

Si prefiere usar los niveles de zoom explícitos en lugar de definir un MKCoordinateSpan, escribí una categoría que añade soporte para especificar el nivel de zoom de una MKMapView. El código se puede encontrar aquí:

http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/

5voto

Chase Johnson Puntos 562

El span es en grados de latitud y longitud. Hay un método para la construcción de MKCoordinateRegion estructuras que se lleva a distancia, en su lugar. Puede ser que usted está usando MKCoordinateRegionMakeWithDistance para especificar el intervalo y, a continuación, al comprobar que en regionDidChange, que se está viendo en la lat/long span, que es la forma en que se almacena en un MKCoordinateRegion struct.

Hasta donde yo sé, el entero de los niveles de zoom no está disponible o útil cuando se trabaja con MKMapKit. Yo personalmente prefiero usar el lapso de las figuras, su más flexible.

Usted puede especificar max y min de zoom, y no sé de una manera de hackear. MKMapKit en realidad es bastante débil de momento, estoy bastante decepcionado por la falta de características.

3voto

Ari Braginsky Puntos 525

Una rápida comparación de los niveles de zoom para una ubicación mediante maps.google.com mediante la inspección de la cadena de consulta enlace muestra que el dx y valores de referencia dy 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
  ...
 

2voto

Daniel Puntos 8

Categoría de Brant en MKMapView funciona bien. Sin embargo, parece que no ha sido actualizado para soportar los nuevos dispositivos con pantallas de retina en el cálculo 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);
 

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X