輸入兩地的緯度、經度,就會以公里和英里計算沿地球表面的兩地距離。輸入格式可以在十進位和度分秒(DMS)之間切換。
這個頁面可以做什麼
- 只要輸入兩地的緯度、經度,就能當場知道沿著地球表面的兩地距離(公里、英里)
- 可以用十進位格式(例如 25.0478)或度分秒(DMS)格式(例如 25°2′52.08″)輸入,用選項按鈕切換
- 用把地球近似成旋轉橢球體(稍微扁平的球)的蘭伯特公式計算,比把地球當成完美球體的半正矢公式更接近真實的地球
- 淺顯易懂的公式解說,以及可直接複製到 Excel、Google 試算表、Python 的公式,也都整理在這個頁面
這個計算有什麼用?
飛機會沿著接近地球曲面上最短路徑(大圓航線)的路線飛行,所以城市之間的飛行距離,是用本頁這種「沿地球表面的距離」來估算(台北到倫敦約 9,800 km,約 6,090 英里)。航空公司里程累積的區間距離,也是以這種距離為基礎。
「在平面地圖上看起來繞遠路,為什麼台灣飛美國東岸的班機要經過阿拉斯加附近?」算一算這個距離就能明白。
地圖 App 或外送 App 的「依距離排序」,是由您的所在位置和店家的緯度、經度算出兩地距離再排序。在程式設計中,球面近似的半正矢公式是這類用途的標準作法;需要更高精確度時,會用本頁蘭伯特公式這類橢球體的公式。
在每天使用的 App 背後,正大量計算著這種公式。
GPS 手錶或跑步 App 的里程,是把每隔幾秒記錄的定位點之間的距離用這類公式算出,再全部加起來。每一段雖然只有幾十公尺,但緯度、經度→距離的換算重複了幾千次,才會顯示「今天跑了 10.2 km」。
航海時用海里(1 海里 = 1.852 km,大約是緯度 1 分的長度)量距離,從出發港到目的港的航程,是以沿地球曲面的距離來規劃。抵達時間和燃料的估算,都從這個距離計算開始。
運送世界大部分貿易貨物的海運,就是靠經緯度的距離計算支撐著。
中央氣象署地震報告中「震央位於花蓮縣政府南方 XX 公里」這樣的寫法,就是由震央(震源正上方的地表點)的緯度、經度和各地或測站的經緯度,用和本頁相同的想法算出的距離。
用數字掌握自家離活動斷層、過去震央有多遠,是做好防災準備的第一步。
公式
符號與用語解說
符號
| \(\varphi\) | phi | 緯度:以赤道為 0°,表示往南北方向離多遠的角度。北緯為正,南緯為負(−90°~90°)。 |
| \(\lambda\) | lambda | 經度:以通過英國舊格林威治天文台的本初子午線為 0°,表示東西方向位置的角度。東經為正,西經為負(−180°~180°)。 |
| \(f\) | f | 地球的扁率:表示旋轉橢球體扁平程度的比例,本計算使用 \(f = \dfrac{1}{298.257}\)。 |
| \(U\) | U | 歸化緯度:為了能用球面的公式處理,用 \(U = \arctan((1-f)\tan\varphi)\) 把橢球體上的緯度重新換算後的緯度。 |
| \(c\) | c | 圓心角:從地球中心看兩地時張開的角度(弧度)。透過「弧長=半徑×圓心角」,成為距離的基礎。 |
| \(X\), \(Y\) | X、Y | 用來修正橢球體扁平部分的中間量,由圓心角 \(c\)、歸化緯度的平均 \(P = \dfrac{U_1+U_2}{2}\) 和差的一半 \(Q = \dfrac{U_2-U_1}{2}\) 計算。 |
| \(d\) | d | 兩地距離,取自 distance(距離)的字首。本頁以公里(km)和英里顯示。 |
| ° ′ ″ | 度、分、秒 | 角度的度、分、秒的符號。1° = 60′,1′ = 60″。例如 25°2′52.08″(25 度 2 分 52.08 秒)。 |
用語
| 緯度 | 以赤道為 0 度,表示南北方向位置的角度。北極是北緯 90 度,南極是南緯 90 度。是地圖和定位資訊的基本概念,在國中的地理課學習。 |
| 經度 | 以本初子午線(通過英國格林威治的線)為 0 度,表示東西方向位置的角度。東經、西經各到 180 度為止,台灣本島大約在東經 120~122 度。 |
| 度分秒 | 用度、分、秒的六十進位表示角度的寫法(DMS 格式)。1 度=60 分,1 分=60 秒。常用在地形圖、航海圖和 GPS 裝置上。 |
| 旋轉橢球體 | 把橢圓繞著軸旋轉所得的立體。地球因為自轉的離心力而在赤道方向鼓起,所以不是用球體,而是用旋轉橢球體來近似。 |
| 扁率 | 表示旋轉橢球體扁平程度的比例,定義為(赤道半徑 − 極半徑)÷ 赤道半徑,地球約為 1/300。 |
| 歸化緯度 | 把橢球體上的點,重新對應到作為該橢圓基礎的輔助圓(球)上時的緯度。用 \(U = \arctan((1-f)\tan\varphi)\) 求出,用在測地學(測量地球形狀的學問)中,也叫參數緯度。 |
| 圓心角 | 從圓或球的中心看兩點時張開的角度。扇形「弧長=半徑×圓心角(弧度)」的關係,是本頁距離計算的基礎。 |
| 測地線 | 曲面上連接兩點的最短路徑。在地球表面接近「大圓航線」,飛機的航線大致是這個形狀。本頁求的是沿著測地線的大約長度。 |
| 半正矢公式 | 把地球當成完美球體來求兩地距離的著名公式(haversine formula)。本頁的蘭伯特公式是針對橢球體改良的版本,第一步求圓心角時也用了半正矢型的公式。 |
| 蘭伯特公式 | 把地球近似成旋轉橢球體來求兩地距離的方法(Lambert's formula)。一般認為即使數千公里的距離,誤差也只有大約 10 m,比球面近似更精確。 |
| 英里 | 主要在美國、英國使用的距離單位(法定英里,也叫哩)。1 英里 = 約 1.609 km(國際定義為 1.609344 km),本計算機以 1 英里 = 1.60935 km 換算。和下面的海里是不同的單位。 |
| 海里 | 航海和航空使用的距離單位(nautical mile,也叫浬)。1 海里 = 1.852 km,訂定時讓它大約等於地球緯度 1 分(1 度的 1/60)的長度。 |
建議先了解的基礎知識
為了讓您「理解意義」地使用本頁的計算,這裡整理了事先了解會更好懂的基礎知識。
只是要求距離的話,看得懂緯度、經度就夠了。想了解公式內容的話,要回溯到三角函數和弧度。
| 緯度與經度(國中七年級地理,12~13 歲) |
|
| 角度與六十進位(國小三~四年級,8~10 歲) |
|
| 扇形的弧長(國小六年級~國中九年級,11~15 歲) |
|
| 三角比 sin、cos、tan(高中一年級,15~16 歲) |
|
| 弧度(高中二年級,16~17 歲) |
|
| 地球的形狀(國中自然科學、高中地球科學) |
|
用 Excel 計算的方法
| 度 | 25 |
| 分 | 2 |
| 秒 | 52.08 |
| 十進位的角度(南緯、西經加上 −) | =B1+B2/60+B3/3600 |
| 點 1 的緯度(十進位,南緯為 −) | 25.0478 |
| 點 1 的經度(十進位,西經為 −) | 121.5170 |
| 點 2 的緯度 | 22.6394 |
| 點 2 的經度 | 120.3025 |
| 扁率 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 |
| 距離(公里) | =6378.1*(B10-B5*(B13+B14)/2) |
| 距離(英里) | =B15/1.60935 |
第二個表格是蘭伯特公式的完整步驟。B1~B4 是輸入(十進位),B6 以後是式 1、式 2 的中間量,B15 是以公里表示的距離(約 294.03),B16 是以英里表示的距離(約 182.70)。本頁的計算機會把它們四捨五入成 294.0 km、182.7 英里。
RADIANS(…) 是把度換成弧度的函數。Excel 的 ATAN2(x, y) 參數順序是(x 坐標,y 坐標),所以要注意 c 寫成 2×ATAN2(√(1−a), √a)。
用 Google 試算表計算的方法
| 度 | 25 |
| 分 | 2 |
| 秒 | 52.08 |
| 十進位的角度(南緯、西經加上 −) | =B1+B2/60+B3/3600 |
| 點 1 的緯度(十進位,南緯為 −) | 25.0478 |
| 點 1 的經度(十進位,西經為 −) | 121.5170 |
| 點 2 的緯度 | 22.6394 |
| 點 2 的經度 | 120.3025 |
| 扁率 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 |
| 距離(公里) | =6378.1*(B10-B5*(B13+B14)/2) |
| 距離(英里) | =B15/1.60935 |
用 Python 計算的方法
import math
# 兩地的緯度、經度(十進位;南緯、西經為負)
lat1, lon1 = 25.0478, 121.5170 # 點 1(台北車站附近)
lat2, lon2 = 22.6394, 120.3025 # 點 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 後半:用半正矢型的公式求兩地之間的圓心角 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"兩地距離:{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 (the differential operator) is reserved in Maple, so the decimal degrees are named deg
D = d + m/60 + s/3600;
D = d + m/60 + s/3600
請 ChatGPT 幫忙計算的方法
你是地理計算的助理。請務必實際執行 Python 程式碼來進行以下計算,並且只根據執行結果的數值回答(不要用心算或推測回答)。 請用把地球近似成扁率 f = 1/298.257 的旋轉橢球體的蘭伯特公式(Lambert's formula),由兩地的緯度、經度求出距離。 步驟:把各緯度換算成歸化緯度 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:北緯 25.0478°、東經 121.5170°(台北車站附近) 點 2:北緯 22.6394°、東經 120.3025°(高雄車站附近) 請以 km 和英里(1 英里 = 1.60935 km)表示距離,並列出使用的程式碼和執行結果的數值。
使用方法
-
1輸入數值在輸入欄中輸入要計算的數值
-
2計算按下「計算」按鈕
-
3查看結果計算結果會立即顯示。計算的思路和公式的解說,也都能在同一個頁面查看
DataChef 的特色
不需專業知識,操作直覺又簡單
無須登錄任何個人資料
按下「下載」後自動刪除檔案
無須標註來源出處
亦無須事先取得商用授權