2

我已经看到了一些这样的例子,但不确定如何实现它,(例如iPhone Compass GPS Direction)我是否需要在 (void)startup 中调用 calcBearingWithLatitude ?

我所要做的就是让指南针从记忆中拉出一个点并将该点用作它的“北”,可以这么说并指向它,不需要距离或类似的东西。

我现在的实现文件看起来像

@implementation TrackerViewController

@synthesize locationManager; 
@synthesize compass; 
@synthesize headingLabel;

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

if ([CLLocationManager headingAvailable]) {

} else {
    [[[[UIAlertView alloc] initWithTitle:@"Error" 
                                 message:@"Device doesn't support heading updates" 
                                delegate:nil 
                       cancelButtonTitle:@"OK" 
                       otherButtonTitles:nil] autorelease] show];   
}
}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
double heading = [newHeading magneticHeading] * M_PI / 180.0;
self.compass.transform = CGAffineTransformMakeRotation(-heading);
self.headingLabel.text = [NSString stringWithFormat:@"%d°", (int)[newHeading magneticHeading]];
NSLog(@"%d", (int)[newHeading magneticHeading]);
}


- (void)locationManager:(CLLocationManager *)manager 
   didFailWithError:(NSError *)error {

//  NSLog(@"Error!");

if (error.code == kCLErrorDenied) {
    [[[[UIAlertView alloc] initWithTitle:@"Error" 
                                 message:@"User didn't allow heading updates" 
                                delegate:nil 
                       cancelButtonTitle:@"OK" 
                       otherButtonTitles:nil] autorelease] show];
    [self.locationManager stopUpdatingHeading];
}
}

 - (void)viewDidLoad {
 locationManager=[[CLLocationManager alloc] init];
 locationManager.desiredAccuracy = kCLLocationAccuracyBest;
 locationManager.delegate=self;
 //Start the compass updates.
 [locationManager startUpdatingHeading];
 [super viewDidLoad];
 }

- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

- (void)dealloc {
self.locationManager = nil;
self.compass = nil;
self.headingLabel = nil;
[super dealloc];
}

@end
4

1 回答 1

2

我会找到从坐标 A 到坐标 B 的方位,然后使用该方位作为罗盘方位从坐标 A 到坐标 B 的偏移量。

这里有两个链接用于查找坐标的方位

计算两个 CLLocationCoordinate2D 之间的方位

http://shawnsbits.com/blog/2011/07/07/calculating-heading-with-corelocation/

如果您希望罗盘方位在您移动时更新,使其始终指向坐标 B,那么您可能需要在获得新方位或位置时重新计算。

于 2012-05-03T22:49:08.937 回答