2地点の緯度・経度を入力すると、地球表面に沿った2地点間の距離をkmとマイルで計算します。入力形式は10進形式と度分秒(DMS)形式を切り替えられます。
このページでできること
- 2地点の緯度・経度を入れるだけで、地球の表面に沿った2地点間の距離(km・マイル)がその場でわかります
- 入力は10進形式(例:35.6895)と度分秒(DMS)形式(例:35°41′22.2″)の両対応。ラジオボタンで切り替えられます
- 地球を回転楕円体(少しつぶれた球)として近似するランベルト(Lambert)の方法で計算します。地球を完全な球とみなすハーバーサインの公式より実際の地球に近い、高精度な近似です
- 式のやさしい解説・Excel/Googleスプレッドシート/Python用のコピペ数式・計算ドリル(演習問題)もこのページにまとまっています
この計算は何の役に立つ?
飛行機は地球の丸みに沿った最短コース(大圏コース)に近いルートを飛ぶため、都市間の飛行距離はこのページのような「地球の表面に沿った距離」で見積もられます(東京–ロンドンは約9,600km = 約6,000マイル)。マイレージの区間距離も、この考え方の距離が基になっています。
「地図の上では遠回りに見えるのに、なぜ北極近くを飛ぶのか」も、この距離を計算すると納得できます。
地図アプリや配達アプリの「現在地から近い順」は、現在地とお店の緯度・経度から2地点間の距離を計算して並べ替えています。プログラムの世界では、球面近似のハーバーサインの公式がこの用途の定番で、より高い精度が必要な場面ではこのページのランベルトの方法のような楕円体の式が使われます。
毎日使うアプリの裏側で、まさにこの式が大量に計算されています。
GPSウォッチやランニングアプリの走行距離は、数秒ごとに記録した測位点の間の距離をこの種の式で計算し、足し合わせて求めています。1区間ずつは数十mでも、緯度経度→距離の変換を何千回もくり返して「今日は10.2km走った」が表示されています。
船の世界では距離を海里(1海里 = 1.852km。ほぼ緯度1分の長さ)で測り、出発港から目的港までの航程を地球の丸みに沿った距離で計画します。到着日時や燃料の見積もりは、この距離計算が出発点です。
世界の貿易貨物の多くを運ぶ海運を、緯度経度の距離計算が支えています。
地震のニュースで見る「震央から◯kmの地点で震度5強」のような表現は、震央(震源の真上の地点)の緯度・経度と各観測点の緯度・経度から、このページと同じ考え方で距離を計算したものです。
自宅と活断層・震央との距離感を数字でつかんでおくことは、防災の備えの第一歩になります。
式
用語・記号の解説
記号
| \(\varphi\) | ファイ | 緯度。赤道を0°として南北方向にどれだけ離れているかを表す角度です。北緯がプラス、南緯がマイナス(−90°〜90°)。 |
| \(\lambda\) | ラムダ | 経度。イギリスの旧グリニッジ天文台を通る本初子午線を0°として東西方向の位置を表す角度です。東経がプラス、西経がマイナス(−180°〜180°)。 |
| \(f\) | エフ | 地球の扁平率。回転楕円体がどれだけつぶれているかの割合で、この計算では \(f = \dfrac{1}{298.257}\) を使います。 |
| \(U\) | ユー | 更成緯度。楕円体上の緯度を、球の式で扱えるように \(U = \arctan((1-f)\tan\varphi)\) で換算し直した緯度です。 |
| \(c\) | シー | 中心角。地球の中心から2地点を見たときの開き角(ラジアン)です。「弧の長さ=半径×中心角」で距離の土台になります。 |
| \(X\), \(Y\) | エックス、ワイ | 楕円体のつぶれの分を補正するための中間量。中心角 \(c\) と、更成緯度の平均 \(P = \dfrac{U_1+U_2}{2}\)・半差 \(Q = \dfrac{U_2-U_1}{2}\) から計算します。 |
| \(d\) | ディー | 2地点間の距離。distance(距離)の頭文字です。このページではkm(キロメートル)とマイルで表示します。 |
| ° ′ ″ | ど、ふん、びょう | 角度の度・分・秒の記号。1° = 60′、1′ = 60″ です。例:35°41′22.2″(35度41分22.2秒)。 |
用語
| 緯度 | いど | 赤道を0度として、南北方向の位置を表す角度。北極が北緯90度、南極が南緯90度です。地図や位置情報の基本で、小学校の社会科・中学の地理で学びます。 |
| 経度 | けいど | 本初子午線(イギリスのグリニッジを通る線)を0度として、東西方向の位置を表す角度。東経・西経それぞれ180度まであり、日本は東経135度付近です。 |
| 度分秒 | どふんびょう | 角度を度・分・秒の60進法で表す書き方(DMS形式)。1度=60分、1分=60秒です。国土地理院の地図やGPS機器でよく使われます。 |
| 回転楕円体 | かいてんだえんたい | 楕円を軸の周りに回転させてできる立体。地球は自転の遠心力で赤道方向に膨らんでいるため、球ではなく回転楕円体で近似します。 |
| 扁平率 | へんぺいりつ | 回転楕円体のつぶれ具合を表す割合。(赤道半径−極半径)÷赤道半径で定義され、地球では約300分の1です。 |
| 更成緯度 | こうせいいど | 楕円体上の点を、その楕円のもとになる補助円(球)の上に写し直したときの緯度。\(U = \arctan((1-f)\tan\varphi)\) で換算でき、測地学(地球の形を測る学問)で使われます。「化成緯度(かせいいど)」「パラメトリック緯度」とも呼ばれます。 |
| 中心角 | ちゅうしんかく | 円や球の中心から2点を見たときの開き角。おうぎ形の「弧の長さ=半径×中心角(ラジアン)」の関係が、このページの距離計算の土台です。 |
| 測地線 | そくちせん | 曲面の上の2点を結ぶ最短の経路。地球の表面では「大圏コース」とも呼ばれ、飛行機の航路がこれに近い形になります。このページで求めるのは測地線に沿ったおよその長さです。 |
| ハーバーサインの公式 | ハーバーサインのこうしき | 地球を完全な球とみなして2地点間の距離を求める有名な公式。このページのランベルトの方法は、その改良版(楕円体対応版)にあたり、式1の中心角の計算にハーバーサイン形の式を使っています。 |
| ランベルトの方法 | ランベルトのほうほう | 地球を回転楕円体として近似して2地点間の距離を求める方法(Lambert's formula)。数千kmの距離でも誤差はおよそ10m程度とされ、球面近似より高精度です。 |
| マイル | マイル | 主にアメリカ・イギリスで使われる距離の単位(法定マイル)。1マイル = 約1.609km(国際的な定義では1.609344km)で、この計算機では 1マイル = 1.60935km として換算しています。次の「海里」とは別の単位です。 |
| 海里 | かいり | 船や航空の世界で使われる距離の単位(ノーティカルマイル)。1海里 = 1.852km で、地球の緯度1分(1度の60分の1)の長さにほぼ等しくなるように決められました。 |
前提として理解しておくといいこと
このページの計算を「意味がわかって」使えるようになるために、前提として理解しておくといいことをまとめました。
距離を求めるだけなら緯度・経度の読み方がわかれば十分です。式の中身まで理解したい場合は、三角比・ラジアンまでさかのぼります。
| 緯度・経度(小学5年 社会/中学1年 地理) |
|
| 角度と60進法(小学4〜5年 角度・時間) |
|
| おうぎ形の弧の長さ(中学1年) |
|
| 三角比 sin・cos・tan(高校 数学I) |
|
| ラジアン(高校 数学II) |
|
| 地球の形(中学 理科/高校 地学基礎) |
|
Excelで計算する方法
| 度 | 38 |
| 分 | 53 |
| 秒 | 51.36 |
| 10進形式の角度(南緯・西経は−を付ける) | =B1+B2/60+B3/3600 |
| 点1の緯度(10進。南緯は−) | 35.6895 |
| 点1の経度(10進。西経は−) | 139.6917 |
| 点2の緯度 | 34.6937 |
| 点2の経度 | 135.5023 |
| 扁平率 f | =1/298.257 |
| 更成緯度 U1 | =ATAN((1-B5)*TAN(RADIANS(B1))) |
| 更成緯度 U2 | =ATAN((1-B5)*TAN(RADIANS(B3))) |
| 経度差 Δλ(ラジアン) | =RADIANS(B4-B2) |
| ハーバーサイン形の中身 a | =SIN((B7-B6)/2)^2+COS(B6)*COS(B7)*SIN(B8/2)^2 |
| 中心角 c(ラジアン) | =2*ATAN2(SQRT(1-B9),SQRT(B9)) |
| 平均 P | =(B6+B7)/2 |
| 半差 Q | =(B7-B6)/2 |
| 補正の中間量 X | =(B10-SIN(B10))*SIN(B11)^2*COS(B12)^2/COS(B10/2)^2 |
| 補正の中間量 Y | =(B10+SIN(B10))*SIN(B12)^2*COS(B11)^2/SIN(B10/2)^2 |
| 距離(km) | =6378.1*(B10-B5*(B13+B14)/2) |
| 距離(マイル) | =B15/1.60935 |
2つ目の表はランベルトの方法の全手順です。B1〜B4が入力欄(10進形式)で、B6以降が式1・式2の中間量、B15が距離(km)=約397.18、B16がマイル=約246.80になります(このページの計算機は表示を397.2kmに丸めています)。
「RADIANS(…)」は度→ラジアンの換算、「ATAN2(x, y)」はExcelでは引数が(x座標, y座標)の順なので、c = 2×ATAN2(√(1−a), √a) と書く点に注意してください。
Googleスプレッドシートで計算する方法
| 度 | 38 |
| 分 | 53 |
| 秒 | 51.36 |
| 10進形式の角度(南緯・西経は−を付ける) | =B1+B2/60+B3/3600 |
| 点1の緯度(10進。南緯は−) | 35.6895 |
| 点1の経度(10進。西経は−) | 139.6917 |
| 点2の緯度 | 34.6937 |
| 点2の経度 | 135.5023 |
| 扁平率 f | =1/298.257 |
| 更成緯度 U1 | =ATAN((1-B5)*TAN(RADIANS(B1))) |
| 更成緯度 U2 | =ATAN((1-B5)*TAN(RADIANS(B3))) |
| 経度差 Δλ(ラジアン) | =RADIANS(B4-B2) |
| ハーバーサイン形の中身 a | =SIN((B7-B6)/2)^2+COS(B6)*COS(B7)*SIN(B8/2)^2 |
| 中心角 c(ラジアン) | =2*ATAN2(SQRT(1-B9),SQRT(B9)) |
| 平均 P | =(B6+B7)/2 |
| 半差 Q | =(B7-B6)/2 |
| 補正の中間量 X | =(B10-SIN(B10))*SIN(B11)^2*COS(B12)^2/COS(B10/2)^2 |
| 補正の中間量 Y | =(B10+SIN(B10))*SIN(B12)^2*COS(B11)^2/SIN(B10/2)^2 |
| 距離(km) | =6378.1*(B10-B5*(B13+B14)/2) |
| 距離(マイル) | =B15/1.60935 |
Pythonで計算する方法
import math
# 2地点の緯度・経度(10進形式。南緯・西経はマイナス)
lat1, lon1 = 35.6895, 139.6917 # 点1(東京駅付近)
lat2, lon2 = 34.6937, 135.5023 # 点2(大阪駅付近)
flattening = 1 / 298.257 # 地球の扁平率 f
equator_radius_km = 6378.1 # 赤道半径 km
# 式1の前半:更成緯度(緯度を扁平の分だけ縮めた角度)
u1 = math.atan((1 - flattening) * math.tan(math.radians(lat1)))
u2 = math.atan((1 - flattening) * math.tan(math.radians(lat2)))
delta_lon = math.radians(lon2 - lon1)
# 式1の後半:ハーバーサイン形の式で2地点の間の中心角cを求める
a = math.sin((u2 - u1) / 2) ** 2 + math.cos(u1) * math.cos(u2) * math.sin(delta_lon / 2) ** 2
central_angle = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
# 式2:楕円体のつぶれの分の補正(X・Y)を入れて距離を求める
p = (u1 + u2) / 2
q = (u2 - u1) / 2
x = (central_angle - math.sin(central_angle)) * math.sin(p) ** 2 * math.cos(q) ** 2 / math.cos(central_angle / 2) ** 2
y = (central_angle + math.sin(central_angle)) * math.sin(q) ** 2 * math.cos(p) ** 2 / math.sin(central_angle / 2) ** 2
distance_km = equator_radius_km * (central_angle - flattening * (x + y) / 2)
distance_mile = distance_km / 1.60935
print(f"2地点間の距離: {distance_km:.1f} km({distance_mile:.1f} マイル)")
数式記述言語(LaTeX等)での書き方(コピペ可)
U₁ = atan((1 − f)·tanφ₁), U₂ = atan((1 − f)·tanφ₂), c = 2·asin(√(sin²((U₂ − U₁)/2) + cosU₁·cosU₂·sin²((λ₂ − λ₁)/2)))
U_1 = \arctan\bigl((1-f)\tan\varphi_1\bigr),\ U_2 = \arctan\bigl((1-f)\tan\varphi_2\bigr),\quad c = 2\arcsin\sqrt{\sin^2\frac{U_2-U_1}{2} + \cos U_1 \cos U_2 \sin^2\frac{\lambda_2-\lambda_1}{2}}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<msub><mi>U</mi><mi>i</mi></msub>
<mo>=</mo>
<mi>arctan</mi>
<mo>⁡</mo>
<mrow>
<mo>(</mo>
<mrow><mo>(</mo><mn>1</mn><mo>−</mo><mi>f</mi><mo>)</mo></mrow>
<mi>tan</mi><mo>⁡</mo><msub><mi>φ</mi><mi>i</mi></msub>
<mo>)</mo>
</mrow>
<mo>,</mo>
<mspace width="1em"/>
<mi>c</mi>
<mo>=</mo>
<mn>2</mn>
<mi>arcsin</mi>
<mo>⁡</mo>
<msqrt>
<mrow>
<msup><mi>sin</mi><mn>2</mn></msup>
<mo>⁡</mo>
<mfrac>
<mrow><msub><mi>U</mi><mn>2</mn></msub><mo>−</mo><msub><mi>U</mi><mn>1</mn></msub></mrow>
<mn>2</mn>
</mfrac>
<mo>+</mo>
<mi>cos</mi><mo>⁡</mo><msub><mi>U</mi><mn>1</mn></msub>
<mi>cos</mi><mo>⁡</mo><msub><mi>U</mi><mn>2</mn></msub>
<msup><mi>sin</mi><mn>2</mn></msup>
<mo>⁡</mo>
<mfrac>
<mrow><msub><mi>λ</mi><mn>2</mn></msub><mo>−</mo><msub><mi>λ</mi><mn>1</mn></msub></mrow>
<mn>2</mn>
</mfrac>
</mrow>
</msqrt>
</mrow>
</math>
U_1 = arctan((1-f) tan(varphi_1)), U_2 = arctan((1-f) tan(varphi_2)), c = 2 arcsin(sqrt(sin^2((U_2-U_1)/2) + cos(U_1) cos(U_2) sin^2((lambda_2-lambda_1)/2)))
u1 = ArcTan[(1 - f) Tan[phi1]]; u2 = ArcTan[(1 - f) Tan[phi2]]; c = 2 ArcSin[Sqrt[Sin[(u2 - u1)/2]^2 + Cos[u1] Cos[u2] Sin[(lambda2 - lambda1)/2]^2]]
U1 := arctan((1 - f)*tan(phi1)); U2 := arctan((1 - f)*tan(phi2)); c := 2*arcsin(sqrt(sin((U2 - U1)/2)^2 + cos(U1)*cos(U2)*sin((lambda2 - lambda1)/2)^2));
u1 = atan((1 - f)*tan(phi1)); u2 = atan((1 - f)*tan(phi2)); c = 2*asin(sqrt(sin((u2 - u1)/2)^2 + cos(u1)*cos(u2)*sin((lambda2 - lambda1)/2)^2));
U_1 = atan((1 - f) tan(φ_1)), U_2 = atan((1 - f) tan(φ_2)), c = 2 asin(√(sin^2((U_2 - U_1)/2) + cos(U_1) cos(U_2) sin^2((λ_2 - λ_1)/2)))
d = 6378.1·(c − f·(X + Y)/2), X = (c − sin c)·sin²P·cos²Q ÷ cos²(c/2), Y = (c + sin c)·sin²Q·cos²P ÷ sin²(c/2), P = (U₁ + U₂)/2, Q = (U₂ − U₁)/2
d = 6378.1\left(c - \frac{f(X + Y)}{2}\right),\quad X = \frac{(c - \sin c)\sin^2 P \cos^2 Q}{\cos^2(c/2)},\quad Y = \frac{(c + \sin c)\sin^2 Q \cos^2 P}{\sin^2(c/2)},\quad P = \frac{U_1 + U_2}{2},\ Q = \frac{U_2 - U_1}{2}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>d</mi>
<mo>=</mo>
<mn>6378.1</mn>
<mrow>
<mo>(</mo>
<mi>c</mi>
<mo>−</mo>
<mfrac>
<mrow><mi>f</mi><mo>(</mo><mi>X</mi><mo>+</mo><mi>Y</mi><mo>)</mo></mrow>
<mn>2</mn>
</mfrac>
<mo>)</mo>
</mrow>
<mo>,</mo>
<mspace width="1em"/>
<mi>X</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mo>(</mo><mi>c</mi><mo>−</mo><mi>sin</mi><mo>⁡</mo><mi>c</mi><mo>)</mo>
<msup><mi>sin</mi><mn>2</mn></msup><mo>⁡</mo><mi>P</mi>
<msup><mi>cos</mi><mn>2</mn></msup><mo>⁡</mo><mi>Q</mi>
</mrow>
<mrow><msup><mi>cos</mi><mn>2</mn></msup><mo>⁡</mo><mrow><mo>(</mo><mi>c</mi><mo>/</mo><mn>2</mn><mo>)</mo></mrow></mrow>
</mfrac>
<mo>,</mo>
<mspace width="1em"/>
<mi>Y</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mo>(</mo><mi>c</mi><mo>+</mo><mi>sin</mi><mo>⁡</mo><mi>c</mi><mo>)</mo>
<msup><mi>sin</mi><mn>2</mn></msup><mo>⁡</mo><mi>Q</mi>
<msup><mi>cos</mi><mn>2</mn></msup><mo>⁡</mo><mi>P</mi>
</mrow>
<mrow><msup><mi>sin</mi><mn>2</mn></msup><mo>⁡</mo><mrow><mo>(</mo><mi>c</mi><mo>/</mo><mn>2</mn><mo>)</mo></mrow></mrow>
</mfrac>
<mo>,</mo>
<mspace width="1em"/>
<mi>P</mi>
<mo>=</mo>
<mfrac><mrow><msub><mi>U</mi><mn>1</mn></msub><mo>+</mo><msub><mi>U</mi><mn>2</mn></msub></mrow><mn>2</mn></mfrac>
<mo>,</mo>
<mi>Q</mi>
<mo>=</mo>
<mfrac><mrow><msub><mi>U</mi><mn>2</mn></msub><mo>−</mo><msub><mi>U</mi><mn>1</mn></msub></mrow><mn>2</mn></mfrac>
</mrow>
</math>
d = 6378.1 (c - f(X + Y)/2), X = ((c - sin c) sin^2(P) cos^2(Q))/(cos^2(c/2)), Y = ((c + sin c) sin^2(Q) cos^2(P))/(sin^2(c/2)), P = (U_1 + U_2)/2, Q = (U_2 - U_1)/2
p = (u1 + u2)/2; q = (u2 - u1)/2; x = (c - Sin[c]) Sin[p]^2 Cos[q]^2/Cos[c/2]^2; y = (c + Sin[c]) Sin[q]^2 Cos[p]^2/Sin[c/2]^2; d = 6378.1 (c - f (x + y)/2)
P := (U1 + U2)/2; Q := (U2 - U1)/2; X := (c - sin(c))*sin(P)^2*cos(Q)^2/cos(c/2)^2; Y := (c + sin(c))*sin(Q)^2*cos(P)^2/sin(c/2)^2; d := 6378.1*(c - f*(X + Y)/2);
p = (u1 + u2)/2; q = (u2 - u1)/2; x = (c - sin(c))*sin(p)^2*cos(q)^2/cos(c/2)^2; y = (c + sin(c))*sin(q)^2*cos(p)^2/sin(c/2)^2; d = 6378.1*(c - f*(x + y)/2);
d = 6378.1(c - f(X + Y)/2), X = (c - sin c) sin^2(P) cos^2(Q)/cos^2(c/2), Y = (c + sin c) sin^2(Q) cos^2(P)/sin^2(c/2), P = (U_1 + U_2)/2, Q = (U_2 - U_1)/2
D = d + m/60 + s/3600
D = d + \frac{m}{60} + \frac{s}{3600}
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mrow>
<mi>D</mi>
<mo>=</mo>
<mi>d</mi>
<mo>+</mo>
<mfrac><mi>m</mi><mn>60</mn></mfrac>
<mo>+</mo>
<mfrac><mi>s</mi><mn>3600</mn></mfrac>
</mrow>
</math>
D = d + m/60 + s/3600
d + m/60 + s/3600
deg := d + m/60 + s/3600; # D(微分演算子)はMapleの予約語のため、10進の度は deg にしている
D = d + m/60 + s/3600;
D = d + m/60 + s/3600
ChatGPT に聞いて計算してもらう方法
あなたは地理計算のアシスタントです。次の計算を、必ずPythonコードを実際に実行して行い、実行結果の数値だけを根拠に回答してください(暗算や推測で答えないでください)。 2地点の緯度・経度から、地球を扁平率 f = 1/298.257 の回転楕円体として近似するランベルト(Lambert)の方法で、2地点間の距離を求めてください。 手順:各点の緯度を更成緯度 U = atan((1-f)·tanφ) に換算し、a = sin²((U2-U1)/2) + cosU1·cosU2·sin²((λ2-λ1)/2)、中心角 c = 2·atan2(√a, √(1-a))、P = (U1+U2)/2、Q = (U2-U1)/2、X = (c-sin c)·sin²P·cos²Q/cos²(c/2)、Y = (c+sin c)·sin²Q·cos²P/sin²(c/2)、距離(km) = 6378.1·(c - f·(X+Y)/2) です。 点1:北緯35.6895度・東経139.6917度(東京駅付近) 点2:北緯34.6937度・東経135.5023度(大阪駅付近) 距離をkmとマイル(1マイル = 1.60935 km)で示し、計算に使ったコードと実行結果の数値を示してください。
計算ドリル(演習問題)
ランベルトの式そのものは電卓なしでは計算できないため、ここでは土台になる「度分秒⇔10進の換算」「経度差」「緯度1度あたり約111kmの概算」を、自分の手で計算できるようになるための演習問題にしました。
答えと解説は解答ページにあります。
使い方
-
1数値を入力計算したい数値を入力欄に入力します
-
2計算「計算する」ボタンを押します
-
3結果を確認計算結果がその場に表示されます。計算の考え方や式の解説も同じページで確認できます
DataChefの特徴
専門知識不要、直感的で簡単な操作
個人情報を登録することなく使用できます
「ダウンロード」押下でファイルを自動削除
クレジット表記不要
商用利用許諾の連絡も不要です
