緯度経度より距離を求める方法・備忘録 | 地球は丸い!

投稿者: | カテゴリ FLASH, PHP, Tips | 2009 年 5 月 15 日

今回の春場所サイト「マチコ」携帯サービスにおいて、
携帯GPSで取得した緯度経度を使って
2人の距離を算出する計算を行っています。

でも、緯度経度から距離を算出するってよく分からなかったのでいろいろ調べてたところ、

轍 〜自転車的なる日記〜 緯度・経度から距離を求める方法

なるサイト様の情報が簡易でかつ実用的っぽいので
この式で計算してみることにしました。

ただ、自分的にちょっと理解が追いつかなかったので
備忘録として行程を一個いっこ追いながら、phpおよびas3にまで落とし込むまでを記しておきます。

※取得した緯度経度が「度分秒の60進法」の場合、「10進法」にあらかじめ直してください。直し方は以下リンク参照
 経度・緯度を60進法から10進法へ変換 – F.Ko-Jiの「一秒後は未来」

では始めます。

idokeido01

A点、大阪(緯度 = aIdoとします:34.701909, 経度 = aKeidoとします:135.494977)と
B点、東京(緯度 = bIdoとします:35.681382, 経度 = bKeidoとします:139.766084)の
2点間の距離(dとします・単位km)を求めます。

距離を求める場合は、東京と大阪を結ぶ線を引いて、その線の長さが分かればよいのです

その線の長さを求めるために、
大阪と東京の東西の距離差と南北の距離差が分かれば
ピタゴラスの定理
xの2乗 + yの2乗 = 求める距離の2乗
により距離が計算できます!

ではどうやって東西の距離(touzaiKyoriとします)、南北の距離(nanbokuKyoriとします)を求めればよいのか。

その前に緯度経度って概念がごっちゃになりやすいので簡単に緯度経度についてのおさらいです。

●緯度(横ライン)
赤道が緯度0度、北極が90度、南極が-90度とする
「地球の中心(核)」を起点とした角度。
世界地図(メルカトル図法時)では水平方向に線が引かれます。
当然、赤道で一番円周が大きくなり(つまり地球の直径)
赤道から距離が離れるたびに緯度ラインの直径は小さくなっていきます。

●経度(縦ライン)
ロンドンのグリニッジ天文台を通る大円が経度0度
(大円:ある地点と北極と南極を通る大きな円)
「地球の地軸」を起点とした角度
世界地図(メルカトル図法時)では垂直方向に線が引かれます。
円周は常に同じです(常に地球の直径)。

ポイント
・緯度は場所によって円周の長さ、半径が違う!※経度は常に円周の長さ常には同じ。
・緯度経度は座標のxyだと思うとこんがらがるので、あくまで地球の基準点からの角度と考える!

地球は丸いので東京と大阪の東西の距離、南北の距離は
地球の円周上にそっています。
よって円弧の長さを求めることになります。

●円弧の長さの求め方
小学校で習った式は
円弧の長さ =直径×π×円弧の角度/360
だったと思いますが、もっと簡単にする方法があります。
ラジアンという角度の単位を使う方法です。
円弧の長さ = 半径×円弧の角度をラジアンに変換した値

一般的な角度をラジアンという角度に変換するには
1度 = π / 180 = 約0.017ラジアン
1ラジアン = 180 / π = 約52.3度
で計算すればよいです。
※phpならわざわざ計算しなくても角度をラジアンに変換する関数があります。

ちなみにラジアンとは:
・角度の単位。
・1ラジアン (約57度)のとき半径と弧の長さが等しい。
・360度 = 2πラジアン
・弧の長さを計算するのにめっちゃ分かりやすい。

では東西の距離(touzaiKyori)、南北の距離(nanbokuKyori)を求めてみます。
計算には円弧の角度の他に地球の半径が必要となるのでwikipediaで地球の半径を調べてみました。
●地球の半径(earth_rとします ):約6378.137km

●で、緯度経度にそった円弧の角度
大阪東京の緯度の差(idoSaとします): bIdo – aIdo
大阪東京の経度の差(keidoSaとします): bKeido – aKeido

この緯度の角度差、経度の角度差をラジアンに変換した値と地球の半径を利用して
円弧の長さを求めます。

idokeido02

ただし、南北の距離を計算するための半径は、すなわち地球の半径ですが、
東西方向の距離を計算するための半径は、測定値の緯度により、異なります。
(日本は赤道ラインよりずいぶん上に位置していますので
その緯度の半径は赤道の半径より当然小さくなります)

idokeido03

測定位置の緯度ラインの半径は三角関数の計算により求められます。
直角三角形は角度が一定であれば3辺の長さの比も一定という性質を利用します。

