#author("2018-12-29T10:25:14+09:00","default:fuzuki","fuzuki")
* Hubenyの公式で距離計算 [#pa711b72]
2点の地理座標間の距離を計算するのに、そんなに複雑ではなくて、球面三角法よりももう少し精度の良い計算でHubenyの公式というものがあるみたいです。~
とりあえず簡単にKotolinで試してみます。
精度は、日本国内程度の近距離ならそんなに悪くなさそう(1%以下)だけれど、赤道をまたいだり半球の1/4を超えるような距離だと結構ずれる様子(3-5%くらい?)。大圏コースとか測地線とか関係あるのかもしれない。
// https://ja.wikipedia.org/wiki/%E6%B8%AC%E5%9C%B0%E5%AD%A6
val WGS84_A = 6378137.0 //長半径
val WGS84_B = 6356752.314245 //短半径
val WGS84_E2 = ((WGS84_A * WGS84_A) - (WGS84_B * WGS84_B)) / (WGS84_A * WGS84_A) // 離心率
val WGS84_A1E2 = WGS84_A * (1 - WGS84_E2) // 赤道上の子午線曲率半径
fun deg2rad(d: Double): Double {
return d * Math.PI / 180.0
}
// 小数点で緯度経度を取り、距離(m)を返す。
fun calcHubeny(lat1: Double, lng1: Double, lat2: Double, lng2: Double): Double {
val latdiff = deg2rad(lat1 - lat2) // 緯度差
val lngdiff = deg2rad(lng1 - lng2) // 経度差
val latavg = deg2rad((lat1 + lat2) / 2.0) // 緯度平均
//卯酉線曲率半径
val sinLatAvg = Math.sin(latavg)
val w2 = 1.0 - WGS84_E2 * (sinLatAvg * sinLatAvg)
val n = WGS84_A / Math.sqrt(w2)
//子午線曲率半径
val m = WGS84_A1E2 / (Math.sqrt(w2) * w2)
// Hubeny
val t1 = m * latdiff
val t2 = n * Math.cos(latavg) * lngdiff
return Math.sqrt((t1 * t1) + (t2 * t2))
}
*** 参考リンク [#x2209008]
- https://ja.wikipedia.org/wiki/GRS80
- https://ja.wikipedia.org/wiki/%E6%B8%AC%E5%9C%B0%E5%AD%A6
- https://qiita.com/collapsar/items/7311adac703606967a48
- https://tech-blog.s-yoshiki.com/2018/05/92/
- http://dagezi.hatenablog.com/entry/2014/09/24/094908