85 votes

MKMapView Zoom et région

Je suis familier avec l'aide de Google Maps Javascript API. Récemment, j'ai commencé à utiliser MapKit cadre d'un iphone de projet, mais je vais avoir un moment difficile de comprendre le zoom et la définition d'une région sur la carte.

Dans l'API Google Maps j'ai l'habitude d'utiliser un entier niveaux de zoom comme 8, 9, 10 avec simple fonction setZoom(). La seule méthode équivalente je peux voir dans le framework MapKit est setRegion:animation. Comme je le comprends, j'ai besoin de définir une région de la durée de latitude et de longitude "delta" des valeurs pour définir le niveau de zoom. Mais je n'ai pas vraiment une idée de ce que ces valeurs représentent(j'ai lu la documentation).

Lorsque j'utilise un MKMapView délégué et trace la durée de valeurs dans regionDidChange délégué résultats de la méthode ne semble pas en corrélation les uns des autres. C'est ok quand je zoom arrière et de voir la durée de valeurs delta sont en augmentation, comme spécifié dans la documentation. Mais tout à coup, je fais glisser la carte sans le zoom et le delta valeurs deviennent 0.0.

Quelqu'un peut-il expliquer ce qu'est le point de référence pour ces envergure et le delta? Ou est-il un algorithme pour convertir un entier de niveau de zoom(9) à ces valeurs delta?

Comme un bonus question est-il possible de spécifier un minimum maximum niveau de zoom sur un MKMapView :)

Merci

134voto

Kelvin Points 1576

Tout d'abord, MKMapView ne pas utiliser/avoir un ensemble prédéfini de niveaux de zoom comme Google Maps.

Au lieu de cela, la zone visible d'un MKMapView est décrite à l'aide MKCoordinateRegion, qui se compose de deux valeurs:

  1. centre (le point central de la région), et
  2. durée (de la taille de la zone visible autour du centre).

Le centre devrait être évident (c'est le point central de la région.)

Cependant, span (qui est un MKCoordinateSpan) se compose de:

  1. latitudeDelta (la distance verticale représentée par la région), et
  2. longitudeDelta (la distance horizontale représentée par la région).

Un bref exemple. Voici un jouet MKCoordinateRegion:

  1. centre:
    • latitude: 0
    • longitude: 0
  2. durée:
    • latitudeDelta: 8
    • longitudeDelta: 6

La région pourrait être décrite à l'aide de son min et max coordonnées comme suit:

  1. min de coordonnées (en bas à gauche-point de la main):
    • latitude: -4
    • longitude: -3
  2. max de coordonnées (en haut à droite-point de la main):
    • latitude: 4
    • longitude: 3

Ainsi, vous pouvez spécifier les niveaux de zoom autour d'un point central à l'aide d'une taille appropriée MKCoordinateSpan. Comme une approximation de Google numérique niveaux de zoom, vous pouvez inverser la durée de tailles que Google utilise pour un niveau de zoom et de créer une plage, en conséquence. (Google explique leur point de vue, les régions de la même manière que MKMapView n', en tant que centre + durée, de sorte que vous pouvez tirer de ces valeurs de Google Maps.)

Comme pour la restriction de la région, vous pouvez jouer avec cette méthode du délégué:

mapView:regionWillChangeAnimated

par exemple, par le redimensionnement de la région dans votre permis à des niveaux de zoom. (Un peu comme la façon dont des vues de table vous permettra de faire défiler au-delà du bord, mais alors bande de caoutchouc en place.) Cependant, votre kilométrage peut varier, car je ne l'ai pas utilisé à cette fin.

btw, il y a des corrections/améliorations dans l'OS 3.1 aspects de MapKit qui me donnaient mal à la 3.0.

118voto

Troy Brant Points 2181

Si vous préférez utiliser les niveaux de zoom explicite au lieu de définir un MKCoordinateSpan, j’ai écrit une catégorie qui ajoute le support pour spécifier les niveaux de zoom d’un MKMapView. Le code peut être trouvé ici :

http://troybrant.net/blog/2010/01/Set-the-zoom-Level-of-an-MKMapView/

4voto

Chase Johnson Points 562

La durée est en degrés de latitude et de longitude. Il existe une méthode pour la construction de MKCoordinateRegion les structures qui prend de la distance, à la place. Il se peut que vous utilisez MKCoordinateRegionMakeWithDistance pour spécifier la durée, et puis quand vous le vérifier dans regionDidChange, vous voyez à la lat/long de cette période, qui est de savoir comment il est stocké dans un MKCoordinateRegion struct.

Autant que je sache, l'entier niveaux de zoom ne sont pas disponibles ou utile lors de l'utilisation de MKMapKit. Personnellement, je préfère le à l'aide de la durée de chiffres, ses plus souple.

Vous ne pouvez pas spécifier max et min de zoom, et je ne sais pas d'un moyen de pirater dans. MKMapKit est en fait assez faible pour l'instant, je suis assez déçu par le manque de fonctionnalités.

3voto

Ari Braginsky Points 525

Une comparaison rapide des niveaux de zoom pour un emplacement à l’aide de maps.google.com en inspectant la querystring lien montre que la dx et dy couvrent les valeurs augmentation par un facteur de 2 :

2voto

Daniel Points 8

Catégorie de Brant sur MKMapView fonctionne bien. Toutefois, il semble qu’il n’a pas été actualisé pour prendre en charge de nouveaux appareils avec des écrans de la rétine lors du calcul des mapSizeInPixels.

Il peut être corrigé par le remplacement de cette ligne :

Avec cette ligne :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X