- 2015年7月29日
- Ruby
距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
日本(北緯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 のほうが小さくなる。
そして、上記の図から考えると、三角関数を用いて r を算出可能です。
r = R * cosθ
Ruby だと Math.cos(radian) を使えるので、35度のラジアン値 (35 * π / 180)を用いて…
1 |
r = R * Math.cos(35 * Math::PI / 180.0) |
と日本の断面での地球の半径を求めることができます!Ruby の Math モジュール便利ですね。
日本での1kmあたりの緯度の大きさ(極半径をもとに計算)
1kmあたりの緯度の大きさの計算は、極半径をそのまま使えるので計算は簡単です。
まず、地球の極半径をもとに極方向での円周を求めます。
C = 2 * π * 極半径 (m)
続いて、1km あたりの緯度を求める。
lat_degree = 360 * 1000 / C
360 に 1000 を掛けているのは 1km あたりに換算するため。
Ruby コードで計算すると以下のとおりです。
1 2 3 |
POLE_RADIUS = 6356752.314 lat_degree = ( 360 * 1000 ) / ( 2 * Math::PI * POLE_RADIUS ) # => 0.0090133729745762 |
日本における 1km あたりの緯度は、だいたい 0.0090133729745762 度であることが分かりました。例えば、現在地の緯度から 10km 南の緯度を求めるには、この値に 10 を掛けたものを現在地の緯度からマイナスすれば求まります。北ならプラスする。
日本での1kmあたりの経度の大きさ(赤道半径をもとに計算)
1kmあたりの経度の大きさの計算は、赤道半径をもとに日本の緯度での断面の半径を求める必要があります。
まず、日本の緯度での断面の半径を求める。
r = 赤道半径 * cosθ
続いて、断面の半径をもとにその円周を求めます。
C = 2 * π * r
最後に、1km あたりの経度を求める。
lng_degree = 360 * 1000 / C
Ruby コードで計算すると以下のとおりです。
1 2 3 4 |
JAPAN_LONGITUDE = 35 EQUATOR_RADIUS = 6378137 lng_degree = ( 360 * 1000 ) / ( 2 * Math::PI * ( EQUATOR_RADIUS * Math.cos(JAPAN_LONGITUDE * Math::PI / 180.0) ) ) # => 0.010966404715491394 |
日本における 1km あたりの経度は、だいたい 0.010966404715491394 度であることが分かりました。例えば、現在地の経度から 10km 西の経度を求めるには、この値に 10 を掛けたものを現在地の経度からマイナスすれば求まります。東ならプラスする。
以上で求めた 1km あたりの緯度・経度の数値を使って、特定の場所(例えばユーザーの現在地の座標)から ** キロメートル四方以内の住所をデータベースのテーブルから抽出するといったことが可能になります。
今回は、住所の情報と緯度・経度の情報をカラムとして持つデータベースから、おおかた ** Km 四方以内の住所を抽出する際に使う目的でした。このくらいのおおまかな実用目的であれば大丈夫な精度だと思います。
経度・緯度の1度あたりの距離については、検索でいくつか見つかりました。以下リンクを参照お願いします。今回の計算の目的にも大変役に立ったので感謝。
- - 参考リンク -
- なんとなく始めてみた、プログラマー雑記 – データベース内の緯度・経度を利用して半径500m以内を検索する方法
- 緯度経度1度の距離 – モノノフ日記
- Mtk’s Blog: [GPS] 経度1度の距離の求め方
- 経度1度あたりの距離の計算 – 電気ウナギ的○○
- - 関連記事 -
- Google Maps Geocoding APIで住所から緯度・経度を取得するRubyコード
- Yahoo地図API(YOLP)のジオコーダAPIで住所から緯度・経度を求めるRubyコード
- Rubyで文字列中の英数字の半角/全角を変換する
- Symbol not found: _SSLv2_client_method (LoadError) エラー
- bundle installのpgインストールでエラー
- Nokogiriインストールでlibxml2関連のエラー再発
- rbenv利用時にruby -vで古いバージョンのRubyが呼ばれる場合の対処
- 遠い世界の数式をRubyで解いてみた
- Getty Images APIでRubyを使って画像検索
- リファクタリング:Rubyエディションのカタログの読み進め方
Leave Your Message!