2地点間の距離計測アルゴリズムを比較
2地点間の距離計測アルゴリズムを比較
by s_yoshiki
HTML
<button id="start">Run</button>
<p id="result1"></p>
<p id="result2"></p>
<p id="summary"></p>
JavaScript
//
// ヒュベニの公式
//
function hubeny(lat1, lng1, lat2, lng2) {
function rad(deg) {
return deg * Math.PI / 180;
}
//degree to radian
lat1 = rad(lat1);
lng1 = rad(lng1);
lat2 = rad(lat2);
lng2 = rad(lng2);
// 緯度差
var latDiff = lat1 - lat2;
// 経度差算
var lngDiff = lng1 - lng2;
// 平均緯度
var latAvg = (lat1 + lat2) / 2.0;
// 赤道半径
var a = 6378137.0;
// 極半径
var b = 6356752.314140356;
// 第一離心率^2
var e2 = 0.00669438002301188;
// 赤道上の子午線曲率半径
var a1e2 = 6335439.32708317;
var sinLat = Math.sin(latAvg);
var W2 = 1.0 - e2 * (sinLat * sinLat);
// 子午線曲率半径M
var M = a1e2 / (Math.sqrt(W2) * W2);
// 卯酉線曲率半径
var N = a / Math.sqrt(W2);
t1 = M * latDiff;
t2 = N * Math.cos(latAvg) * lngDiff;
return Math.sqrt((t1 * t1) + (t2 * t2));
}
//
// 球面三角法
//
function sphericalTrigonometry(lat1, lng1, lat2, lng2) {
// 赤道半径
var R = 6378137.0;
function rad(deg) {
return deg * Math.PI / 180;
}
return R *
Math.acos(
Math.cos(rad(lat1)) *
Math.cos(rad(lat2)) *
Math.cos(rad(lng2) - rad(lng1)) +
Math.sin(rad(lat1)) *
Math.sin(rad(lat2))
);
}
var getSuccess = function(pos) {
//現在地の緯度経度
var lat1 = pos.coords.latitude;
var lng1 = pos.coords.longitude;
//新宿都庁の座標
var lat2 = 35.689487;
var lng2 = 139.691706;
//距離の計算//
var ans1, ans2;
try {
ans1 = hubeny(lat1, lng1, lat2, lng2);
ans2 = sphericalTrigonometry(lat1, lng1, lat2, lng2);
} catch (e) {
alert(e);
}
//結果
document.getElementById("result1").innerHTML = ans1 + " m";
document.getElementById("result2").innerHTML = ans2 + " m";
};
var geoError = function() {
var pos = {
'coords': {
'latitude': 35.5562073,
'longitude': 139.5723855
}
};
getSuccess(pos);
alert('Getting location failed.');
};
//...