3歩歩くと忘れるぶろぐ

ついに大学生から社会人になってしまった、地理系・情報系大学生だった人のぶろぐ。えんじにあえんじにあ。

任意の2地点間の距離を算出する方法(緯度経度情報から)

明日はポケモンBW2が発売ですね。

 

BWはWを買ったので、W2を買う予定。

 

で、本題。

先生のお手伝いで実装させられてるのでメモ

1:30からゼミなので簡潔にまとめといて後でコードも載せてちゃんとかく

 

 =ゼミ終了=

 

ゼミ終了してから書くの忘れてポケモンしてた。反省。。。 

ということで、本題本題

 

*前提

そもそもArcGISでは空間解析できるので、その中の機能としてバッファリングが実装されてるので、それでやればいいのだけども、プログラミングや地理的なことのお勉強も兼ねて(?)

とりあえずVBAで実装する。

実装した後の検算にArcGISとかを利用することになりそう。(まだちゃんと使ったことがない)

 

 

*2地点間の距離の算出方法

任意の2地点の緯度・経度情報が取得できている場合、

ヒュベニの距離計算式というものがあって、それを使うことができる。

この式、カシミール等での距離算出にも使われているらしい。

(ソースがあやしいところだけれど、100kmほど距離がある場合で10mぐらいしか誤差がでない結構精度の高めのモノ?)

 

ヒュベニの距離計算式

http://yamadarake.jp/trdi/report000001.html

とかに書かれてはいる。

きちんと知りたい場合はもっとググるといいと思う。

 

計算式としては

 

 

'D = sqrt((m * dP) * (m * dP) + (n * Cos(P) * dR) * (n * Cos(P) * dR))

 

 

こんな感じ。各要素は以下の通り。

'D: 2点間の距離(m)

'P: 2点の平均緯度

'dP: 2点の緯度差

'dR: 2点の経度差

'M: 子午線曲率半径

'N: 卯酉線曲率半径

'M = 6334834 / sqrt((1 - 0.006674 * Sin(P) * Sin(P)) ^ 3)

'N = 6377397 / sqrt(1 - 0.006674 * Sin(P) * Sin(P))

 

**注意点 

緯度、経度はラジアン変換したものを用いる。

 

 

今回は、地域メッシュコードから緯度経度を算出するマクロをまた別に書いてて

そこで既に

地域メッシュコード

↓算出

緯度,経度(度分秒)

↓度で統一

緯度,経度(度)

まで出ていたので、これをラジアン表記に変えた。

 

ワークシート関数ではRadians(数値)でラジアンにしてくれるのだけれど、VBA関数だと無理っぽかったので

 

Const pai = 3.141592

って定義しといて

各式の最後に

/pai*180 でラジアン表記に変更

 

よくよく考えれば

Const toRadian =3.141592 / 180

としておけばよかったかもしんない。

あと定義しなくても使えるけど as [Type] で定数の型定義しといたほうがいいかもしんない。

 

VBA的には下の通りで動くはず。(ido,keidoには数値代入)

 

 

P = (ido1 + ido2) / 2 * pai / 180
dP = (ido1 - ido2) * pai / 180
dR = (keido1 - keido2) * pai / 180
M = 6334834 / Sqr((1 - 0.006674 * Sin(P) * Sin(P)) ^ 3)
N = 6377397 / Sqr(1 - 0.006674 * Sin(P) * Sin(P))

D = Sqr((M * dP) * (M * dP) + (N * Cos(P) * dR) * (N * Cos(P) * dR))
'メートルで算出されてるはず

 

はてな記法上、半角括弧二つ使えないので全角にしてある)

 

 

(2012/6/24 現在きちんと動いてるか心配なので、改良してきちんと使えるようになったらまた記事を書くと思う。)

 

 

------------- アルゴリズムを勉強するなら: