Określanie odległości za pomocą mapkit

głosy
5

Jak to 1000ft lub 1/2 odległość mile określano mapkit? Albo od pewnego promienia kołka lub odległość między dwoma kołkami.

Na przykład, centrum mapy na kołek A. Pins, B, C, i D, są również na mapie w różnych odległościach od sworznia A. B i C w ciągu 1/2 mili od punktu A, lecz D 1 mile. Chciałbym wiedzieć, że B i C są w 1/2 mili od A. W jaki sposób można obliczyć, że?

Utwórz 10/03/2010 o 02:57
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
13

Skoro już stwierdzono, że dwa różne punkty są „szpilki”, mam zamiar założyć używasz MKPinAnnotationView (lub jakiś inny widok adnotacji). Jeśli nie, będziesz musiał uzyskać lokalizację w jakiś inny sposób.

Jeśli masz wskaźniki do obiektów adnotacji dla tych miejsc, można łatwo wywołać -coordinatena nich tworzyć CLLocations od tych współrzędnych (korzystających -initWithLatitude:longitude:), a następnie użyć metody -getDistanceFromdo pobierania odległość w metrach. Stamtąd jest to łatwy do konwersji mil. W sumie, to kod będzie wyglądał tak:

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

Skończysz z odległości w milach i można porównać go stamtąd. Mam nadzieję że to pomoże.

Odpowiedział 10/03/2010 o 08:31
źródło użytkownik

głosy
12

getDistanceFrom jest teraz przestarzała tak oto alternatywa odpowiedź dla każdego, kto chce to zrobić.

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

Jak wyżej, można użyć floatzamiast doublei można rzucić wyniki do int, jeśli nie wymagają precyzji float, tak jak:

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

intJest przydatny, gdy chciał dać z grubsza w odległości adnotacji tak:

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

Podtytuł adnotacją będzie czytać „odległości: 50m” na przykład.

Odpowiedział 22/02/2011 o 02:37
źródło użytkownik

głosy
0

To Swift 3 odpowiednikiem danej odpowiedzi:

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)
Odpowiedział 10/11/2016 o 22:21
źródło użytkownik

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