iPhone指南针显示到特定位置

时间:2011-09-04 08:56:43

标签: iphone objective-c xcode compass-geolocation direction

我是Objective-c的新手,所以如果我的问题太垃圾,我想道歉。

我正在编程指南针,但它正在工作(感谢教程)。 给出实际位置(经度和纬度)。 罗盘内的箭头是否可以显示指向特定位置(经度2和纬度2)的方向? 我已经读过,我必须考虑iPhone的磁性和真实标题。

5 个答案:

答案 0 :(得分:3)

- (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 :(得分:1)

如果你不需要它太准确,那么它相当容易。您需要做的就是计算2个点之间的角度,并在指南针上显示角度。 (由于你还没有发布代码,我不确定你是否有类似setAngleForCompass的方法,但你应该这样做!)试试这个:

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

或者,您可以使用CMMotionManager访问陀螺仪,这也将指向正确的方向。 (双关语!)希望有帮助!

答案 2 :(得分:0)

我还需要计算前往某个位置的航向。我发现的最好方法是使用余弦球面定律。我创建了C函数来实现它,它们可用Here on github。听起来你需要headingInDegrees函数。这将给你一个真正的标题。

答案 3 :(得分:0)

来自tadeldv的CLLocation-Bearing项目: 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);
}

这会给你北极和目标之间的天使。那么你必须加/减你当前航向的角度。

答案 4 :(得分:-1)

感谢并嘲笑我的贬低的答案。 我正在制作一个显示特定方向的箭头。我现在做的是,让这个箭头做一个动画,但我的问题是,它应该(首先)指向相同的方向,就像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的方式