2点間の経度と緯度から方位を知りたいです。

正確なものは求めていないので以下のソースを見つけたのですが
変数Cに代入される値が-19.98や77.45となります。
これはどのような値がどの方位を示しているのでしょうか?

x1 = x1 * Math.PI / 180.0;
y1 = y1 * Math.PI / 180.0;
x2 = x2 * Math.PI / 180.0;
y2 = y2 * Math.PI / 180.0;

A = 6378137;

x = A * (x2-x1) * Math.cos( y1 );
y = A * (y2-y1);

L = Math.sqrt(x*x + y*y);
C = Math.atan(y / x) *180.0/ Math.PI;

回答の条件
  • 1人2回まで
  • 登録:2008/07/09 11:08:20
  • 終了:2008/07/10 00:23:22

ベストアンサー

id:hissssa No.3

hissssa回答回数418ベストアンサー獲得回数1232008/07/09 16:56:43

ポイント26pt

ちょっと書いてみました。

x1=x1*Math.PI/180.0;

y1=y1*Math.PI/180.0;

x2=x2*Math.PI/180.0;

y2=y2*Math.PI/180.0;

dx=x2-x1;

dy=Math.log(Math.tan(Math.PI/4+y2/2))-Math.log(Math.tan(Math.PI/4+y1/2));

C=((dy>=0) ? 1:-1)*Math.acos(dx/Math.sqrt(dx*dx+dy*dy))*180.0/Math.PI;

緯度経度をメルカトル図法上の平面座標にしてからacosで経線に対する角度にしてます。元の例と同じく真東が0で、北が+/南がーです。

-180度~+180度の範囲でCに値が得られるはずです。

id:koujirou6218

ソースを修正していただきありがとうございます。

とても助かります!

数学についての知識が乏しいので、皆さんの回答やソースがとても勉強になります。

1点質問なのですが((dy>=0) ? 1:-1)は何をしているのでしょうか?

2008/07/09 19:21:14

その他の回答(2件)

id:planckspace No.1

planckspace回答回数1ベストアンサー獲得回数02008/07/09 12:51:54

ポイント27pt

x = A * (x2-x1) * Math.cos( y1 );より

x1,x2に経度をy1,y2に緯度であり

角度Cについては軸の傾きで答えとして出ているので

0のとき西東向き (ー-> または  <-ー)

45のとき  北東か南西

90(-90)のとき  南か北方向

-45のとき 北西か南東

になります。

分度器を赤道に置いたときの方向と考えれば分かりやすいと思います。

ただしこのままだとCの値だけだと二通りの方向が考えられるので

y1,y2の二つの緯度の差がどちらが大きくなっているのかをみて方向を決定する必要があります。

id:koujirou6218

わかりやすい回答ありがとうございます。

赤道に分度器を置いて考える点と、どちらの差が大きいか調べる必要がある点について盲点だったため非常に参考になりました。

2008/07/09 17:41:16
id:hissssa No.2

hissssa回答回数418ベストアンサー獲得回数1232008/07/09 13:49:24

ポイント27pt

x1/x2が東経、y1/y2が北緯とすると、この式だと(x1,y1)を基点として、(x2,y2)が真東の場合が0度ですね。そこを基点に、北方向が+、南方向が-になります。

ただ、これだとx1<x2でないと正確な値が出ないと思います。x1=x2だとゼロ除算例外になりますし、x1>x2だと±反転した値になると思いますよ。

id:koujirou6218

わかりやすい回答ありがとうございます。

とても参考になりました。

2008/07/09 17:41:54
id:hissssa No.3

hissssa回答回数418ベストアンサー獲得回数1232008/07/09 16:56:43ここでベストアンサー

ポイント26pt

ちょっと書いてみました。

x1=x1*Math.PI/180.0;

y1=y1*Math.PI/180.0;

x2=x2*Math.PI/180.0;

y2=y2*Math.PI/180.0;

dx=x2-x1;

dy=Math.log(Math.tan(Math.PI/4+y2/2))-Math.log(Math.tan(Math.PI/4+y1/2));

C=((dy>=0) ? 1:-1)*Math.acos(dx/Math.sqrt(dx*dx+dy*dy))*180.0/Math.PI;

緯度経度をメルカトル図法上の平面座標にしてからacosで経線に対する角度にしてます。元の例と同じく真東が0で、北が+/南がーです。

-180度~+180度の範囲でCに値が得られるはずです。

id:koujirou6218

ソースを修正していただきありがとうございます。

とても助かります!

数学についての知識が乏しいので、皆さんの回答やソースがとても勉強になります。

1点質問なのですが((dy>=0) ? 1:-1)は何をしているのでしょうか?

2008/07/09 19:21:14
  • id:hujikojp
    老婆心ですが、大圏コースとかのことは考えなくていいんですかね。
    例えば、東京から見てNewYorkはかなり北向きにあると考えられます。遠くない二点間なら、例示された式でごまかせますが、離れているとそこらへんを真面目に考えないと意味のある答えは出せません。
  • id:koujirou6218
    >>hujikojpさん
    問題点の指摘ありがとうございます。
    利用範囲は現在、日本をのみとしています。
    将来的には精度を高めていこうと思っていますので参考にさせていただきます。
  • id:hissssa
    >1点質問なのですが((dy>=0) ? 1:-1)は何をしているのでしょうか?

    acosで角度を求めた場合は結果が常に正の値となり、北側と南側で同じ値になります。真東を中心として、北に30度の場合と南に30度の場合で同じ「+30度」が返ってしまうわけです。
    そこでこの補正を入れています。角度が北向きか南向きかは、緯度方向の差分であるdyがプラスかマイナスかで判定できますので、dy>=0なら1を、dy<0なら-1を全体に掛け算しているわけです。
    C・C++やJavaの構文では、”( (判定式) ? A:B )”という記述をすると、(判定式)が成立する場合はAを、しない場合はBを値として使うという記述ができます。これを利用して、acos関数の結果値を、dyがマイナスの場合にのみマイナス値になるようにしているわけです。
    まぁ単に1行で書けるからこうしただけで、単にCを計算した後で「 if ( dy<0 ) C=-C; 」ともう一行書いても同じことです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません