toRad() Javascript 函数抛出错误

IT技术 javascript geolocation
2021-01-27 00:59:42

我正在尝试使用计算两个纬度 - 经度点之间的距离中描述的技术来找到两点之间的距离(我有纬度和经度)(Haversine 公式)

代码如下Javascript:

var R = 6371; // Radius of the earth in km
var dLat = (lat2-lat1).toRad();  // Javascript functions in radians
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
        Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c; // Distance in km

但是当我尝试实现它时,会出现一个错误,说Uncaught TypeError: Object 20 has no Method 'toRad'.

我需要一个特殊的库或其他东西来让 .toRad() 工作吗?因为它似乎在第二行搞砸了。

6个回答

您缺少函数声明。

这种情况下, toRad()必须首先定义为:

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

根据页面底部的代码段

或者在我的情况下这不起作用。这可能是因为我需要在 jquery 中调用 toRad()。我不是 100% 确定,所以我这样做了:

function CalcDistanceBetween(lat1, lon1, lat2, lon2) {
    //Radius of the earth in:  1.609344 miles,  6371 km  | var R = (6371 / 1.609344);
    var R = 3958.7558657440545; // Radius of earth in Miles 
    var dLat = toRad(lat2-lat1);
    var dLon = toRad(lon2-lon1); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * 
            Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c;
    return d;
}

function toRad(Value) {
    /** Converts numeric degrees to radians */
    return Value * Math.PI / 180;
}

我需要为我的项目计算点之间的很多距离,所以我继续尝试优化代码,我在这里找到了。平均而言,我的新实现在不同浏览器中的运行速度几乎比这里提到的快 3 倍

function distance(lat1, lon1, lat2, lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = (lat2 - lat1) * Math.PI / 180;  // deg2rad below
  var dLon = (lon2 - lon1) * Math.PI / 180;
  var a = 
     0.5 - Math.cos(dLat)/2 + 
     Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * 
     (1 - Math.cos(dLon))/2;

  return R * 2 * Math.asin(Math.sqrt(a));
}

您可以使用我的 jsPerf(由于 Bart 得到了极大改进)并在此处查看结果

为什么不简化上面的等式并进行相同的一些计算?

Math.sin(dLat/2) * Math.sin(dLat/2) = (1.0-Math.cos(dLat))/2.0

Math.sin(dLon/2) * Math.sin(dLon/2) = (1.0-Math.cos(dLon))/2.0

后期添加:因为trig身份是抽象的;cos 版本对于小距离的数值条件变得很差。此外,优化编译器可能会分解出常用术语。微观优化不佳。
2021-03-21 00:59:42

我遇到了同样的问题..看着 Casper 的回答,我只是做了一个快速修复:(Ctrl+H查找和替换),.toRad()* Math.PI / 180. 那对我有用。

但是,不知道浏览器的性能速度等。我的用例只在用户单击地图时才需要。