Использование компаса для указания фактического координатного местоположения, а не только севера

Я видел несколько примеров этого, но не уверен, как именно это реализовать (например, iPhone Compass GPS Direction) нужно ли мне вызывать calcBearingWithLatitude при запуске (void)?

Все, что я пытаюсь сделать, это заставить компас извлечь точку из памяти и использовать эту точку как «север», так сказать, и указать на нее, не нужно расстояние или что-то в этом роде.

Мой файл реализации на данный момент выглядит так

@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

person Alex Muller    schedule 28.02.2011    source источник
comment
не могли бы вы создать собственный заголовок для компаса?   -  person Alex Muller    schedule 01.03.2011


Ответы (1)


Я бы нашел азимут от координаты A до координаты B, а затем использовал бы этот азимут в качестве смещения для азимута по компасу от координаты A до координаты B.

Вот две ссылки для нахождения пеленга на координату

Вычисление пеленга между двумя CLLocationCoordinate2D

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

Если вы хотите, чтобы азимут по компасу обновлялся по мере вашего движения, чтобы он всегда указывал на координату B, то вы, вероятно, захотите пересчитывать каждый раз, когда вы получаете новый азимут или местоположение.

person Jenn    schedule 03.05.2012