2011-06-22 12 views
6

Jak obliczyć wartość kursu magnetycznego, aby uzyskać kierunek geograficzny, tj. Północ, północny-wschód, wschód, wschód-południe, południowy, południowy-zachód, zachód, zachód-północ?Uzyskaj kierunek geograficzny za pomocą pola magnetycznego

W nagłówku magnetycznym zwracana jest tylko wartość stopnia i jego wymagane wskazanie kierunku geograficznego, na podstawie ciągłej zaktualizowanej pozycji magnetycznej.

Jak mogę to umożliwić?

+0

Sądzę, że mają już do tego dodaną funkcjonalność do biblioteki mapKit. Powinieneś to sprawdzić. – Radu

+0

Nie znajduję takiej funkcjonalności. Jeśli w przypadku, znalazłeś, proszę dać mi znać. –

+1

Sam znajduję rozwiązanie. Przetestowałem zaimplementowaną logikę, a także porównałem ją z kompasem i działa dobrze z moją aplikacją. –

Odpowiedz

9

Poniżej znajduje się kod, którego używam do wyświetlania stale aktualizującego kierunek geograficzny.

 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"; 
     } 

Działa dobrze na moim końcu. Mistrzowie są mile widziane, aby dać mi znać, jeśli wymagana jest jakakolwiek modyfikacja.

+1

Nie mogę znaleźć standardowych stopni identyfikujących dokładny kierunek geograficzny, dlatego ustaw te obliczenia w porównaniu do kompasu. –

+0

Po prostu niesamowite (pomocne dla ludzi, nawet po dwóch latach) :-) .. jak dostałeś te wartości dla stopni? Jakieś źródło? – thandasoru

+1

Dzięki. Brak logiki źródłowej, wyłącznie samoczynnej. –

2

Wypróbuj ten przykład oferowany przez Matta Neuburga na 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) 
} 

Jest idealny!

+1

Dzięki dobrze działa. – fozoglu

2
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"; 
} 
Powiązane problemy