MKMapView Zoom et de la région

voix
83

Je suis familier avec l'utilisation Google Maps API Javascript. Récemment, je commencé à utiliser le cadre de MapKit pour un projet d'iphone, mais je vais avoir du mal à comprendre le zoom et la mise en une région sur la carte.

Dans l'API Google Maps, je l'habitude d'utiliser les niveaux de zoom entiers comme 8, 9, 10 avec fonction directe setZoom (). La seule méthode équivalente que je peux voir dans le cadre de MapKit est setRegion: animée. Si je comprends bien, je dois définir une latitude et la longitude de la portée de la région des valeurs « delta » pour spécifier le niveau de zoom. Mais je n'ai pas vraiment une idée de ce que représentent ces valeurs (je l'ai lu la documentation).

Lorsque j'utilise un délégué MKMapView et trace les valeurs de portée dans les résultats de la méthode des délégués regionDidChange ne semblent pas en corrélation les uns des autres. Il est ok quand je effectuer un zoom arrière et voir les valeurs de delta durée augmentent comme indiqué dans la documentation. Mais tout à coup, je fais glisser la carte sans zoom et valeurs delta jusqu'à 0,0.

Quelqu'un peut-il expliquer s'il vous plaît quel est le point de référence à ces portée et delta? Ou est-il un algorithme pour convertir un niveau de zoom entier (comme 9) à ces valeurs delta?

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

Merci

Créé 22/07/2009 à 17:16
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
133

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

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

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

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

Toutefois, la durée (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 MKCoordinateRegion de jouet:

  1. centre:
    • latitude: 0
    • longitude: 0
  2. envergure:
    • latitudeDelta: 8
    • longitudeDelta: 6

La région peut être décrite en utilisant son min et max coordonnées de la manière suivante:

  1. min coordonnées (point inférieur gauche):
    • latitude: -4
    • longitude: -3
  2. coordonnée max (supérieure au point de droite):
    • latitude: 4
    • longitude: 3

Ainsi, vous pouvez spécifier les niveaux de zoom autour d'un point central en utilisant un MKCoordinateSpan de taille appropriée. En guise d'approximation des niveaux de zoom numérique de Google, vous pouvez l'ingénierie inverse des tailles de portée que Google utilise pour un niveau de zoom donné et créer une période, en conséquence. (Google décrit leurs régions vue de la même manière que MKMapView fait, en tant que centre + durée, afin que vous puissiez tirer ces valeurs sur 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 par le redimensionnement de retour de la région dans vos niveaux de zoom autorisés. (Un peu comme la façon dont les vues de table vous permettra de faire défiler devant le bord, mais ensuite la bande en 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 à des aspects de MapKit qui me donnaient du mal dans la version 3.0.

Créé 22/07/2009 à 20:36
source utilisateur

voix
117

Si vous préférez utiliser les niveaux de zoom explicites au lieu de définir un MKCoordinateSpan, je l' 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 .

Créé 23/01/2010 à 03:49
source utilisateur

voix
4

La durée est exprimée en degrés de latitude et de longitude. Il existe une méthode pour la construction struct MKCoordinateRegion qui prend la distance, au lieu. Il se peut que vous utilisez MKCoordinateRegionMakeWithDistance pour spécifier la durée, et puis quand vous vérifiez dans regionDidChange, vous voyez à la portée lat / long, ce qui est de savoir comment il est stocké dans une struct MKCoordinateRegion.

Pour autant que je sache, les niveaux de zoom entier ne sont pas disponibles ou tout utile lorsque vous travaillez avec MKMapKit. Personnellement, je préfère l'aide des données portées, son plus souple.

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

Créé 22/07/2009 à 19:09
source utilisateur

voix
3

Une rapide comparaison des niveaux de zoom pour un emplacement à l'aide maps.google.com en inspectant la chaîne de requête de lien montre que les valeurs de portée dx et dy augmentation par un facteur 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
  ...
Créé 11/12/2009 à 01:30
source utilisateur

voix
2

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

Il peut être fixé 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);
Créé 19/06/2014 à 16:43
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more