コサインθとは比率に基づく値にすぎません。
三角形の角度がθ(ここではすなわちaIdo)度のときの
底辺(ここでいう測定地の緯度の半径) ÷ 斜辺(ここでいう地球の中心から測定値の距離) の値のことです。
斜辺(地球の中心から測定値の距離) = 地球の半径(earth_r)なので
底辺(測定地の緯度の半径)= cosθ × earth_r
となります。
※phpやactionscriptだとコサインを計算してくれる関数があります。
ただし求めたい角度θの単位を一度ラジアンに変換する必要があります

これで式が揃いました。

東西の距離(touzaiKyori)= 測定値(大阪)の緯度の半径 × 大阪東京の緯度の差(idoSa)
= コサインaIdo × 地球の半径(earth_r)× 大阪東京の緯度の差(idoSa)

南北の距離(nanbokuKyori)= 地球の半径(earth_r) × 大阪東京の経度の差(keidoSa)

この二つが求まれば
xの2乗 + yの2乗 = 求める距離の2乗
となり、その平方根をもとめることで距離dが求まります

よってPHPで書くと以下の通り

<?php
$aIdo = 34.701909;					//  A点(大阪)の緯度
$aKeido = 135.4949770;		 //  A点(大阪)の経度

$bIdo = 35.681382;				//  B点(東京)の緯度
$bKeido = 139.766084;		//  B点(東京)の経度

$earth_r = 6378.137;		//	地球の半径

$idoSa = deg2rad($bIdo - $aIdo);	//緯度差をラジアンに
$keidoSa = deg2rad($bKeido - $aKeido);	//経度差をラジアンに

$nanbokuKyori =  $earth_r * $idoSa;		//南北の距離
$touzaiKyori = cos(deg2rad($aIdo)) * $earth_r * $keidoSa;		//東西の距離

$d = sqrt(pow($touzaiKyori,2) + pow( $nanbokuKyori,2));			//三平方の定理でdを求める
?>

またactionscript3.0で書くと

var aIdo:Number = 34.701909; // A点(大阪)の緯度
var aKeido:Number = 135.4949770; // A点(大阪)の経度

var bIdo:Number = 35.681382; // B点(東京)の緯度
var bKeido:Number = 139.766084; // B点(東京)の経度

const earth_r:Number = 6378.137; // 地球の半径

var idoSa:Number = Math.PI / 180 * (bIdo – aIdo); //緯度差をラジアンに
var keidoSa:Number = Math.PI / 180 * (bKeido – aKeido); //経度差をラジアンに

var nanbokuKyori:Number = earth_r * idoSa; //南北の距離
var touzaiKyori:Number = Math.cos( Math.PI / 180 * aIdo) * earth_r * keidoSa; //東西の距離

var d:Number = Math.sqrt(Math.pow(touzaiKyori,2) + Math.pow(nanbokuKyori,2)); //三平方の定理でdを求める

となります。
ちなみに求められる値dは405.807810663 kmとなります。
検証のために以下のサイトで大阪駅東京駅間を測ってみましたが、ほぼほぼ同じ値でした。
LatLng2Distance:::緯度経度から距離算出API:

関連記事

    これに関係する記事はござーせん

Comments (7)

  1. キタ━━━━━━(゚∀゚)━━━━━━ !!
    復活!トンカツ先生の算数授業!!

    唯一「マチコ」を作りながら、自分で理解できてなかった距離計算の箇所が理解できました!!

    図解だいぶわかりやすいです!!
    東西の距離のときに半径が変化するところの理解がふわっとしてたのが、ハッキリとこの図でわかりましたよ~(^^)

    トンカみたいに熱心にやってくれる人がいて本当にありがたいですわ!
    GPS系はこの計算式でこれからもやっていけそうやね!

    今度は「地球は完全な球体ではなかった!」版の計算方式楽しみにしてますわ!

    この記事2時間ぐらい見てた(T_T)

  2. 完全にトンカ先生による授業ですね!
    詳細説明ありがとうございます!

    メルカトル図法とかひさびさに聞きました!
    「緯度は場所によって円周の長さ、半径が違う!」はやっぱポイントですね~読んだけどほぼ理解できてませんw

    しかし距離を測る際は参考にさせてもらいます!

  3. 数学・物理おもしろい

  4. 次はモルワイデ図法でw
    っーか、完全なるMathの世界ですなー。
    使いどころとしては・・・やっぱりGPS連動のなにかですよね。あとはアイディア次第か・・・
    おもろいの頼みますぜ!!!

  5. [...] 第一位 緯度経度より距離を求める方法・備忘録 | 地球は丸い! by とんか [...]

  6. [...] 空間を分割して効率よく衝突判定をしようっていう。 » 緯度経度より距離を求める方法・備忘録 | 地球は丸い! | キテレツ荘 緯度経度から実際の距離を計算する方法。 デザインパターン | [...]

Post a comment

コメントリンクを nofollow free に設定することも出来ます。