Как получить градусы из свойства магнитного поля в iOS?

из документации Apple:

@property(readonly, nonatomic) CMMagneticField magneticField

Возвращает магнитное поле, измеренное магнитометром. (только для чтения)

Значением этого свойства является общее магнитное поле, наблюдаемое устройством, которое равно геомагнитному полю Земли плюс смещение, вносимое самим устройством и его окружением.

@property(readonly, nonatomic) CMCalibratedMagneticField magneticField

Величина CMCalibratedMagneticField, возвращаемая этим свойством, дает общее магнитное поле поблизости от устройства без учета смещения устройства. В отличие от свойства MagneticField класса CMMagnetometer, эти значения отражают магнитное поле Земли плюс окружающие поля за вычетом смещения устройства.

Какой из двух мне нужно использовать, если я хочу получить отклонение устройства от севера в градусах? То есть значение, которое будет отображать цифровой компас на iPhone, в зависимости от того, куда обращено устройство (например, 90, 180, 193 и т. д.).

Я знаю, что ни один из вышеперечисленных методов не возвращает степени в целочисленном формате. В документации не ясно, что именно они возвращают. Я думаю, что это MicroTeslas..

Но если они действительно возвращают значение MicroTesla, как преобразовать это значение в целое число, представляющее градусы? Должен ли я умножать это значение MicroTesla на какую-то константу или что-то в этом роде?

Спасибо за любую помощь!


person Community    schedule 06.07.2012    source источник
comment
Данные о магнитном поле содержат компоненты x, y и z. Вероятно, вам придется выполнить триггер, необходимый для преобразования этого в заголовок. Конечно, имейте в виду, что магнитное поле Земли не идеально, поэтому, особенно вблизи полюсов, вам придется применять поправки, чтобы получить истинное направление.   -  person Hot Licks    schedule 06.07.2012


Ответы (2)


Вам нужно измерить устройство heading, которое вы получили от CLLocationManager. Вот как вы начинаете получать обновления заголовков (сначала импортируете основную структуру местоположения) -

if([CLLocationManager headingAvailable]) //check if device has magnetometer
    [locationManager startUpdatingHeading];

после этого вы получаете обновления в этом делегате -

- (void)locationManager:(CLLocationManager*)manager 
       didUpdateHeading:(CLHeading*)newHeading
{
    // If the accuracy is valid, process the event.
    if (newHeading.headingAccuracy > 0)
        CLLocationDirection theHeading = newHeading.magneticHeading;

    return;
}

поэтому CLLocationDirection представляет собой направление, измеряемое в градусах относительно истинного севера.

Значения направления измеряются в градусах, начиная с строгого севера и продолжая движение по часовой стрелке вокруг компаса. Таким образом, север — это 0 градусов, восток — 90 градусов, юг — 180 градусов и так далее. Отрицательное значение указывает на неверное направление.

надеюсь, он поможет...

ОБНОВЛЕНИЕ: ознакомьтесь с этими ссылками — CLLocationManager и Degrees направления в iPhone и iPhone 3.0 Compass: как получить заголовок? и отсылка к яблоку.

person Srikar Appalaraju    schedule 06.07.2012
comment
просто быстрый, может быть, глупый: CLLocation Manager использует GPS или магнитометр, потому что я хочу полагаться исключительно на магнитометр устройства .. спасибо :) - person ; 06.07.2012
comment
поскольку x, y, z измеряются на основе геомагнитных данных, я предполагаю, что заголовок также основан на этом. Но если вам интересно знать направление устройства относительно севера, почему это важно для вас? - person Srikar Appalaraju; 06.07.2012
comment
потому что, если бы он полагался на GPS для этого, а GPS был бы недоступен, я бы ничего не получил, тогда как магнитометр устройства всегда доступен. Но вы правы, для него не имеет смысла использовать GPS для такого чтение.. - person ; 06.07.2012
comment
не беспокойтесь об этом. оставьте эти детали для iOS и Apple. Они предоставили вам хороший API, чтобы заставить устройство использовать его. - person Srikar Appalaraju; 06.07.2012
comment
Итак, если я правильно понимаю, при использовании свойства заголовка, которое вы предложили, мне не нужно беспокоиться о том, как мне даются эти значения. Значения могут поступать от GPS или магнитометра устройства или от их комбинации, но я всегда буду получать значение независимо от того, доступен ли GPS или нет (исходя из того, что в моем устройстве есть магнитометр, который...) . Это правильно? - person ; 06.07.2012
comment
да, это то, что я понял, читая документацию Apple для того же самого. Сладко, не так ли :) Но в этом отношении API создаются для абстрактной сложности. - person Srikar Appalaraju; 06.07.2012
comment
На самом деле я снова прочитал документацию (developer.apple.com/library/ios/#DOCUMENTATION/CoreLocation/) ›› - person ; 07.07.2012
comment
›› и они довольно прямо заявляют, что Важно Помимо недоступности оборудования, у пользователя есть возможность запретить доступ приложения к данным службы определения местоположения. Во время первоначального использования приложением платформа Core Location предлагает пользователю подтвердить, что использование службы определения местоположения является приемлемым. Если пользователь отклоняет запрос, объект CLLocationManager сообщает о соответствующей ошибке своему делегату во время будущих запросов. Вы также можете проверить явный статус авторизации приложения, используя метод authorStatus. - person ; 07.07.2012
comment
›› то, что вышеизложенное означает, если я правильно понимаю, заключается в том, что для этого необходимо включить GPS, тогда как я хочу использовать только магнитометр и обойти проблему запроса пользователя, хочет ли он включить службы определения местоположения, потреблять заряд батареи и т. д. и т. д. Так что я не думаю, что CLLocation Manager — это ответ на мой вопрос :( - person ; 07.07.2012
comment
В случае, если кто-то заинтересован, на этот вопрос в конечном итоге ответили здесь: title="какой код класса ios возвращает магнитный север"> stackoverflow.com/questions/11383968/ - person ; 08.07.2012

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

CLLocationDirection magneticDeclination = newHeading.trueHeading - newHeading.magneticHeading;
person Jeremy Whitcher    schedule 08.09.2012