2地点の緯度経度から距離を求める(global化 1/2)

以前の記事でmy-hobby : GoogleAPI~2つの住所から距離を求める~を紹介しましたが、
こちらの内容はあくまで日本国内に限った場合の方法でした。
先日メンバーのもじゃもじゃさんから、iPhoneのGPS機能を使ったアプリを作っているので、記事で掲載した内容を使いたいという話がありました。
自分の記事の内容を実際に使ってもらえるのはうれしい事なのですが、今の機能(日本国内限定)で使ってもらうのはちょっと失礼なので、思い切って全世界どこででも使えるようにしようと思います!

そもそも、なぜ日本国内限定にしているかと言うと、以前の記事で紹介した計算式は東経0~180度、北緯0~90度までの範囲でしか計算できない為、日本国内限定としていました。
※GoogleMAPS APIが返す座標(緯度経度)は以下の様な値となっています。
東経0~180度:0~180
西経0~180度:0~-180
北緯0~90度:0~90
南緯0~90度:0~-90
世界地図で表すと、以下の様な感じです。
【図1】

地図から緯度経度を調べるにて、各地点のGoogleMAPS APIが返す座標(緯度経度)の結果を確認できます

東経0~180度、北緯0~90度以外は座標が-(マイナス)を返すので、差を使った計算が出来ないという理由がありました。
緯度・経度の差より距離を求めているので、マイナスを返す場合、単純に差を求めると、結果が意図したものと異なる場合があります。
※前回までの計算式

IdoWK = Abs(txt_Ido.Text – txt_Ido2.Text) * 111
KeidoWK = Abs(txt_Keido.Text – txt_Keido2.Text) * Cos(Math.PI / 180 * CosIdoWK) * 111
KyoriWK = (IdoWK ^ 2 + KeidoWK ^ 2) ^ (1 / 2)

今回は上記内容を考慮してどの経度、緯度でも計算可能な式に変更したいと思います。
GoogleMAPS APIが返す座標の場合、緯度差、経度差を計算する際に-(マイナス)が邪魔になるので、これをどの位置でも0以上になるように原点(0,0)の位置を移動させます。
移動させた結果は以下の様な感じです。
【図2】

※x(経度)を180、y(緯度)を90足した(補正した)状態としました。

これでヨシ!と思いきや、この方法には大きな落とし穴がありました。

以下の図3の左のケースの様な場合に、上記の方法で2地点の距離を求めようとすると、最適な結果が得られなくなります。
【図3】

図2で示した座標で計算を行なうと、図3の左側の図の様な結果が2地点の距離になりますが、実は右側の図の方が距離が近いのです。
2地点の距離を求めると言っても、遠い距離を返してしまっては意味がありません。
地球の様に円い3次元の物体の表面を移動する場合には、単純に2地点を直線で結んだだけでは、最短距離を求める事が出来ないと言う事です。

かといって、3次元の世界で新たに計算式を作るのも面倒なので、2次元の世界で前回作った計算式を応用して最短距離を求める方法を考えたいと思います。
この問題の解決する為、少ない知恵を絞って考えた方法を次回紹介します。

カテゴリー: flashcast, 緯度経度検索 パーマリンク

2地点の緯度経度から距離を求める(global化 1/2) への1件のフィードバック

  1. ピンバック: my-hobby : 2地点の緯度経度から距離を求める(global化 2/2)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です