２地点の距離の導出

# 地球上の２地点の距離の求め方

地球上の２地点の距離の求め方は、いくつかありますが、以下の２つの方法を解説します。

* 球面三角法の余弦定理からの導出
* ベクトル空間からの導出

それぞれの公式において、緯度・経度を使って距離を導出することができます。

# 球面三角法の余弦定理からの導出

## 球面三角形と球面三角法の余弦定理について

球面三角形とは、以下の図のように、球面上の3点を結んだ三角形の事です。

<img src="https://upload.wikimedia.org/wikipedia/commons/3/38/Law-of-haversines.svg" >
図: 単位球面上の球面三角形 

上図の球面三角形の辺と角度には以下の関係式が成り立ちます。
これを球面三角法の余弦定理と呼びます。
 
```folumn:球面三角法の余弦定理（式１）
cos(c) = cos(a)cos(b) + sin(a)sin(b)cos(C)
```

上式から単位球面上２点間の距離cは、以下となります。

```display:２点間の距離c　(式２）
c = acos({cos(a)cos(b) + sin(a)sin(b)cos(C)})
```

## 単位球を地球にマッピング

また以下の図２のように、
点uを北極点、点v,wをそれぞれ距離を求める２地点として、単位球を地球にマッピングします。

|図1|図2|
|:--:|:--:|
|<img src="https://upload.wikimedia.org/wikipedia/commons/3/38/Law-of-haversines.svg" width="320" >|<img src="https://qiita-image-store.s3.amazonaws.com/0/70065/17d17872-0cd4-2d9f-8a71-bda83cd2a363.png" width="240">|
|単位球上の球面三角形|点uを北極点として、左図を地球にマッピングした図。<br><br> 点vの緯度・経度 = (φ1, λ1) <br> 点wの緯度・経度 = (φ2, λ2)|

そうすることによって、図１の単位球面上の球面三角形の辺と角度は、緯度・経度を使って以下のように表せます。

```display:図１の関係式を緯度・経度で表した場合
a = π/2 - φ1　(φ1: 点vの緯度[rad])
b = π/2 - φ2　(φ2: 点wの緯度[rad])
C = λ2 - λ1 = Δλ (λ1: 点vの経度[rad], λ2: 点wの経度[rad])

* 単位球では、球の中心oとのなす角度[rad]はそのまま、円弧の長さとなる事に注意
→ ex 辺bは、∠uowのなす角度[rad]と同一
```

従って式２から、単位球面における２地点の距離(c)は、
以下のように緯度・経度を使って表す事が出来ます。

```title:経度・緯度からの単位球面上の２地点の距離c（式３）
c = acos(cos(a)cos(b) + sin(a)sin(b)cos(C))
  = acos(cos(π/2-φ1)cos(π/2-φ2) + sin(π/2-φ1)sin(π/2-φ2)cos(Δλ))
  = acos(sin(φ1)sin(φ2) + cos(φ1)cos(φ2)cos(Δλ))
```

求めた距離cは、直径1の単位球上の2点間の距離なので、
地球上における２地点の距離(d)は、地球の直径をRとすると以下となります。

```title:地球上における２点間の距離
d = Rc
```

# ベクトル空間から地球上の２点間の距離を求める

緯度・経度を直接ベクトル空間にマッピングするのは、しんどいため、
一旦緯度・経度を極座標で表し、極座標からベクトル空間（直交座標）に変換します。

## ベクトル空間による距離の導出

<img src="https://qiita-image-store.s3.amazonaws.com/0/70065/fe8154cb-3fea-f408-0737-095539138f0d.png" width="320">

上図において、点Pと点Qをそれぞれ距離を求めたい２地点とすると、
その間のなす角度cを求めることで、弧PQの長さが導出できます。
この角度cは、ベクトルの公式（内積・外積）どちらからでも求めることが出来ます。
（またこの角度cは、式１、式２に出てくるcと同一であるため、球面三角形の余弦定理の証明にもなります。）

## 経度・緯度と極座標の関係

<img src="https://qiita-image-store.s3.amazonaws.com/0/70065/d2b7f3b8-8e27-e769-65f2-52ff36a902d6.png" width="320">

上図の極座標において、緯度・経度を以下のようにマッピングします。

