Convertir el azimut verdadero ingresado por el usuario en azimut magnético

Me preguntaba si hay una manera de usar CLHeading o CLLocationDirection para convertir entre acimut verdadero y magnético para un valor ingresado por el USUARIO.

En un escenario normal con muchos ejemplos de SO, podemos usar didUpdateHeading:(CLocation) newHeading con newHeading.magneticHeading o trueHeading para get esos valores cuando queremos que el dispositivo se dirija. Tanto trueHeading como magneticHeading son properties de solo lectura. Sin embargo, lo que necesito es proporcionar un acimut verdadero ingresado por el usuario a CLocation u otra cosa y devolver el valor magnético correspondiente a la input.

Una forma de hacerlo es get el model de campo magnético actualizado de la Tierra de NOAA (u otras fonts) y escribir código para hacer este cálculo en function de la location del usuario. Sin embargo, esto tiene muchos inconvenientes y requiere actualizaciones constantes de la matriz de models en el código de la aplicación, ya que el model cambia todo el time. Usar cualquier model incorporado sería genial …

ACTUALIZACIÓN (más información para comprender la declinación):

Probé la declinación para el área de DC y regresó correctamente -10.7 grados con la function simple en la respuesta de @rokjarc que se muestra a continuación. Para reference sobre la declinación en los EE. UU., Vea el siguiente map (Fuente de image – NOAA): introduzca la descripción de la imagen aquí

Más tarde, lo desplegaré en el dispositivo de un amigo en el área de Houston, Texas, donde la declinación es de 2 grados para confirmar más.

Para aquellos que se preguntan, cuando usa el MapKit de Apple, el map siempre está orientado para que el norte verdadero esté situado en la parte superior del map – fuente – ( http://developer.apple.com/library/ios/documentation/ MapKit / Reference / MKMapView_Class / ) Con la información anterior, siempre debe usar un título verdadero y NO magnético si muestra un punto de interés con un rumbo o acimut en relación con una location como la que estaba tratando de lograr …

NOTA: La declinación cambia todo el time (es posible que haya oído hablar del cambio de polos). Si testing esto en 2016, por ejemplo, DC puede tener una declinación de -5 o -20, etc. en lugar de la actual -10. Cuando use este método para calcular la declinación, no tendrá que preocuparse por los cambios en la declinación a lo largo del time, ya que la brújula (creo) detectará el campo magnético de la Tierra y devolverá el heading.magneticHeading correcto. heading.magneticHeading

Desde el último párrafo de su pregunta, parece que está interesado en la conversión de un título magnético arbitrario en un título verdadero en la location actual del usuario.

En este caso, puede asignar un ivar (o propiedad) llamado variation y actualizar regularmente en didUpdateHeading:

 //instantiated as ivars or properties: NSDate *variationTimestamp; double variation; //or CLLocationDirection CLLocationManager *locationManager; -(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { CLLocation *location = locationManager.location; //check if location is valid - it has to be for variation data to be valid too if ((newHeading.headingAccuracy > 0) && (location.horizontalAccuracy > 0)) { variation = newHeading.trueHeading - newHeading.magneticHeading; variationTimestamp = newHeading.timestamp; } } 

Dado que la variación magnética si una f(location) es igual para todos los encabezados magnéticos en la misma location, puede usar esta variation para los cálculos con la input del usuario.

El inconveniente obvio es que debe tener nuevos datos de location / encabezado. Nota: además de habilitar las actualizaciones de encabezado, también debe habilitar las actualizaciones de location .

Lo más probable es que a medida que obtenga actualizaciones de location en time real, el verdadero título se derive de los datos del GPS a medida que avanza de un punto a otro mientras el título magnético proviene de la brújula. Por supuesto, esto solo funciona en time real en la location actual del usuario.

El marco de Ubicación del núcleo no tiene API para darle la variación magnética para una location arbitraria. La solución descrita en su último párrafo es su única solución viable.

Tenga en count que no puede haber un model incorporado por la razón que ya mencionó: cambia.

Si lee las notas de licencia de Apple iPhone, obtendrá una list de todos los files de código abierto que usan en el iPhone. (Menú común-> Información-> Derechos de autor-> Licencia) Uno de ellos es el model de tierra geomagnética, desarrollado por NOAA. Puede download la fuente e implementar también eso: Geomag: https://www.ngdc.noaa.gov/WMM/

Esto tendría la ventaja de que puedes calcular la variación magnética para cualquier coorderada en el mundo, no solo la actual. Para la mayoría de los lugares se conoce y especifica el cambio relativo del azimut por año, como en mejores maps topocharts. Puede extrapolar a la hora actual al conocer la date del model de geo mag.

Sin embargo, en la mayoría de los casos, es suficiente conocer la variación magnética para la location actual. En ese caso es posible leerlo desde CLLocation (como lo describe el Usuario rokjarc)

    Intereting Posts