将罗盘指向一个方向

时间:2016-07-20 08:20:07

标签: ios swift core-location

我有一个代表一个简单旋钮的UIImageView:它与立体声高保真无关,它代表了一种指南针:

enter image description here

我的目标如下:我希望指南针指向一个精确的方向,从设备的当前位置开始(它也必须更新:如果用户将设备转到别处,旋钮应相应地旋转)。 / p>

到目前为止我尝试了什么:

我有这个功能:

func getRadiansBearing()->Double{

        // body of degreesToRadians: return degrees * M_PI / 180.0

        // data[1]._lat and _lon contains my current position
        let lat1 = degreesToRadians(data[1]._lat)
        let lon1 = degreesToRadians(data[1]._lon)

        // data[0]._lat and _lon contains the target position
        let lat2 = degreesToRadians(data[0]._lat)
        let lon2 = degreesToRadians(data[0]._lon)

        let dLon = lon2 - lon1;

        let y = sin(dLon)*cos(lat2)
        let x = cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(dLon)

        var radiansBearing = atan2(y, x);

        if(radiansBearing < 0.0)
        {
            radiansBearing = radiansBearing+2*M_PI
        }

        return radiansBearing

    }

我用这种方式调用它,使用CoreLocation框架:

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

        guard let location = locations.last else {
            return;
        }

        // data is an array of structs
        data[1]._lat = location.coordinate.latitude
        data[1]._lon = location.coordinate.longitude

        geoAngle = getRadiansBearing()

    }

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

        let direction = -newHeading.trueHeading
        let dir2 = degreesToRadians(direction)

        UIView.animateWithDuration(2.0, animations: {
            self.imgView.transform = CGAffineTransformMakeRotation((CGFloat(dir2) * CGFloat(M_PI) / 180) + CGFloat(self.geoAngle))
        })

    }

问题是,由于某种原因,旋钮转到一个(错误的)方向,然后停止工作。

你能帮帮我吗?任何提示表示赞赏! : - )

P.S。:我发了很多相关的帖子,没有解决这个问题

1 个答案:

答案 0 :(得分:0)

  

将纬度视为x,将经度视为y。

<强>先决条件:

  1. 必须知道目的地位置。
  2. 必须知道当前位置。
  3. 我会告诉你如何计算朝向这个方向的角度。它如下!

      
        
    1. 获取当前位置和目的地位置的纬度和经度。
    2.   

    伪代码:

    设,currentLocation =(lat,long)
    设,destinationLocation =(lat,long)
    angleTowardsDestination =?

      
        
    1. 计算Pythagorus定理的基数和斜边。
    2.   

    现在,  base =√((currentLocation.lat - destinationLocation.lat) 2 - (currentLocation.long - currentLocation.long) 2
    hypotenuse =√((currentLocation.lat - destinationLocation.lat) 2 - (currentLocation.long - destinationLocation.long) 2

      
        
    1. 现在计算角度!
    2.   

    angleTowardsDestination = Cos -1 (base / hypotenuse)

    而且,这是你需要的角度。如果需要,请随意将其转换为弧度。

    亲切的问候,
    Suman Adhikari