компас iPhone, показывающий определенное местоположение - PullRequest
4 голосов
/ 04 сентября 2011

Я новичок в объективе-c, поэтому хочу извиниться, если мой вопрос слишком мусорный.

Я программирую компас и, тем не менее, он работает (благодаря учебнику). Фактическая позиция (долгота и широта) дается. Возможно ли, что моя стрелка в компасе может показать мне направление к определенному месту (долгота2 и широта2)? Я прочитал, что я должен учитывать магнитный и истинный курс iphone.

Ответы [ 5 ]

4 голосов
/ 09 ноября 2011
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
    double heading = newHeading.trueHeading; //in degree relative to true north
    double bearing = ... //get current bearing in degree relative to true north
                         //with the JS library mentioned below it would be something like
                         //bearing = userLoc.bearingTo(destionation);

    //just two lines, the the sake of the example
    double rotationInDegree = (bearing - heading);  //the important line
    rotationInDegree = fmod((rotationInDegree + 360), 360);  //just to be on the safe side :-)
    compassViewPerhapsAsImage.transform=CGAffineTransformMakeRotation(DegreesToRadians(rotationInDegree));
}

Хорошие ссылки для расчета направления:

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

Если вам не нужно, чтобы он был слишком точным, то это довольно просто. Все, что вам нужно сделать, это рассчитать угол между двумя точками и показать угол на компасе. (Поскольку вы не разместили код, я не уверен, что у вас есть метод, подобный setAngleForCompass, но вы должны!) Попробуйте это:

float dx = Longitude2 - Longitude1;
float dy = Latitude2 - Latitude1;
float angle = atan2(dy, dx);
// Set the angle of the compass here.

Кроме того, вы можете использовать CMMotionManager , чтобы получить доступ к гироскопу, который также укажет вам правильное направление. (каламбур!) Надеюсь, что поможет!

0 голосов
/ 27 июня 2013

Из проекта CLLocation-Bearing от tadeldv: https://github.com/tadelv/CLLocation-Bearing

CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;}
CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180 / M_PI;}

- (void)calculating bearing {  
        float lat1 = DegreesToRadians(YOURCURRENTPOSITION.coordinate.latitude);
        float lng1 = DegreesToRadians(YOURCURRENTPOSITION.coordinate.longitude);
        float lat2 = DegreesToRadians(YOURTARGETPOSITION.coordinate.latitude);
        float lng2 = DegreesToRadians(YOURTARGETPOSITION.coordinate.longitude);
        float deltalng = lng2 - lng1;
        double y = sin(deltalng) * cos(lat2);
        double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(deltalng);
        double bearing = atan2(y, x) + 2 * M_PI;
        float bearingDegrees = RadiansToDegrees(bearing);
        bearingDegrees = (int)bearingDegrees % 360;

        NSLog(@"%d", (int)bearingDegrees);
}

это дает вам ангела между северным полюсом и вашей целью.затем вы должны добавить / вычесть угол вашего текущего курса.

0 голосов
/ 11 сентября 2011

спасибо и извините за мой запоздалый ответ. Я работаю над стрелкой, показывающей определенное направление. Теперь я сделал так, чтобы эта стрелка выполняла анимацию, но моя проблема в том, что она должна (сначала) указывать в том же направлении, что и «iphone» «движется».

Пока мой код:

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{double heading = newHeading.trueHeading;
[self rotateCompass:heading];
}

- (void) rotateCompass: (double) degrees{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView commitAnimations];
compassRose.transform = CGAffineTransformMakeRotation(degrees);
}

У меня есть другие процедуры, чтобы получить широту, долготу и метки, показывающие мне направление, и это работает. Моя стрела безумно вертится без всякой причины. Я хочу, чтобы стрелки указывали в том же направлении, что и trueHeading. Это означает, что iPhone

0 голосов
/ 04 сентября 2011

Мне также нужно было рассчитать направление к месту.Лучший метод, который я нашел, - это использование сферического закона косинусов.Я создал C-функции для реализации этого, и они доступны Здесь, на github .Похоже, вам нужна функция headingInDegrees.Это даст вам истинное направление.

...