```display:経度・緯度と極座標の関係（定義１）
φ = 経度
θ = π/2 - 緯度
r = 地球の半径
```

## 極座標からベクトル空間へ

[wikipedia](https://ja.wikipedia.org/wiki/%E6%A5%B5%E5%BA%A7%E6%A8%99%E7%B3%BB)の極座標から拝借。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70065/e9304c88-0523-c1c9-f6aa-601f17a0a59f.png)

従ってある地球上の２地点の経度・緯度がそれぞれP(φ1, λ1)、Q(φ2, λ2)とすると、定義１からそれぞれベクトル空間上で緯度・経度を用いて表すと、以下となります。

```display:経度・緯度をベクトル空間上に変換
点P = ( sin (π/2-φ1)cos(λ1), sin(π/2-φ1)sin(λ1), cos(π/2-φ1) )
    = ( cos(φ1)cos(λ1), cos(φ1)sin(λ1), sin(φ1) )
点Q = ( cos(φ2)cos(λ2), cos(φ2)sin(λ2), sin(φ2) )
```

## 内積から２頂点のなす角度cを導出



```title:p・q
p・q = cos(φ1)cos(φ2)cos(λ1)cos(λ2) + cos(φ2)cos(φ2)sin(λ2)sin(λ2) + sin(φ1)sin(φ2)
     = cos(φ1)cos(φ2){cos(λ1)cos(λ2) + sin(λ1)sin(λ2)} + sin(φ1)sin(φ2)
     = cos(φ1)cos(φ2)cos(Δλ) + sin(φ1)sin(φ2)
```

それぞれp,qが単位ベクトルとすると、
ベクトルp,qと間のなす角度cとの関係 `p・q = cos(c)` であるから、角度cは以下となります。

```title:２つのp,qベクトルのなす角度c（式４）
c = acos(p・q)
  = acos(cos(φ1)cos(φ2)cos(Δλ) + sin(φ1)sin(φ2))
```

従って点Pと点Qの間のなす角度cが求まったので、
地球の直径をRとした時の２地点の距離(d)は以下となります。

```title:地球上の２地点の距離
d = Rc
```

---

図らずしも式４は、球面三角法の余弦定理から求めた式３のcと同一になっていることがわかります。
これは単位球面上の球面三角形の辺と角度は、以下の関係があるためです。

<img src="https://upload.wikimedia.org/wikipedia/commons/1/1d/Spherical_trigonometry_basic_triangle.svg" width="240"> 

上図に置いて中心点をOとすると、OBとOCのなす角度∠BOC ([rad])を上記のベクトルを使って導出しました。
一方球面三角法の余弦定理で求めた値は、弧BCになります。
長さ１の単位球面上においては、角度をradで表現した場合、円弧の長さと等しくなるため、球面三角法の余弦定理の証明に使うことが出来ます。

# 参考

[Calculate distance, bearing and more between Latitude/Longitude points](https://www.movable-type.co.uk/scripts/latlong.html)

[大円距離](https://ja.wikipedia.org/wiki/%E5%A4%A7%E5%86%86%E8%B7%9D%E9%9B%A2)

[球面三角法](https://ja.wikipedia.org/wiki/%E7%90%83%E9%9D%A2%E4%B8%89%E8%A7%92%E6%B3%95)

[極座標系](https://ja.wikipedia.org/wiki/%E6%A5%B5%E5%BA%A7%E6%A8%99%E7%B3%BB)

## 画像参照元

[wikipedia File:Spherical with grid.svg](https://commons.wikimedia.org/wiki/File:Spherical_with_grid.svg)

[wikipedia File:Arctic Ocean - en.png](https://commons.wikimedia.org/wiki/File:Arctic_Ocean_-_en.png)

[wikipedia File:Law-of-haversines.svg](https://commons.wikimedia.org/wiki/File:Law-of-haversines.svg)

[wikipedia File:Illustration of great-circle distance.svg](https://commons.wikimedia.org/wiki/File:Illustration_of_great-circle_distance.svg)

[wikipedia File:Spherical trigonometry basic triangle.svg](https://commons.wikimedia.org/wiki/File:Spherical_trigonometry_basic_triangle.svg)