MKMapView Zoom et région

Je suis familier avec L'utilisation de L'API Javascript Google Maps. Récemment, j'ai commencé à utiliser MapKit framework pour un projet iphone, mais j'ai du mal à comprendre le zoom et la définition d'une région sur la carte.

Dans L'API Google Maps, j'utilisais des niveaux de zoom entiers comme 8, 9, 10 avec la fonction simple setZoom (). La seule méthode équivalente que je peux voir dans le framework MapKit est setRegion: animated. Si je comprends bien, je dois définir la latitude et la longitude d'une région " delta" valeurs pour spécifier le niveau de zoom. Mais je n'ai vraiment aucune idée de ce que représentent ces valeurs (j'ai lu la documentation).

Lorsque j'utilise un délégué MKMapView et que je trace les valeurs de span dans regionDidChange, les résultats de la méthode delegate ne semblent pas se corréler. C'est ok quand je fais un zoom arrière et que je vois que les valeurs du delta de l'étendue augmentent comme spécifié dans la documentation. Mais soudain, je fais glisser la carte sans zoomer et les valeurs delta deviennent 0.0.

Quelqu'un Peut-il expliquer ce qu'est la point de référence à ces span et delta? Ou Existe-t-il un algorithme pour convertir un niveau de zoom entier(comme 9) en ces valeurs delta?

En tant que question bonus, existe-t-il un moyen de spécifier un niveau de zoom minimum-maximum sur un MKMapView:)

Merci

83
demandé sur bvd 2009-07-22 20:16:58

5 réponses

Tout d'abord, MKMapView n'utilise pas/n'a pas un ensemble prédéfini de niveaux de zoom comme le fait Google Maps.

Au lieu de cela, la zone visible D'un MKMapView est décrite en utilisant MKCoordinateRegion , qui se compose de deux valeurs:

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

Le point central devrait être évident (c'est le point central du 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. span:
    • latitudeDelta: 8
    • longitudeDelta: 6

La région peut être décrite en utilisant ses coordonnées min et max comme suit:

  1. coordonnée min (point inférieur gauche):
    • latitude: -4
    • longitude: -3
  2. coordonnée maximale (point supérieur droit):
    • latitude: 4
    • longitude: 3

Ainsi, vous pouvez spécifier des niveaux de zoom autour d'un point central en utilisant une taille appropriée MKCoordinateSpan. Comme une approximation des niveaux de zoom numérique de Google, vous pouvez désosser les tailles d'envergure que Google utilise pour un niveau de zoom donné et créer une envergure, en conséquence. (Google décrit leurs régions de vue de la même manière que MKMapView, en tant que centre + span, de sorte que vous pouvez extraire ces valeurs de Google Maps.)

En ce qui concerne la restriction de la région, vous pouvez jouer avec cette méthode déléguée:

mapView:regionWillChangeAnimated

Par exemple en redimensionnant la région dans vos niveaux de zoom autorisés. (Un peu comme la façon dont les vues de table vous permettront de faire défiler le bord, mais ensuite la bande de caoutchouc en place.) Cependant, votre kilométrage peut varier, puisque je ne l'ai pas utilisé à cette fin.

Btw, il y a des corrections/améliorations définies dans OS 3.1 aux aspects de MapKit qui me causaient des problèmes dans 3.0.

133
répondu Kelvin 2009-07-22 19:36:50

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

117
répondu Troy Brant 2016-07-01 14:40:08

La portée est en degrés de latitude et de longitude. Il existe une méthode pour construire des structures MKCoordinateRegion qui prend de la distance, à la place. Il se peut que vous utilisiez MKCoordinateRegionMakeWithDistance pour spécifier le span, puis lorsque vous le vérifiez dans regionDidChange, vous voyez au Lat / Long span, qui est la façon dont il est stocké dans une structure MKCoordinateRegion.

Pour autant que je sache, les niveaux de zoom entiers ne sont pas disponibles ou utiles du tout lorsque vous travaillez avec MKMapKit. Je personnellement préfèrent utiliser les chiffres d'envergure, c'est plus flexible.

Vous ne pouvez pas spécifier le zoom max et min, et je ne connais pas de moyen de le pirater. MKMapKit est en fait assez faible en ce moment, je suis assez déçu par le manque de fonctionnalités.

4
répondu Chase Johnson 2009-07-22 18:09:46

Une comparaison rapide des niveaux de zoom pour un emplacement utilisant maps.google.com en inspectant le lien querystring montre que les valeurs DX et dy span augmentent d'un facteur 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
  ...
3
répondu Ari Braginsky 2009-12-11 00:30:37

La catégorie de Brant sur MKMapView fonctionne bien. Cependant, il semble qu'il n'a pas été mis à jour pour prendre en charge les nouveaux appareils avec des écrans retina lors du calcul de mapSizeInPixels.

Il peut être corrigé en remplaçant cette ligne:

CGSize mapSizeInPixels = mapView.bounds.size;

Avec cette ligne:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
2
répondu Daniel 2014-06-19 15:43:55