https://gkukan.jp オープンデータを活用して、地理情報システム(GIS)についてわかりやすく解説するサイトです。初心者から上級者まで、GISの活用方法や便利なツールを学べる情報を提供します。地域情報の可視化や地図データの使い方について知識を深めたい方におすすめです。

緯度経度からの距離計算の方法:ハバーサイン、球面三角法、デカルト座標

緯度経度からの距離計算の方法:ハバーサイン、球面三角法、デカルト座標

緯度経度からの距離計算の方法:ハバーサイン、球面三角法、デカルト座標


緯度経度を用いて2点間の距離を計算する際、どのような方法を使うのが最適なのでしょうか?
この記事では、ハバーサイン公式球面三角法デカルト座標
の3つの方法について、それぞれの特徴、長所・短所、精度の違いを解説し、Pythonコードで実際に東京駅と大阪駅の距離を計算して比較してみます。

1. ハバーサイン公式(Haversine Formula)


特徴


ハバーサイン公式は、地球の表面を球体と仮定し、緯度と経度を使用して大円距離(地球表面に沿った最短距離)を計算する方法です。航空機の飛行距離やGPSでよく使用される計算方法です。

長所



  • 地球の曲率を考慮し、緯度と経度から直接計算できる。

  • 比較的簡単な計算式で、実用的な精度を持つ。


短所



  • 地球を完全な球体と仮定しているため、厳密には誤差が含まれる。

  • 非常に高精度を求める場合には楕円体モデルが必要。


精度


地球を球体としているため、10 km単位での距離精度が求められる用途に十分対応可能です。

2. 球面三角法(Spherical Law of Cosines)


特徴


球面三角法も地球を球体と仮定し、緯度と経度を使って距離を求める方法です。ハバーサインと似ていますが、三角関数を用いた異なるアプローチです。

長所



  • ハバーサインと同様に、緯度と経度から直接計算でき、簡単な数式で距離を求められる。

  • 精度はハバーサインとほぼ同じ。


短所



  • 極端に近い地点間(距離が非常に短い場合)や180度近い経度差の場合、精度が劣ることがある。


精度


ハバーサインと同様、実用的な精度を持ち、短距離や中距離であればほぼ問題なく使用できる。

3. デカルト座標法(Cartesian Coordinates)


特徴


デカルト座標法では、緯度経度を3次元空間の直角座標に変換し、そのユークリッド距離(直線距離)を計算します。地球の楕円体モデル(WGS84)を用いて、より正確な座標変換が可能です。

長所



  • 地球が完全な楕円体であることを考慮できるため、非常に高い精度が得られる。

  • 標高(高度)情報を加えることで、さらに正確な結果を得られる。


短所



  • 計算が複雑で、プログラム実装に手間がかかる。

  • 標高データがないと、精度が若干落ちる。


精度


楕円体モデルを使用することで、非常に高精度な距離計算が可能。数百メートル単位の精度が求められる用途に対応できる。

注釈


楕円体モデルに基づくデカルト座標法は地球全体で高精度な距離計算が可能ですが、特定の地域(たとえば日本国内)においては、平面直角座標系(JGD2000、JGD2011など)を使用することで、さらに高い精度が得られます。これらの座標系は地域ごとの楕円体モデルをもとに平面化されており、その範囲内での測定精度を最適化しています。そのため、限定された空間や日本国内の距離計算においては、これらの座標系を利用する方がより精密です。

Pythonコードと実例:東京駅と大阪駅の距離


東京駅と大阪駅の緯度経度



  • 東京駅: 緯度: 35.681236, 経度: 139.767125

  • 大阪駅: 緯度: 34.702485, 経度: 135.495951


1. ハバーサイン公式での距離計算


import math

def haversine_distance(lat1, lon1, lat2, lon2):
R = 6371000.0 # 地球の平均半径(メートル)
lat1_rad, lon1_rad = math.radians(lat1), math.radians(lon1)
lat2_rad, lon2_rad = math.radians(lat2), math.radians(lon2)
delta_lat = lat2_rad - lat1_rad
delta_lon = lon2_rad - lon1_rad

