Уравнение для расстояния между двумя точками на карте, используя широту и долготу iphone - PullRequest
0 голосов
/ 13 сентября 2011

Я пытаюсь вычислить расстояние между двумя точками (булавками) на карте iPhone.Все работает нормально, однако, если вы поместите один из выводов ближе к левому краю, а другой - к правому краю карты, метод distanceFromLocation всегда возвращает кратчайшее расстояние между точками (конечно, земля не плоская).Я попытался переключить CLLocations, но он по-прежнему показывает самое короткое расстояние.

Для моего приложения мне нужно будет рассчитать как самое короткое, так и самое длинное расстояние между двумя выводами.Проблема кажется тривиальной, но я не могу ничего предложить, чтобы решить ее.Любая помощь или подсказки приветствуются.Спасибо!

1 Ответ

1 голос
/ 13 сентября 2011

Существует функция MKCoordinateRegionForMapRect, которая возвращает MKCoordinateRegion. Не пытаясь это сделать, кажется, что все, что вам нужно сделать, это точно указать прямоугольник как область, ограниченную одной диагональю одним выводом, а другую диагональю другим выводом. Вы можете использовать CGRectUnion дважды, указав в качестве начала координат исходное положение булавки и сколь угодно малую ширину и высоту.

Тогда расстояние между выводами будет квадратным корнем из расстояний, представленных значениями широты и долготы, возвращенными в квадрате и добавленными. (т. е. теорема Пифагора, две стороны длины являются горизонтальной и вертикальной сторонами треугольника, а диагональ - это прямая линия между вашими точками.)

Найти широтуДельта в метрах легко, каждый градус широты 111 км.

Чтобы найти счетчики для longitudeDelta, вам нужно немного больше кода.

#define EARTH_EQUATORIAL_RADIUS (6378137.0)
#define WGS84_CONSTANT (0.99664719)

#define degreesToRadians(x) (M_PI * (x) / 180.0)

// accepts decimal degrees. Convert from HMS first if that's what you have
double lengthOfDegreeLongitude(double degrees) {

    double tanDegrees = tanf(degreesToRadians(degrees));
    double beta =  tanDegrees * WGS84_CONSTANT;
    double lengthOfDegree = cos(atan(beta)) * EARTH_EQUATORIAL_RADIUS * M_PI / 180.0;

    return lengthOfDegree;
}

Дайте этой функции долготу интересующего вас местоположения и умножьте результат на longitudeDelta в градусах, чтобы получить расстояние в метрах. Тогда у вас есть горизонтальное расстояние и вертикаль, и вы можете найти диагональ, которую вы искали.

Неточность ухудшится, если вы ищете расстояние, которое очень велико в N-S, поскольку длина градуса долготы будет варьироваться в зависимости от расчета. И вы можете немного уточнить 111 км для градуса широты, это только из памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...