NativeScript:如何将磁航向度数转换为真航向度数
如何在NativeScript iOS中将磁航向转换为真航向?
你可以通过磁航向 + 磁偏角的公式计算真航向,磁偏角可从当前位置的CLLocation对象中获取,这样就无需依赖GPS提供的trueHeading,仅用磁力计的磁航向结合位置的磁偏角就能得到真航向。
原理说明
真航向 = 磁航向 + 磁偏角(磁偏角由当前地理位置决定,东磁偏为正,西磁偏为负)。计算后需要处理角度循环问题,确保结果落在0-360度范围内。
修改后的实现代码
Location.service.ts
import * as geoLocation from "@nativescript/geolocation"; import { Injectable } from "@angular/core"; @Injectable() export class LocationService { private locationManager: CLLocationManager; private currentLocation: CLLocation; // 保存当前位置用于获取磁偏角 constructor() { this.locationManager = CLLocationManager.alloc().init(); this.locationManager.desiredAccuracy = 3; this.locationManager.distanceFilter = 0.1; this.locationManager.headingFilter = 0.1; // 监听位置更新,获取当前位置的磁偏角 this.locationManager.delegate = { locationManagerDidUpdateLocations: (manager, locations) => { this.currentLocation = locations[locations.length - 1]; } }; } getMagneticHeading(): number { return this.locationManager?.heading?.magneticHeading; } // 新增:计算真航向 getTrueHeading(): number { const magneticHeading = this.getMagneticHeading(); if (!magneticHeading || !this.currentLocation) return null; // 获取当前位置的磁偏角 const magneticVariation = this.currentLocation.magneticVariation; // 计算真航向并处理360度循环 let trueHeading = magneticHeading + magneticVariation; if (trueHeading < 0) trueHeading += 360; if (trueHeading > 360) trueHeading -= 360; return trueHeading; } convertDegreesToDirectionText(direction: number): string { if (direction == null) { return "N/A"; } if (direction > 337.5 || (direction >= 0 && direction <= 22.5)) { return "North"; } if (direction > 22.5 && direction < 67.5) { return "Northeast"; } if (direction >= 67.5 && direction <= 112.5) { return "East"; } if (direction > 112.5 && direction < 157.5) { return "Southeast"; } if (direction >= 157.5 && direction <= 202.5) { return "South"; } if (direction > 202.5 && direction < 247.5) { return "Southwest"; } if (direction >= 247.5 && direction <= 292.5) { return "West"; } if (direction > 292.5 && direction < 337.5) { return "Northwest"; } return "Could not determine direction."; } startUpdatingLocation(): void { this.locationManager.startUpdatingLocation(); } stopUpdatingLocation(): void { this.locationManager.stopUpdatingLocation(); } startUpdatingHeading(): void { this.locationManager.startUpdatingHeading(); } stopUpdatingHeading(): void { this.locationManager.stopUpdatingHeading(); } }
Component.ts
import { Component, OnInit } from '@angular/core'; import { LocationService } from './location.service'; @Component({ selector: 'ns-details', templateUrl: './item-detail.component.html', }) export class ItemDetailComponent implements OnInit { item: Item; constructor(private locationService: LocationService) { this.locationService.startUpdatingLocation(); this.locationService.startUpdatingHeading(); } ngOnInit(): void { // 延迟执行确保位置和航向数据已获取 setTimeout(() => { console.log('Magnetic Heading', this.locationService.getMagneticHeading()); console.log('True Heading', this.locationService.getTrueHeading()); console.log('True Heading Text', this.locationService.convertDegreesToDirectionText(this.locationService.getTrueHeading())); }, 2000); } }
关键注意点
- 磁偏角
magneticVariation是CLLocation的属性,只有位置更新成功后才能获取有效值,建议延迟获取或监听位置更新完成后再计算真航向。 - 计算后需处理角度超出0-360度的情况,保证结果合理。
- 虽然无需依赖GPS提供的
trueHeading,但仍需获取当前位置来获取磁偏角,可调整desiredAccuracy参数使用较低精度位置,减少对GPS的依赖。
内容的提问来源于stack exchange,提问作者Pein
相关产品推荐
相关产品推荐

