距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)

スポンサーリンク
【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました

日本(北緯35度の地点)において、距離1キロメートルが緯度・経度の度数に換算するとどの程度になるかを計算しました。精密な計算ではありませんが、三角関数を使うことで実用に使える程度の精度で計算することができます。日本限定ではありますけど。実際の計算は Ruby の Math モジュールを用いて行いました。

スポンサーリンク

日本の緯度・地球の半径(赤道半径/極半径)など

まず前提として、以下の数値を元に計算を行います。

日本の緯度: 北緯35度
地球の赤道半径: 6378137 m (6378.137 km)
地球の極半径:  6356752.314 m (6356.752314 km)

地球の半径の情報については、地球 – Wikipedia などいくつか情報を当たりました。赤道半径と極半径は微妙に異なっており、地球は精密には楕円球になってるようです。

緯度が大きくなるほど、経度1度あたりの距離が短くなる

赤道での赤道半径は、上述の通り 6378.137 km ですが、日本(北緯35度)の地点で赤道と水平な断面を取りますと、その半径は赤道半径より小さくなります。そして、その断面での円周は赤道での円周よりも小さくなり、緯度が大きくなるほど、経度1度あたりの距離が赤道のものよりも小さくなります。

言葉で説明は難しいので、以下の図を見るとちょっと分かりやすいかと思います。赤道の半径 R より日本(北緯35度)の地点での断面の半径 r のほうが小さくなる。

latitude_longitude

そして、上記の図から考えると、三角関数を用いて r を算出可能です。

r = R * cosθ

Ruby だと Math.cos(radian) を使えるので、35度のラジアン値 (35 * π / 180)を用いて…

と日本の断面での地球の半径を求めることができます!Ruby の Math モジュール便利ですね。

日本での1kmあたりの緯度の大きさ(極半径をもとに計算)

1kmあたりの緯度の大きさの計算は、極半径をそのまま使えるので計算は簡単です。

まず、地球の極半径をもとに極方向での円周を求めます。

C = 2 * π * 極半径 (m)

続いて、1km あたりの緯度を求める。

lat_degree = 360 * 1000 / C

360 に 1000 を掛けているのは 1km あたりに換算するため。

Ruby コードで計算すると以下のとおりです。

日本における 1km あたりの緯度は、だいたい 0.0090133729745762 度であることが分かりました。例えば、現在地の緯度から 10km 南の緯度を求めるには、この値に 10 を掛けたものを現在地の緯度からマイナスすれば求まります。北ならプラスする。

日本での1kmあたりの経度の大きさ(赤道半径をもとに計算)

1kmあたりの経度の大きさの計算は、赤道半径をもとに日本の緯度での断面の半径を求める必要があります。

まず、日本の緯度での断面の半径を求める。

r = 赤道半径 * cosθ

続いて、断面の半径をもとにその円周を求めます。

C = 2 * π * r

最後に、1km あたりの経度を求める。

lng_degree = 360 * 1000 / C

Ruby コードで計算すると以下のとおりです。

日本における 1km あたりの経度は、だいたい 0.010966404715491394 度であることが分かりました。例えば、現在地の経度から 10km 西の経度を求めるには、この値に 10 を掛けたものを現在地の経度からマイナスすれば求まります。東ならプラスする。

以上で求めた 1km あたりの緯度・経度の数値を使って、特定の場所(例えばユーザーの現在地の座標)から ** キロメートル四方以内の住所をデータベースのテーブルから抽出するといったことが可能になります。

今回は、住所の情報と緯度・経度の情報をカラムとして持つデータベースから、おおかた ** Km 四方以内の住所を抽出する際に使う目的でした。このくらいのおおまかな実用目的であれば大丈夫な精度だと思います。

経度・緯度の1度あたりの距離については、検索でいくつか見つかりました。以下リンクを参照お願いします。今回の計算の目的にも大変役に立ったので感謝。

スポンサーリンク
私は以下の本で Ruby を覚えました。メタプログラミングRubyは入門を超える内容で難しめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!