допустимый способ расчета угла между 2 CLLocations?

Является ли это допустимым способом вычисления угла (в радианах) от одного CLLocation к другому?

-(float)angleFromLocation:(CLLocationCoordinate2D)start toLocation:(CLLocationCoordinate2D)end {
float deltaX = start.latitude - end.latitude;
float deltaY = start.longitude - end.longitude;
float ang = atan2(deltaY, deltaX);

return ang;}

Пожалуйста, порекомендуйте!

Любая помощь будет высоко ценится.


person David    schedule 03.08.2011    source источник
comment
Вы приближаетесь. Ознакомьтесь с решениями этого ответа - stackoverflow.com/questions/6140045/   -  person olo    schedule 07.08.2011


Ответы (3)


Свифт 4 версия:

extension FloatingPoint {

    var degreesToRadians: Self { return self * .pi / 180 }
    var radiansToDegrees: Self { return self * 180 / .pi }
}

extension CLLocationCoordinate2D: Equatable {

    func heading(to: CLLocationCoordinate2D) -> Double {
        let lat1 = self.latitude.degreesToRadians
        let lon1 = self.longitude.degreesToRadians

        let lat2 = to.latitude.degreesToRadians
        let lon2 = to.longitude.degreesToRadians

        let dLon = lon2 - lon1
        let y = sin(dLon) * cos(lat2)
        let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon)

        let headingDegrees = atan2(y, x).radiansToDegrees
        if headingDegrees >= 0 {
            return headingDegrees
        } else {
            return headingDegrees + 360
        }
    }
}
person coldfire    schedule 03.11.2017
comment
Работал отлично, так как я использовал функцию расширения непосредственно в классе, потому что в расширении я получаю эту ошибку: реализация «Equatable» не может быть автоматически синтезирована в расширении в файле, отличном от типа - person Naveen Kumawat; 19.12.2018
comment
Ваш код работает отлично. Пожалуйста, добавьте некоторые пояснения к вашему коду, которые помогут в понимании. Спасибо - person Muhammad Zeeshan; 11.02.2020

Я использовал вариант этого вопрос и ответ, и он работает Что ж:

double DegreesToRadians(double degrees) {return degrees * M_PI / 180.0;};
double RadiansToDegrees(double radians) {return radians * 180.0/M_PI;};

- (double)bearingFromLocation:(CLLocation *)fromLocation toLocation:(CLLocation *)toLocation
{

    double lat1 = DegreesToRadians(fromLocation.coordinate.latitude);
    double lon1 = DegreesToRadians(fromLocation.coordinate.longitude);

    double lat2 = DegreesToRadians(toLocation.coordinate.latitude);
    double lon2 = DegreesToRadians(toLocation.coordinate.longitude);

    double dLon = lon2 - lon1;

    double y = sin(dLon) * cos(lat2);
    double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
    double radiansBearing = atan2(y, x);

    double degreesBearing = RadiansToDegrees(radiansBearing);

    if (degreesBearing >= 0) {
        return degreesBearing;
    } else {
        return degreesBearing + 360.0;
    }
}
person Ric Santos    schedule 17.10.2015
comment
У меня похожая проблема. Я отслеживаю местоположение пользователя на основе показаний GPS. Показания GPS дают мне значение курса, которое определяет направление на север в градусах. Когда я вычисляю разницу углов между двумя координатами, все становится ужасно, если пользователь перемещается от 0 до 359 градусов. В реальном времени это могло быть изменение на 1 градус, но мой код дает изменение на 359 градусов. Любые идеи? - person nr5; 28.02.2017

Лучшим методом, который я нашел для этого вычисления, было использование сферического закона косинусов. Для этого есть функция C, доступная здесь, на github, которая называется заголовокInDegrees. Он принимает две пары широта/долгота и возвращает заголовок:

/*------------------------------------------------------------------------- 
* Given two lat/lon points on earth, calculates the heading 
* from lat1/lon1 to lat2/lon2.   
*  
* lat/lon params in degrees 
* result in degrees 
*-------------------------------------------------------------------------*/
double headingInDegrees(double lat1, double lon1, double lat2, double lon2);

Поскольку CLLocationCoordinate2d содержит широту и долготу, эти два поля легко передать этой функции и получить обратно направление.

person progrmr    schedule 08.09.2011