Определение расстояния с помощью mapkit - PullRequest
5 голосов
/ 10 марта 2010

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

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

Ответы [ 3 ]

13 голосов
/ 10 марта 2010

Поскольку вы заявили, что две разные точки являются "контактами", я предполагаю, что вы используете 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);

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

12 голосов
/ 22 февраля 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 м».

0 голосов
/ 11 ноября 2016

Это 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...