Определение расстояния с помощью mapkit

Как определяется расстояние 1000 футов или 1/2 мили с помощью mapkit? Либо радиус от какого-то штифта, либо расстояние между двумя штифтами.

Например, я центрирую карту на штыре A. Штыри B, C и D также находятся на карте на разном расстоянии от штифта A. B и C находятся в пределах 1/2 мили от A, а D - в 1 миле. Я хотел бы знать, что B и C находятся в пределах 1/2 мили от A. Как я могу это вычислить?


person user230949    schedule 10.03.2010    source источник
comment
не могли бы вы подробнее объяснить свой вопрос, чтобы мы могли понять точное требование?   -  person Madhup Singh Yadav    schedule 10.03.2010
comment
Я редактировал вопрос. Дайте мне знать, если вам понадобится дополнительная информация.   -  person user230949    schedule 10.03.2010


Ответы (3)


Поскольку вы заявили, что две разные точки являются «контактами», я предполагаю, что вы используете MKPinAnnotationView (или какое-либо другое представление аннотации). В противном случае вам придется найти местоположение каким-либо другим способом.

Если у вас есть указатели на объекты аннотации для этих местоположений, вы можете легко вызвать для них -coordinate, создать CLLocations из этих координат (используя -initWithLatitude:longitude:), а затем использовать метод -getDistanceFrom для получения расстояния в метрах. Отсюда легко конвертировать в мили. В целом код будет выглядеть примерно так:

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

Вы получите расстояние в милях и сможете сравнить его оттуда. Надеюсь это поможет.

person Arclite    schedule 10.03.2010
comment
хорошо, но таким образом мы получаем прямое расстояние между этими двумя точками ... не фактическое, как найти это фактическое расстояние .... - person AJPatel; 15.04.2011

getDistanceFrom теперь устарел, поэтому вот альтернативный ответ для всех, кто хочет это сделать.

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

Как и выше, вы можете использовать float вместо double, и вы можете преобразовать результаты в int, если вам не требуется точность float, например:

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

int удобен, если вы хотите дать приблизительное представление о расстоянии в аннотации, например:

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

Подзаголовок аннотации, например, будет читать «Расстояние: 50 м».

person conorgriffin    schedule 22.02.2011

Это Swift 3 эквивалент данного ответа:

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)
person Brian Ho    schedule 10.11.2016