2016-11-10 57 views
1

我有2個箭頭作爲2個圖像,指向北的指向北總是指向北,但城市箭頭從不固定。即使我不移動設備,也會保持波動。我該怎麼做才能解決這個問題?試圖建立一個指向使用Swift的城市的指南針3

另外,我懷疑錯誤是在timeToGetTheDirection函數中。

下面是代碼:

import UIKit 
import CoreLocation 

struct TokyoLocationConstants { 
    static let cityLat = 35.6895 
    static let cityLong = 139.6917 
    } 

class ViewController: UIViewController, CLLocationManagerDelegate { 

     let obj1 = CLLocationManager() 
     var degrees: Double = 0 

    override func viewDidLoad() { 

     obj1.startUpdatingLocation() 
     obj1.startUpdatingHeading() 
} 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

    timeToGetTheDirection(location: locations.last!) 
} 

    func timeToGetTheDirection(location: CLLocation) { 

    let lat1 = location.coordinate.latitude // My current Latitude 
    let long1 = location.coordinate.longitude // My current Longitude 


    // Fromula to get the direction to a city from this site: 
    // http://www.movable-type.co.uk/scripts/latlong.html 

    let differenceInLong = TokyoLocationConstants.cityLong - long1 

    let y = sin(differenceInLong) * cos(TokyoLocationConstants.cityLat) 
    let x = cos(lat1) * sin(TokyoLocationConstants.cityLat) - sin(lat1) * cos(TokyoLocationConstants.cityLat) * cos(differenceInLong) 

    let theAngleInRad = atan2(y, x) 
    var theAngleInDeg = theAngleInRad * (180/M_PI) 

    if(theAngleInDeg < 0){ 
     theAngleInDeg = -theAngleInDeg; 
    } // End of Formulla 

    degrees = theAngleInDeg; // Assign the result of formula above to global var to be used below 
} 

    func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) { 

    var rad: Double = 0 


    if newHeading.trueHeading > 0 { 
    // This will make the 1st arrow points to the North 

     rad = newHeading.trueHeading * (M_PI/180) 
     imageView.transform = CGAffineTransform(rotationAngle: CGFloat(-rad)) 
    } 

     // This will make the 2nd arrow points to the City 

    let cityDegreeInRad = (M_PI/180) * degrees 
    let something = (newHeading.trueHeading - (cityDegreeInRad)) 

    lineImageView.transform = CGAffineTransform(rotationAngle: CGFloat(-something)) 
} 

回答

0

試試這個

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

        let location = CLLocation() 

        let userLoc : CLLocationCoordinate2D = location.coordinate 
        self.calUserAngle(here: userLoc) 

       } 

func calUserAngle(here: CLLocationCoordinate2D) { 

       var x = 0.0 
       var y = 0.0 
       var delLon = 0.0 

       //Tokio Coords 
       let tokioLat = 35.6895 
       let tokioLon = 139.6917 

       delLon = tokioLon - here.longitude 
       y = sin(delLon) * cos(tokioLat); 
       x = cos(here.latitude) * sin(tokioLat) - sin(here.latitude) * cos(tokioLat) * cos(delLon) 

       let theAngleInRad = atan2(y, x) 
       var theAngleInDeg = theAngleInRad * (180/.pi) 

       if(theAngleInDeg < 0){ 
        theAngleInDeg = -theAngleInDeg 
       } else { 
        theAngleInDeg = 360 - theAngleInDeg 
       } 

       //degress is my Double var 
       degress = theAngleInDeg 
      } 

     func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) { 

       print(String(format: "%.0f°", newHeading.magneticHeading)) 

       //Convert Degree to Radian and move the needle 
       let newRad = -newHeading.trueHeading * Double.pi/180 

       //First arrow animation to destination 
       UIView.animate(withDuration:0.3){ 
        self.imgArrowUP.transform = CGAffineTransform(rotationAngle: CGFloat((self.degress - newHeading.trueHeading) * .pi/180)); 
       } 

       //Second arrow animation to North 
       UIView.animate(withDuration:0.6){ 
        self.compassView.transform = CGAffineTransform(rotationAngle: CGFloat(newRad)); 
       } 

      } 

我希望我幫助