Determinazione della distanza utilizzando MapKit

voti
5

Come è un 1000 piedi o 1/2 miglio di distanza determinate con MapKit? Sia un raggio di qualche perno o la distanza tra due perni.

Ad esempio, centrare la mappa su perno A. perni B, C, e D sono anche sulla carta a varie distanze dal perno A. B e C sono entro 1/2 miglio da A ma D è 1 miglio di distanza. Mi piacerebbe sapere che B e C sono entro 1/2 miglio da A. Come posso calcolare che?

È pubblicato 10/03/2010 alle 02:57
fonte dall'utente
In altre lingue...                            


3 risposte

voti
13

Dal momento che hai affermato che i due punti diversi sono "pin", ho intenzione di assumere che si sta utilizzando MKPinAnnotationView (o qualche altro vista annotazione). In caso contrario, si sta andando ad avere per ottenere la posizione in qualche altro modo.

Se si dispone di puntatori agli oggetti di annotazione per queste località, allora si può facilmente chiamare -coordinatesu di loro, creare CLLocations da queste coordinate (usando -initWithLatitude:longitude:), e quindi utilizzare il metodo -getDistanceFromper recuperare la distanza in metri. Da lì, è una conversione facile da miglia. In tutto, il codice sarebbe simile a questa:

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

Vi ritroverete con la distanza in miglia, e possibile confrontare da lì. Spero che questo ti aiuti.

Risposto il 10/03/2010 a 08:31
fonte dall'utente

voti
12

getDistanceFrom è ora deprecato quindi ecco una risposta alternativa per chi cerca di fare questo.

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

Come sopra, è possibile utilizzare floatal posto di doublee si potrebbe lanciare i risultati ad un int se non si richiede la precisione del floatmodo:

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

Il intè a portata di mano se si voleva dare una vaga idea della distanza nel annotazioni in questo modo:

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

Il sottotitolo dell'annotazione leggerebbe "Distanza: 50m", per esempio.

Risposto il 22/02/2011 a 02:37
fonte dall'utente

voti
0

Si tratta di Swift 3 equivalente della risposta data:

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)
Risposto il 10/11/2016 a 22:21
fonte dall'utente

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