a = (math.sin(delta_lat / 2) ** 2 +
math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(delta_lon / 2) ** 2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
return R * c

distance_haversine = haversine_distance(35.681236, 139.767125, 34.702485, 135.495951)
print(f"ハバーサインによる距離: {distance_haversine / 1000:.2f} km")

2. 球面三角法での距離計算


import math

def spherical_law_of_cosines(lat1, lon1, lat2, lon2):
R = 6371000.0 # 地球の平均半径(メートル)
lat1_rad, lon1_rad = math.radians(lat1), math.radians(lon1)
lat2_rad, lon2_rad = math.radians(lat2), math.radians(lon2)
return R * math.acos(math.sin(lat1_rad) * math.sin(lat2_rad) +
math.cos(lat1_rad) * math.cos(lat2_rad) * math.cos(lon2_rad - lon1_rad))

distance_spherical = spherical_law_of_cosines(35.681236, 139.767125, 34.702485, 135.495951)
print(f"球面三角法による距離: {distance_spherical / 1000:.2f} km")

3. デカルト座標法での距離計算


def lat_lon_to_xyz(lat, lon, h=0):
a = 6378137.0 # 地球の長半径(メートル)
f = 1 / 298.257223563 # 扁平率
e2 = 2 * f - f ** 2 # 離心率の二乗
lat_rad = math.radians(lat)
lon_rad = math.radians(lon)
N = a / math.sqrt(1 - e2 * (math.sin(lat_rad) ** 2))
x = (N + h) * math.cos(lat_rad) * math.cos(lon_rad)
y = (N + h) * math.cos(lat_rad) * math.sin(lon_rad)
z = (N * (1 - e2) + h) * math.sin(lat_rad)
return x, y, z

tokyo_xyz = lat_lon_to_xyz(35.681236, 139.767125)
osaka_xyz = lat_lon_to_xyz(34.702485, 135.495951)

distance_cartesian = math.sqrt((tokyo_xyz[0] - osaka_xyz[0]) ** 2 +
(tokyo_xyz[1] - osaka_xyz[1]) ** 2 +
(tokyo_xyz[2] - osaka_xyz[2]) ** 2)

print(f"デカルト座標法による距離: {distance_cartesian / 1000:.2f} km")

結果と考察


以下は東京駅と大阪駅の距離を3つの方法で計算した結果です:

  • ハバーサイン公式: 約 403.06 km

  • 球面三角法: 約 403.06 km

  • デカルト座標法: 約 403.76 km


ハバーサインと球面三角法は、地球を球体としているため結果が一致していますが、デカルト座標法では楕円体モデルを使用するため若干距離が異なります。この結果から、短距離や中距離ではハバーサインや球面三角法が実用的で簡便である一方、楕円体モデルに基づくデカルト座標法はより高精度です。

注釈


楕円体モデルに基づくデカルト座標法は地球全体で高精度な距離計算が可能ですが、特定の地域(たとえば日本国内)においては、平面直角座標系(JGD2000、JGD2011など)を使用することで、さらに高い精度が得られます。これらの座標系は地域ごとの楕円体モデルをもとに平面化されており、その範囲内での測定精度を最適化しています。そのため、限定された空間や日本国内の距離計算においては、これらの座標系を利用する方がより精密です。

#距離計算, #ハバーサイン, #球面三角法, #デカルト座標, #緯度経度, #Pythonプログラミング, #地理情報, #GPS, #JGD2000, #JGD2011, #地球楕円体, #プログラム初心者, #地理学, #測量, #距離測定

同じカテゴリー(オープンデータ)の記事
今日は冬至です
今日は冬至です(2024-12-21 05:06)

コメント

名前
上の画像に書かれている文字を入力して下さい
削除
緯度経度からの距離計算の方法:ハバーサイン、球面三角法、デカルト座標
    コメント(0)