Swift2で二地点の緯度・経度からその距離を計算するには?
二地点の緯度・経度からその距離を計算する(日本は山だらけ〜)
のJava版をSwift2に移植しました。数学は分かりません。理論も分かりません。でもSwiftとJavaは分かるので移植はできるのです(^^);
オリジナルがMITライセンスなので、このコードもリスペクトを込めてMITライセンスとします。
のJava版をSwift2に移植しました。数学は分かりません。理論も分かりません。でもSwiftとJavaは分かるので移植はできるのです(^^);
オリジナルがMITライセンスなので、このコードもリスペクトを込めてMITライセンスとします。
//
// GeoUtil.swift
//
import Foundation
/**
* 二地点の緯度・経度からその距離を計算する(日本は山だらけ〜) - http://yamadarake.jp/trdi/report000001.html
*/
@objc(GeoUtil) class GeoUtil: NSObject {
static let BESSEL_A: Double = 6377397.155;
static let BESSEL_E2: Double = 0.00667436061028297;
static let BESSEL_MNUM: Double = 6334832.10663254;
static let GRS80_A: Double = 6378137.000;
static let GRS80_E2: Double = 0.00669438002301188;
static let GRS80_MNUM: Double = 6335439.32708317;
static let WGS84_A: Double = 6378137.000;
static let WGS84_E2: Double = 0.00669437999019758;
static let WGS84_MNUM: Double = 6335439.32729246;
static let BESSEL: Int = 0;
static let GRS80: Int = 1;
static let WGS84: Int = 2;
static func deg2rad(deg: Double) -> Double {
return deg * M_PI / 180.0;
}
static func calcDistHubeny(lat1: Double, lng1: Double, lat2: Double, lng2: Double, a: Double, e2: Double, mnum: Double) -> Double {
let my: Double = deg2rad((lat1 + lat2) / 2.0);
let dy: Double = deg2rad(lat1 - lat2);
let dx: Double = deg2rad(lng1 - lng2);
let sinVal: Double = sin(my);
let w: Double = sqrt(1.0 - e2 * sinVal * sinVal);
let m: Double = mnum / (w * w * w);
let n: Double = a / w;
let dym: Double = dy * m;
let dxncos: Double = dx * n * cos(my);
return sqrt(dym * dym + dxncos * dxncos);
}
static func calcDistHubeny(lat1: Double, lng1: Double, lat2: Double, lng2: Double) -> Double {
return calcDistHubeny(lat1, lng1: lng1, lat2: lat2, lng2: lng2, a: GRS80_A, e2: GRS80_E2, mnum: GRS80_MNUM);
}
static func calcDistHubery(lat1: Double, lng1: Double, lat2: Double, lng2: Double, type: Int) -> Double {
switch(type) {
case BESSEL:
return calcDistHubeny(lat1, lng1: lng1, lat2: lat2, lng2: lng2, a: BESSEL_A, e2: BESSEL_E2, mnum: BESSEL_MNUM);
case WGS84:
return calcDistHubeny(lat1, lng1: lng1, lat2: lat2, lng2: lng2, a: WGS84_A, e2: WGS84_E2, mnum: WGS84_MNUM);
default:
return calcDistHubeny(lat1, lng1: lng1, lat2: lat2, lng2: lng2, a: GRS80_A, e2: GRS80_E2, mnum: GRS80_MNUM);
}
}
}
コメント
コメントを投稿