Компас True Заголовок в iPhone/iPad
У меня возникла проблема с разработкой компаса iPhone/iPad.
Истинное хождение, взятое из CLHeading, дает мне значение "-1", я застрял здесь. Вот мой код:
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
self.locationManager.headingFilter = 0.5; //1 degrees
[self.locationManager startUpdatingHeading];
Я также узнал что-то, то есть когда я на карте приложения или компас приложение, которое использует материал местоположения, trueHeading значение внезапно прочитал правильно. Интересно, в чем причина, любая идея? Это происходит как на iPhone4, так и на iPad.
Это также случается, когда я покидаю службы местоположения в настройках и снова включаю его, он становится неспособным прочитать правильное значение trueHeading, интересно, потому что службы определения местоположения не могут быть включены приложением, которое я создаю?
В любом случае, спасибо заранее
--- Мое решение ---
см. ниже.
Ответы
Ответ 1
--- Мое решение ---
Что я сделал, добавьте в [self.locationManager startUpdatingLocation]
до или после [self.locationManager startUpdatingHeading];
(когда службы геолокации отключены и снова активируются из настроек). Я не уверен, что это хорошее решение, но это то, что я сделал, чтобы заставить его работать, если у вас есть лучшее решение, пожалуйста, поделитесь.
Ответ 2
чтобы заголовок не возвращался -1.000000, а не просто запускал startUpdatingHeading, но запускал startUpdatingLocation вместе, это помогает.
Ответ 3
Попробуйте использовать это...
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate=self;
locationManager.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
// Start heading updates.
if (locationManager.headingAvailable && locationManager.locationServicesEnabled)
{
locationManager.headingFilter = kCLHeadingFilterNone;
[locationManager startUpdatingHeading];
}
и после выполнения этого CLLocationManager делегирует методы вызова
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
// Use the true heading if it is valid.
[lblAccuracy setText:[NSString stringWithFormat:@"%.1fmi",newHeading.headingAccuracy]];
}
Но это кодирование работает на устройстве не в симуляторе...
Счастливое кодирование.
Ответ 4
У меня возникли проблемы с менеджером местоположений и выяснили, что для меня это помогло отключить iPhone от компьютера при тестировании. Как-то уведомление о калибровке появилось только после отсоединения iPhone.
Ответ 5
У меня была такая же проблема. Я переместил startUpdatingHeading в действие кнопки, а затем переместил его обратно туда, где выделен CLLocationManager, где он работал нормально, и он начал возвращать только -1.
Я перезагрузил свой iPad, и он снова начал работать. Надеюсь, это так.
Править: Нет, это не так. Мне тоже пришлось использовать startUpdatingLocation. Не будет ли это изнашивать батарею? Я установил желаемый атрибут kCLLocationAccuracyThreeKilometers, потому что я все равно не использую данные местоположения.
Ответ 6
Истинное чтение требует знания магнитной вариации для места, где вы используете компас. Из предыдущего обсуждения представляется, что функция, которая корректирует истинное направление от магнитного направления, нуждается в вашем местоположении для получения значения вариации. Если вам не нравится использовать информацию о местоположении GPS в вашем коде, я предлагаю прочитать магнитное считывание и исправить значение самостоятельно. Сначала вам нужно получить изменение для желаемого местоположения, а затем применить следующую формулу: T = M ± V, где T - истинное направление, M - магнитное считывание компаса, а V - вариация. Используйте "+" для Востока и "-" для Запада. Я нашел, что разрешающий веб-сайт предоставляет вариацию (магнитное склонение) для любого необходимого местоположения: http://www.geomag.nrcan.gc.ca/calc/mdcal-eng.php.
Ответ 7
Когда службы определения местоположения отключены, didUpdateHeading delegate method
возвращает только магнитный заголовок. Вы можете использовать его в соответствии с вашими потребностями. Согласно Apple docs..
Чтобы начать доставку связанных с заголовком событий, назначьте делегата объект диспетчера местоположений и вызвать его метод startUpdatingHeading. Если обновления местоположения также включены, диспетчер местоположений возвращается как истинный заголовок, так и магнитный заголовок. Если обновление местоположения не включены, диспетчер местоположений возвращает только магнитные значение курса.
Ответ 8
Работа над этой проблемой сейчас. Я могу получать обновления от Core Motion, когда я использую SpriteKit. Это о том, что вы можете постоянно вызывать функцию, как только кадр (1/60 секунды) или каждые несколько кадров. Без использования SpriteKit в документации говорится о том, чтобы вызывать обновления в закрытии, которые, как я полагаю, будут в своем потоке и до вас будут выпущены.
Существует алгоритм преобразования показаний магнитометра в фактические градусы относительно истинного севера. Представьте график, который выглядит как функция временного домена переменного тока, и вы увидите, что интерполяция данных - это простой вопрос применения уравнений Максвелла. Вот пример на honeywell