Подтвердить что ты не робот

Как рассчитать расстояние между двумя точками широты и долготы?

У меня есть широта и долгота определенного места, и я хочу рассчитать расстояние, так как я могу вычислить его?

4b9b3361

Ответ 1

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:lat2 longitude:long2];
NSLog(@"Distance i meters: %f", [location1 distanceFromLocation:location2]);
[location1 release];
[location2 release];

Вам также нужно добавить CoreLocation.framework в свой проект и добавить оператор импорта:

#import <CoreLocation/CoreLocation.h>

Ответ 2

Это может быть не самый эффективный способ его выполнения, но он будет работать.

Ваши два местоположения, заданные широтой и долготой, можно рассматривать как векторы. Предполагая, что координаты были преобразованы в картографические координаты, вычислим точечное произведение двух векторов.

Учитывая v1 = (x1, y1, z1) и v2 = (x2, y2, z2), то...

v1 dot v2 = magnitude(v1) * magnitude(v2) * cos (theta)

Удобно, что величины v1 и v2 будут одинаковыми... радиус земли (R).

x1*x2 + y1*y2 + z1*z2 = R*R*cos(theta)

Решите для theta.

theta = acos ((x1*x2 + y1*y2 + z1*z2) / (R * R));

Теперь у вас есть угол между двумя векторами в радианах. Расстояние между двумя точками при движении по поверхности земли, таким образом,...

distance = theta * R.

Существует, вероятно, более простой способ сделать это целиком в контексте сферических координат, но моя математика в этой области слишком нечеткая - следовательно, преобразование в декартовы координаты.

Преобразование в декартовы координаты...

Пусть альфа - широта, а бета - долгота.

x = R * cos (alpha) * cos (beta)
y = R * sin (alpha)
z = R * cos (alpha) * sin (beta)

Не забывайте, что математическая функция обычно имеет дело с радианами, а отношение широты/долготы в градусах.

Ответ 3

Я прокрутил математику и теперь могу значительно упростить решение.

Представьте себе, если мы будем вращать Землю так, чтобы наш первый вектор находился на 0 градусов широты и 0 градусов долготы. Второй вектор будет иметь ширину (альфа2 - альфа1) и широту (бета2 - бета1).

Так как...

sin(0) = 0 and cos(0) = 1

наш точечный продукт упрощает...

cos(delta_alpha) * cos(delta_beta) = cos(theta)

Остальная часть математики остается неизменной.

theta = acos (cos(delta_alpha) * cos(delta_beta))
distance = radius * theta

Надеюсь, что это поможет.