どうもこんにちは。iOSをメインに開発しているロッキーカナイです。
私は現在、地図系アプリを開発しているのですが、基準地と目的地の緯度経度から方角を計算する必要があって色々調べたのですが、Swiftで紹介しているサイトが無かったので、ここで紹介したいと思います。
ちなみに以前、【swift】緯度経度から距離を求める方法という記事を書いたのですが、それの方角編になります。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() print("東京都庁から埼玉県庁の方角は\(angle(currentLatitude: 35.68944, currentLongitude: 139.69167, targetLatitude: 35.85694, targetLongitude: 139.64889))度") } // 基準地の緯度経度から目的地の緯度経度の方角を計算する func angle(currentLatitude: CGFloat, currentLongitude: CGFloat, targetLatitude: CGFloat, targetLongitude: CGFloat) -> Int { let currentLatitude = toRadian(currentLatitude) let currentLongitude = toRadian(currentLongitude) let targetLatitude = toRadian(targetLatitude) let targetLongitude = toRadian(targetLongitude) let difLongitude = targetLongitude - currentLongitude let y = sin(difLongitude) let x = cos(currentLatitude) * tan(targetLatitude) - sin(currentLatitude) * cos(difLongitude) let p = atan2(y, x) * 180 / CGFloat.pi if p < 0 { return Int(360 + atan2(y, x) * 180 / CGFloat.pi) } return Int(atan2(y, x) * 180 / CGFloat.pi) } // 角度からラジアンに変換 func toRadian(_ angle: CGFloat) -> CGFloat { return angle * CGFloat.pi / 180 } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } |
基準地点の緯度経度と目的地の緯度経度から角度を計算しております。
関数angle()の戻り値の角度は整数にキャストしており、0から360度の範囲を返却してます。
ここでは東京都庁(緯度:35.68944 経度:139.69167)から、埼玉県庁(緯度:35.85694 経度:139.64889)の方角を計算しております。
Runすると、

”東京都庁から埼玉県庁の方角は348度”とログが出力されます。
確認の為、CASIOのサイトで計算できるところがあるので答え合わせしてます。

見えにくいかもしれませんが、バッチリ正解でした。
ではー
ABOUT ME
