toRad()Javascript函数抛出错误
我正在使用这里描述的技术来计算两点之间的距离(我有纬度和经度), 计算两个纬度 – 经度点之间的距离? (半乳糖配方)
代码如下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()的工作? 因为它似乎正在搞砸在第二线。
你缺less一个函数声明。
在这种情况下, 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; }
我需要为我的项目计算点之间的很多距离,所以我继续尝试优化代码,我已经在这里find了。 平均而言,在不同的浏览器中,我的新实现比这里提到的要快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(这是感谢巴特大大改善),并在这里看到的结果 。
为什么不简化上面的等式和相同的几个计算?
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
我有同样的问题..看着卡斯帕的回答,我只是做了一个快速修复: Ctrl+H
(查找和replace),用* Math.PI / 180
代替.toRad()
所有实例。 这对我有效。
不知道在浏览器的性能速度等等,虽然..我的用例只有当用户点击地图时需要这个。
我改变了一些东西:
if (!Number.prototype.toRad || (typeof(Number.prototype.toRad) === undefined)) {
而且,我注意到没有检查的arguments
。 你应该确保args被定义,并且可能在那里做一个parseInt(arg, 10)
/ parseFloat
。