如何计算磁航向值以获得地理方向,即北,东北,东,东南,南,西南,西,西北?
由于磁性航向仅返回度数值及其显示地理方向所需的值,基于连续更新的磁航向。
我怎样才能使它成为可能?
答案 0 :(得分:10)
以下是我用来不断更新地理方向的代码。
CGFloat currentHeading = newHeading.magneticHeading;
NSString *strDirection = [[NSString alloc] init];
if(gradToRotate >23 && gradToRotate <= 67){
strDirection = @"NE";
} else if(gradToRotate >68 && gradToRotate <= 112){
strDirection = @"E";
} else if(gradToRotate >113 && gradToRotate <= 167){
strDirection = @"SE";
} else if(gradToRotate >168 && gradToRotate <= 202){
strDirection = @"S";
} else if(gradToRotate >203 && gradToRotate <= 247){
strDirection = @"SW";
} else if(gradToRotate >248 && gradToRotate <= 293){
strDirection = @"W";
} else if(gradToRotate >294 && gradToRotate <= 337){
strDirection = @"NW";
} else if(gradToRotate >=338 || gradToRotate <= 22){
strDirection = @"N";
}
我的工作正常。如果需要任何修改,欢迎大师告诉我。
答案 1 :(得分:3)
CLLocationDirection heading = ((newHeading.trueHeading > 0) ?
newHeading.trueHeading : newHeading.magneticHeading);
NSString *geoDirectionString = [[NSString alloc] init];
if(heading >22.5 && heading <= 67.5){
geoDirectionString = @"North East";
} else if(heading >67.5 && heading <= 112.5){
geoDirectionString = @"East";
} else if(heading >112.5 && heading <= 157.5){
geoDirectionString = @"South East";
} else if(heading >157.5 && heading <= 202.5){
geoDirectionString = @"South";
} else if(heading >202.5 && heading <= 247.5){
geoDirectionString = @"South West";
} else if(heading >248 && heading <= 293){
geoDirectionString = @"West";
} else if(heading >247.5 && heading <= 337.5){
geoDirectionString = @"North West";
} else if(heading >=337.5 || heading <= 22.5){
geoDirectionString = @"North";
}
答案 2 :(得分:2)
试试Matt Neuburg在Github上提供的这个例子。 https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch22p775heading/ch35p1035heading/ViewController.swift
func locationManager(manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
var h = newHeading.magneticHeading
let h2 = newHeading.trueHeading // will be -1 if we have no location info
print("\(h) \(h2) ")
if h2 >= 0 {
h = h2
}
let cards = ["N", "NE", "E", "SE", "S", "SW", "W", "NW"]
var dir = "N"
for (ix, card) in cards.enumerate() {
if h < 45.0/2.0 + 45.0*Double(ix) {
dir = card
break
}
}
print(dir)
}
很完美!
答案 3 :(得分:0)
@alloc_iNit接受的答案的快速(5.0)版本,并且也进行了测试。
private func updateDirectionTextFromHeading(_ magneticHeading:Double) {
let gradToRotate = Int(magneticHeading)
var strDirection = ""
if(gradToRotate > 23 && gradToRotate <= 67){
strDirection = "North East";
} else if(gradToRotate > 68 && gradToRotate <= 112){
strDirection = "East";
} else if(gradToRotate > 113 && gradToRotate <= 167){
strDirection = "Soth East";
} else if(gradToRotate > 168 && gradToRotate <= 202){
strDirection = "South";
} else if(gradToRotate > 203 && gradToRotate <= 247){
strDirection = "South West";
} else if(gradToRotate > 248 && gradToRotate <= 293){
strDirection = "West";
} else if(gradToRotate > 294 && gradToRotate <= 337){
strDirection = "North West"
} else if(gradToRotate >= 338 || gradToRotate <= 22){
strDirection = "North"
}
print("\(gradToRotate)° \(strDirection)")
}