Javascript Haversine错误

时间:2014-05-07 18:50:27

标签: javascript haversine

所以我已经使用Haversine公式来查找从Google地图检索到的路线上的位置,如下所示,使用里程。

var R = 3959 //in miles;
var lat1 = result.routes[0].overview_path[index].k.toFixed(5);
var lat2 = locations[index2].lat;
var lon1 = result.routes[0].overview_path[index].A.toFixed(5);
var lon2 = locations[index2].lng;
var deltaLat = (lat2-lat1).toRad();
var deltaLon = (lon2-lon1).toRad();
var a = Math.sin(deltaLat/2)*Math.sin(deltaLat/2) + Math.cos(lat1) * Math.cos(lat2) *
                Math.sin(deltaLon/2)*Math.sin(deltaLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R*c;

但是当它使用点(例如)36.64756,-97.34593(在Wichita,KS和Dallas TX之间的路径上某处)和39.933321,-91.409415(位于伊利诺斯州Quincy的一个位置)时,我的距离小于20英里。显然这是不正确的。我无法用其他值复制错误 - 我偶然发现了这个错误。

这是toRad原型,btw -

if(typeof(Number.prototype.toRad) === "undefined") {
Number.prototype.toRad = function(){
    return this * Math.PI / 180;
};
}

我最初的猜测是在某个地方浮点溢出但我无法隔离它或用toFixed来缓解它。有人有什么想法吗?

3 个答案:

答案 0 :(得分:2)

toFixed返回带有值的String,记住。

http://www.w3schools.com/jsref/jsref_tofixed.asp

答案 1 :(得分:2)

我相信你的等式错了。以下是您可以与之比较的javascript版本:http://www.movable-type.co.uk/scripts/latlong.html

不同之处在于您的条款Math.cos(lat1) * Math.cos(lat2)。您需要先将lat1lat2转换为弧度。

答案 2 :(得分:0)

您可以在此处使用我的套餐为您计算:https://www.npmjs.com/package/haversine-calculator

const haversineCalculator = require('haversine-calculator')

const start = {
  latitude: -23.754842,
  longitude: -46.676781
}

const end = {
  latitude: -23.549588,
  longitude: -46.693210
}

console.log(haversineCalculator(start, end))
console.log(haversineCalculator(start, end, {unit: 'meter'}))
console.log(haversineCalculator(start, end, {unit: 'mile'}))
console.log(haversineCalculator(start, end, {threshold: 1}))
console.log(haversineCalculator(start, end, {threshold: 1, unit: 'meter'}))
console.log(haversineCalculator(start, end, {threshold: 1, unit: 'mile'}))

看一下,我认为这个代码比手动执行代码更容易维护和灵活。