我正试图使用Calculate distance between two latitude-longitude points? (Haversine formula)
中描述的技术找到两点之间的距离(我有纬度和经度)代码如下 使用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()工作?因为它似乎是 拧紧第二条线。
答案 0 :(得分:109)
您缺少函数声明。
this case toRad()
必须首先定义为:
/** Converts numeric degrees to radians */
if (typeof(Number.prototype.toRad) === "undefined") {
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
}
根据代码段bottom of the page
答案 1 :(得分:25)
或者在我的情况下,这不起作用。这可能是因为我需要在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;
}
答案 2 :(得分:21)
我需要计算项目各点之间的距离,所以我继续尝试优化代码,我在这里找到了。平均而言,在不同的浏览器中,我的新实现的运行速度比此处提到的快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得到了很大改善)并且看到了results here。
答案 3 :(得分:4)
为什么不简化上面的等式和相同的几个计算?
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
答案 4 :(得分:1)
我遇到了同样的问题..看看Casper的答案,我刚做了一个快速修复:Ctrl+H
(查找和替换),
替换了.toRad()
的所有实例
与* Math.PI / 180
。这对我有用。
不知道浏览器的性能速度等等。但是,当用户点击地图时,我的用例只需要这个。
答案 5 :(得分:0)
我改变了一些事情:
if (!Number.prototype.toRad || (typeof(Number.prototype.toRad) === undefined)) {
并且,我注意到没有检查arguments
。你应该确保定义了args并且可能在那里做了parseInt(arg, 10)
/ parseFloat
。