任意の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 現在きちんと動いてるか心配なので、改良してきちんと使えるようになったらまた記事を書くと思う。)
------------- アルゴリズムを勉強するなら: