MKCoordinateRegionMakeWithDistance ne définit pas la bonne région sur la MapView
J'ai ce code :
- (void)viewDidLoad
{
[super viewDidLoad];
CLLocationCoordinate2D userLocation = CLLocationCoordinate2DMake(48.9793946200, 2.4726272850);
CLLocationDistance dist1 = 636.9887048804;
CLLocationDistance dist2 = 900.8380655203;
CLLocationDistance dist = dist1;
[self.myMapView setRegion:MKCoordinateRegionMakeWithDistance(userLocation, dist, dist) animated:YES];
//TEST
//------------------------------------------------------------
MKCoordinateRegion region = self.myMapView.region;
CLLocationDegrees lat = region.center.latitude;
CLLocationDegrees lon = region.center.longitude - region.span.longitudeDelta/2;
CLLocation *west = [[[CLLocation alloc] initWithLatitude:lat longitude:lon] autorelease];
NSLog(@"User location: lat : %.10lf long : %.10lf", userLocation.latitude, userLocation.longitude);
NSLog(@"distance set: %.10lfm", dist);
NSLog(@"center: lat : %.8lf long : %.8lf", region.center.latitude, region.center.longitude);
CLLocation* centerRegion = [[[CLLocation alloc] initWithLatitude:region.center.latitude longitude:region.center.longitude] autorelease];
NSLog(@"distance to western boundary: %.2lfm", [centerRegion distanceFromLocation:west]);
lat = region.center.latitude - region.span.latitudeDelta/2 ;
lon = region.center.longitude;
CLLocation *north = [[[CLLocation alloc] initWithLatitude:lat longitude:lon] autorelease];
NSLog(@"distance to western boundary: %.2lfm", [centerRegion distanceFromLocation:north]);
//------------------------------------------------------------
}
Lorsque le paramètre dist = dist1, ce qui donne :
User location: lat : 48.9793946200 long : 2.4726272850
distance set: 636.9887048804m
center: lat : 48.97937199 long : 2.47269630
distance to western boundary: 500.44m
distance to western boundary: 650.57m
Lorsque le paramètre dist = dist2, ce qui donne :
User location: lat : 48.9793946200 long : 2.4726272850
distance set: 900.8380655203m
center: lat : 48.97937199 long : 2.47269630
distance to western boundary: 500.44m
distance to western boundary: 650.57m
Quel est le problème ici ? Pourquoi dois-je avoir le même affichage avec 2 différentes distances ?
Dernière question : Comment puis-je être sûr pour afficher le voulait mètres sur la carte, à tout le moins à l'horizontale et à la verticale visuelle (avec ou sans animation, bien entendu) ?
Comment êtes-vous en paramètre les coordonnées de la région?
ok, me voir edit 🙂
ok, me voir edit 🙂
OriginalL'auteur Oliver | 2011-09-04
Vous devez vous connecter pour publier un commentaire.
Si je comprends bien, vous voulez dire à la mapView "donnez-moi une carte qui est 636m à travers" ou "donnez-moi une carte qui est à 900m de l'autre côté". Mais la carte vous donne la même distance pour les deux de ces.
Lorsque vous définissez une zone de la carte, vous n'avez généralement pas obtenir exactement ce que vous demandez, mais plutôt un meilleur ajustement. La vue de la carte ressemble à la région que vous avez demandé, puis crée une région qui correspond à votre région de l'intérieur. Le problème est que l'affichage de la carte n'a pas de zoom exactement à votre demande de la région, on retrouve le plus haut niveau de zoom qui permet à tous de votre région pour être visible. Il n'est pas utilisé entre le niveau de zoom. C'est pourquoi, lorsque vous utilisez
setRegion:
la carte toujours une apparence impeccable. Vous pouvez régler manuellement entre le niveau de zoom par pincement dans ou à l'extérieur, mais pas (autant que je sache) par programmation.Noter aussi que l'affichage de la carte peut changer le réel
region
variable que vous transmettez. Voici les docs:Vous pouvez voir la différence dans les régions par l'exploitation forestière de la région de la donner, et celui de la carte définit en fait (bien que je n'ai pas vu le passé
myRegion
changement):Si vous vous cognez votre distance jusqu'à 1200m d'altitude, vous serez en mesure de voir le prochain niveau de zoom.
BTW, il y a une petite erreur dans votre code:
devrait être
La méthode habituelle est de parcourir vos annotations, trouver le maximum et le minimum de latitude et de longitude, puis faire une région. Voici une réponse qui a le code: stackoverflow.com/questions/1336370/...
Oui, ok, c'est évident, mais au sujet de votre réponse, qui ne va pas changer quoi que ce soit ayant un ou plusieurs annotations. À la fin, vous voulez le plus de distance pour être affiché sur la carte, alors comment puis-je assurer que cette distance sera affichée ? J'ai essayé d'appeler regionThatFits avec un carré à l'aide de la distance, puis donner le résultat pour la région, mais le résultat est le même que de donner directement le carré de la région. La partie la plus éloignée d'annotation n'est pas affiché (ici, c'est à 450 mètres du centre).
J'ai connu ce problème avant avec réglage d'une région. Aussi loin que je me souvienne, il a commencé en iOS 4. Ils ont probablement changé quelque chose. Je n'ai jamais trouvé un moyen de le faire fonctionner correctement, donc j'ai juste multiplié toute la latitude et la longitude deltas par un nombre fixe. Quelque chose comme 2 travaillé, je pense. Dans le code pour le lien ci-dessus, ils sont à l'aide de 1,1 pour donner un peu d'espace autour du bord. Si vous recherchez de mes réponses précédentes, vous trouverez probablement le nombre que j'utilise.
OriginalL'auteur nevan king
Une cause possible de ce que la région vous sont spécifiant a carrés aspect ratio, alors que votre
MKMapView
probablement a une forme rectangulaire.Lorsque vous définissez la région
MKMapView
de ne pas l'utiliser exactement comme elle est, mais de le modifier afin de:Ainsi, si votre point de vue a une largeur:hauteur aspect ratio de 2:1, alors l'occident/orient limites serait à 200 m du centre alors que les nord/sud des limites à 100m du centre.
De tenter quelque chose après la définition de la région comme ci-dessus:
L'un de ceux-ci devraient être de 100 mètres. Si non, je serais intéressé de voir ce qu'ils sont.
P. S. Le code ci-dessus n'a pas été testé dans de toute façon.
Ce qui signifie %.2lf ?
%.2lf moyen de l'impression d'un double avec 2 décimales de précision.
ce n'était pas le but de %.2f sans l ? Mais je vais changer de sujet. Vous avez vu mon edit ?
avec le l c'est juste un flotteur, au lieu d'un long float, aka double 🙂
OriginalL'auteur freespace