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

голоса
5

Каким образом 1000ft или 1/2 мили расстояние определяется с MapKit? Либо радиус от некоторого штифта или расстояние между двумя штифтами.

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

Задан 10/03/2010 в 02:57
источник пользователем
На других языках...                            


3 ответов

голоса
13

Так как вы заявили, что две различные точки «контакты», я буду считать, что вы используете 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);

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

Ответил 10/03/2010 в 08:31
источник пользователем

голоса
12

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и вы могли бы привести результаты к междунар если вы не требуют точности floatтак:

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

intОчень удобно , если вы хотите , чтобы дать общее представление о расстоянии в аннотации , как так:

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

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

Ответил 22/02/2011 в 02:37
источник пользователем

голоса
0

Это 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)
Ответил 10/11/2016 в 22:21
источник пользователем

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