質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

17530閲覧

緯度経度から方位角を算出する式

takuto765

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

1クリップ

投稿2017/08/31 15:23

###前提・実現したいこと
以下のサイトの計算式を使用して緯度経度から方位角と距離を計算するプログラムをpythonを用いて作成を行いました。
CASIO2地点間の距離

python import math from math import sin from math import cos from math import tan from math import atan2 from math import pi from math import acos radeg = 180/pi #radからdegに変換 r= 6378.137*10**3 x1=139.988909 y1=35.685828 x2=139.990339 y2=35.685879 deltax = x2-x1 ans= 90-atan2(sin(deltax), cos(y1)*tan(y2)-sin(y1)*cos(deltax) )*radeg #方位角計算 distance = r*acos(sin(y1)*sin(y2)+cos(y1)*cos(y2)*cos(deltax)) #距離計算 #phi= 90-math.atan2() print('方位角:'+str(ans)) print('距離:'+str(distance/1000)+'Km')
インターネットのサイトの計算結果と一致しないため、式が間違っているのかそれとも私の実装方法が間違っているのかが知りたいです。 また、他の言語での実装も考えてるため、申し訳ありませんがpyprojなど使用しないで純粋に数式だけを用いて実装を行うことを前提としています。 もし、CASIOの数式以外に緯度と経度から方位角と距離を求めることができる数式をご存知であればそちらでも構わないので教えてください よろしくお願い申し上げます。
退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

コードをぱぱっと置いときます。

結論から言うと、該当サイトの計算式はあっていますが、北を基準にしているところと、式にずれがあるようです。
その為、atan2の負の符号に関して条件分岐が足りないようでした。

from math import sin, cos, tan, atan2, acos, pi def azimuth(x1, y1, x2, y2): # Radian角に修正 _x1, _y1, _x2, _y2 = x1*pi/180, y1*pi/180, x2*pi/180, y2*pi/180 Δx = _x2 - _x1 _y = sin(Δx) _x = cos(_y1) * tan(_y2) - sin(_y1) * cos(Δx) psi = atan2(_y, _x) * 180 / pi if psi < 0: return 360 + atan2(_y, _x) * 180 / pi else: return atan2(_y, _x) * 180 / pi def distance(x1, y1, x2, y2, r): _x1, _y1, _x2, _y2 = x1*pi/180, y1*pi/180, x2*pi/180, y2*pi/180 Δx = _x2 - _x1 val = sin(_y1) * sin(_y2) + cos(_y1) * cos(_y2) * cos(Δx) return r * acos(val) x1 = 139.988909 y1 = 35.685828 x2 = 139.990339 y2 = 35.685879 r = 6378.137e3 angle = azimuth(x1, y1, x2, y2) dis = distance(x1, y1, x2, y2, r) / 1e3 # kmに変換 print("方位角 : {0:.3f} 度".format(angle)) print("距離 : {0:.3f} km".format(dis)) # 結果 # 方位角 : 87.485 度 # 距離 : 0.129 km

これで CASIO2地点間の距離 の計算結果とはずです。

投稿2017/08/31 17:33

編集2017/08/31 17:39
Gazelle

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

式が間違っていると思います。主に度とラジアンとか。

python

1import math 2from math import sin 3from math import cos 4from math import tan 5from math import atan2 6from math import acos 7from math import radians 8from math import degrees 9 10r= 6378.137 #単位はkmのままでOK 11 12# test data 1 13# x1=139.74477 14# y1=35.6544 15# x2=39.8261 16# y2=21.4225 17 18# test data 2 19x1=139.988909 20y1=35.685828 21x2=139.990339 22y2=35.685879 23 24# 経度・緯度を度からラジアンに変換 sin,cos,tan,etc はラジアンを使う 25x1=radians(x1) 26y1=radians(y1) 27x2=radians(x2) 28y2=radians(y2) 29 30deltax = x2 - x1 31 32ans = degrees(atan2(sin(deltax),(cos(y1)*tan(y2)-sin(y1)*cos(deltax))))%360 33# %300 : マイナスの場合は正の角度にする 34# 90 - : 要らないと思う なんであったんだろう??よくわからない 35# degrees : atan2の返り値はラジアンなので度になおす 36 37distance = r*acos(sin(y1)*sin(y2)+cos(y1)*cos(y2)*cos(deltax)) 38 39#地球の大きさとアークコサインで距離を出すから、単位は基準になった地球の大きさrに使ってた単位kmになる 40 41print('方位角:'+str(ans)) 42print('距離:'+str(distance)+'km') 43 44

投稿2017/08/31 17:54

oskbt

総合スコア1895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuto765

2017/09/03 13:44

oskbtさん 返信が遅くなり申し訳ございません。 夜分遅くにかかわらず素早いご回答ありがとうございました。 oskbtさんの回答のコードはシンプルでありベストアンサーで良かったのですが 今回他のシステムでの実装も考えている中で%360による負の値の直し方を 調べているときに負の数の剰余は言語によって答えが異なるということを 知りました。 そのためGazelleさんの答えをベストアンサーにさせていただきました。 しかしながら、%360でマイナスの場合は正の角度にするという考え方を 知ることができたため、大変勉強になりました! 今回は本当にご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問