2013-10-01 2 views
0

Я пытаюсь получить информацию о направлении, которое пользователь (N-S-W-O) направляет по методу курса CLLocation. Я использую этот код:Получение курса CLLocation и перевод его пользователю

double course; 
bool isNord; 

course = currentLocation.course; 
NSLog(@"Current course: %f", course); 
NSInteger courseString = course; 
//_labelCompass.text = [NSString stringWithFormat:@"%d", courseString]; 

if (courseString == -1) { 
    _labelCompass.text = @"N/A"; 
} 
if (courseString >= 22 && courseString <= 67) { 
    isNord = false; 
    _labelCompass.text = @"NE"; 
} 
if (courseString >=67 && courseString <= 112) { 
    isNord = false; 
    _labelCompass.text = @"E"; 
} 
if (courseString >= 112 && courseString <= 157) { 
    isNord = false; 
    _labelCompass.text = @"SE"; 
} 
if (courseString >= 157 && courseString <= 208) { 
    isNord = false; 
    _labelCompass.text = @"S"; 
} 
if (courseString >= 208 && courseString <= 247) { 
    isNord = false; 
    _labelCompass.text = @"SW"; 
} 
if (courseString >= 247 && courseString <= 292) { 
    isNord = false; 
    _labelCompass.text = @"W"; 
} 

if (courseString >= 292 && courseString <= 337) { 
    isNord = false; 
    _labelCompass.text = @"NW"; 
} 

if (isNord == true) { 
    _labelCompass.text = @"N"; 
} 

Конечно, я ставлю это в

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

и информация о курсе является обновление успешно. Используя этот алгоритм, я не могу знать, когда курс северный, как и для других, поэтому я создал это. Есть ли другие методы лучше этого? Большое спасибо.

ответ

2

Неправильно то, что с <= 67 из сначала, если и второй >= 67 второго, если, если значение равно 67, ВСЕГДА первый, если будет запущен. Также, как указано в rmaddy, пожалуйста, используйте else if, это более эффективно. Наконец, используйте лучший синтаксис min < myVal && myVal < max для эмулирования математического диапазона min < MyVal < max.

+1

Наконец-то он работает, благодаря всем! – PeppeLaKappa

2

Почему вы не можете определить курс на Север? Просто выполните:

if (course < 22 || course > 337) { 
    _labelCompass.text = @"N"; 
} 

BTW - используйте else if. Это будет намного эффективнее:

if (courseString == -1) { 
    _labelCompass.text = @"N/A"; 
} else if (courseString >= 22 && courseString <= 67) { 
    _labelCompass.text = @"NE"; 
} else if (courseString >=67 && courseString <= 112) { 
+0

Конечно, я пробовал эти способы (оба курса <22 || курс> 337 и еще если), но тогда приложение ничего не печатает в текстовой метке, если курс был между этим интервалом – PeppeLaKappa

+0

. Тогда у вас должно быть что-то не так. То, что я разместил, будет работать нормально. – rmaddy

+0

Код, который я использовал, - это то, что вы читаете, возможно, «=» Может быть, что-то не так? – PeppeLaKappa

0

CLLocationManager имеет опцию заголовка с заголовком Обновление делегата.

- (void)locationManager:(CLLocationManager *)manager 
didUpdateHeading:(CLHeading *)newHeading 

newHeading имеет свойство 'magneticHeading':

0 на север, 90 является восток, 180 юг, 270 запад

+0

DoesUpdateHeading использует встроенный магнитометр iPhone? – PeppeLaKappa

+0

В соответствии с документацией: Устройства с магнитометром могут сообщать направление, в котором указывает устройство, также известное как его заголовок. Устройства с оборудованием GPS могут сообщать направление движения устройства, также известное как его курс. https://developer.apple.com/library/ios/documentation/userexperience/conceptual/LocationAwarenessPG/GettingHeadings/GettingHeadings.html – Gerharbo

+0

Мое приложение останется в фоновом режиме, а скорость и другие вещи отправляются через BT в Pebble Smartwatch, место iPhone в вашем кармане и использование магнитометра, похоже, не является правильным методом, чтобы добраться туда, куда идет пользователь. – PeppeLaKappa

Смежные вопросы