2010-03-10 8 views
5

Wie wird eine Entfernung von 1000 Fuß oder 1/2 Meile mit Mapkit ermittelt? Entweder ein Radius von einem Pin oder der Abstand zwischen zwei Pins.Ermitteln der Entfernung mit Mapkit

Zum Beispiel zentriere ich die Karte auf Pin A. Pins B, C und D sind auch auf der Karte in verschiedenen Abständen von Pin A. B und C sind innerhalb von 1/2 Meile von A, aber D ist 1 Meile Weg. Ich würde gerne wissen, dass B und C innerhalb von 1/2 Meile von A sind. Wie kann ich das berechnen?

+0

können Sie Ihre Frage mehr erklären, so können wir die genaue Anforderung verstehen? –

+0

Ich habe die Frage bearbeiten. Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. – user230949

Antwort

13

Da Sie angegeben haben, dass die zwei verschiedenen Punkte "Pins" sind, gehe ich davon aus, dass Sie MKPinAnnotationView (oder eine andere Anmerkungsansicht) verwenden. Wenn nicht, musst du den Ort auf eine andere Weise bekommen.

Wenn Sie Zeiger auf die Beschriftungsobjekte für diese Orte haben, dann können Sie leicht -coordinate auf sie nennen, schaffen CLLocations aus diesen Koordinaten (mit -initWithLatitude:longitude:) und dann die Methode -getDistanceFrom die Entfernung in Metern abzurufen. Von dort ist es eine einfache Umwandlung in Meilen. Alles in allem würde der Code wie folgt aussehen:

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); 

Sie werden mit der Entfernung in Meilen am Ende, und von dort vergleichen. Hoffe das hilft.

+0

ok, aber auf diese Weise bekommen wir gerade Distanz zwischen diesen beiden Punkten ... nicht wirklich wie man diese tatsächliche Entfernung findet .... – AJPatel

12

getDistanceFrom ist jetzt veraltet, also hier ist eine alternative Antwort für alle, die dies tun möchten.

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]; 

Wie oben erwähnt, könnten Sie float statt double verwenden und die Ergebnisse in einen int werfen könnte, wenn Sie also nicht die Präzision der float wie erfordern:

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

Die int ist praktisch, wenn Sie eine grobe Vorstellung von der Entfernung in der Anmerkung wie folgt geben wollten:

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

Der Untertitel von t Die Annotation würde beispielsweise "Entfernung: 50m" lauten.

0

Dies ist Swift 3 Äquivalent der gegebenen Antwort:

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)