La détermination de la distance à l'aide MapKit

voix
5

Comment un ou 1000ft 1/2 mile de distance déterminée avec MapKit? Soit un rayon de quelques broche ou la distance entre deux repères.

Par exemple, je centrer la carte sur la broche A. Pins B, C et D sont également sur la carte à différentes distances de broches A, B et C sont à 1/2 mile de A, mais D est de 1 mile away. Je voudrais savoir que B et C sont à 1/2 mile de A. Comment puis-je calculer cela?

Créé 10/03/2010 à 02:57
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
13

Puisque vous avez dit que les deux points sont des « broches », je vais supposer que vous utilisez MKPinAnnotationView (ou une autre vue d'annotation). Sinon, vous allez devoir obtenir l'emplacement d'une autre façon.

Si vous avez des pointeurs vers les objets d'annotation pour ces endroits, vous pouvez facilement appeler -coordinatesur eux, créer CLLocations à partir de ces coordonnées ( en utilisant -initWithLatitude:longitude:), puis utilisez la méthode -getDistanceFrompour récupérer la distance en mètres. De là, il est une conversion facile en miles. Au total, le code ressemblerait à quelque chose comme ceci:

CLLocationCoordinate2D pointACoordinate = [pointAAnnotation coordinate];
CLLocation *pointALocation = [[CLLocation alloc] initWithLatitude:pointACoordinate.latitude longitude:pointACoordinate.longitude];
CLLocationCoordinate2D pointBCoordinate = [pointBAnnotation coordinate];
CLLocation *pointBLocation = [[CLLocation alloc] initWithLatitude:pointBCoordinate.latitude longitude:pointBCoordinate.longitude];
double distanceMeters = [pointALocation getDistanceFrom:pointBLocation];
double distanceMiles = (distanceMeters / 1609.344);

Vous vous retrouverez avec la distance en miles, et peut le comparer à partir de là. J'espère que cela t'aides.

Créé 10/03/2010 à 08:31
source utilisateur

voix
12

getDistanceFrom est maintenant dépréciée voici donc une réponse alternative pour ceux qui cherchent à le faire.

CLLocationCoordinate2D pointACoordinate = [pointAAnnotation coordinate];
CLLocation *pointALocation = [[CLLocation alloc] initWithLatitude:pointACoordinate.latitude longitude:pointACoordinate.longitude];  

CLLocationCoordinate2D pointBCoordinate = [pointBAnnotation coordinate];
CLLocation *pointBLocation = [[CLLocation alloc] initWithLatitude:pointBCoordinate.latitude longitude:pointBCoordinate.longitude];  

float distanceMeters = [pointALocation distanceFromLocation:pointBLocation];
float distanceMiles = (distanceMeters / 1609.344);  

[pointALocation release];
[pointBLocation release];  

Comme ci - dessus, vous pouvez utiliser au floatlieu de doubleet vous pourriez lancer les résultats à un int si vous ne souhaitez pas la précision de la floatfaçon:

int distanceCastToInt = (int) [pointALocation distanceFromLocation:pointBLocation];

Le intest à portée de main si vous voulez donner une idée approximative de la distance dans l'annotation comme ceci:

pointAAnnotation.title = @"Point A";
pointAAnnotation.subtitle = [NSString stringWithFormat: @"Distance: %im",distanceCastToInt];

Le sous-titre de l'annotation lirait « Distance: 50m » par exemple.

Créé 22/02/2011 à 02:37
source utilisateur

voix
0

Ceci est Swift 3 équivalent de la réponse donnée:

let pointACoordinate = pointAAnnotation.coordinate
let pointALocation = CLLocation(latitude: pointACoordinate.latitude, longitude: pointACoordinate.longitude)
let pointBCoordinate = pointBAnnotation.coordinate
let pointBLocation = CLLocation(latitude: pointBCoordinate.latitude, longitude: pointBCoordinate.longitude)
let distanceMeters = pointALocation.distance(from: pointBLocation)
let distanceMiles = (distanceMeters / 1609.344)
Créé 10/11/2016 à 22:21
source utilisateur

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