【发布时间】:2016-04-05 14:27:20
【问题描述】:
我正在尝试计算两个邮政编码之间的距离。一个邮政编码坐标是通用的,但是另一个邮政编码存储在我需要获取的数据库中。下面的代码无法计算出通用邮政编码与我输入的邮政编码之间的距离。
var x = getDistanceFromLatLonInKm(52.482799000000000, -2.000643000000000, 52.48463500000000, -1.980759000000000);
function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2){
console.log(lat1, lon1, lat2, lon2);
var distanceFromSpecificPoint = getDistanceFromLatLonInKm.bind(null, 52.486637, -1.890952);
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2 - lat1); // deg2rad below
var dLon = deg2rad(lon2 - lon1);
var a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(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; // Distance in km
return d;
}
function deg2rad(deg) {
return deg * (Math.PI / 180)
}
document.getElementById('result').textContent = x;
console.log(x)
</script>
【问题讨论】:
-
这条线试图做什么?对我来说似乎很奇怪。错误的函数签名,它似乎没有增加任何价值:
var distanceFromSpecificPoint = getDistanceFromLatLonInKm.bind(null, 52.486637, -1.890952); -
另外,您可能希望在
a的计算中放置一些括号。到目前为止,还没有检查过这些计算的数学有效性,但这是立即想到的一个可能的错误区域。您还可以在该计算中使用对 Math.pow 的一些调用来避免两次执行两个 sin 操作。 -
基于以下算法(我假设这是您从中派生代码的地方?),您的代码看起来正确:movable-type.co.uk/scripts/latlong.html。唯一的区别是他以米为单位返回值,而您以公里为单位返回值。假设算法是正确的,那么您的代码似乎是正确的。你的错误是什么?您的 javascript 函数是正确的。如果您想获得一段距离,只需调用您的 javascript 函数,并使用您从数据库中获得的 lat/lon 传入通用 lat/lon。你上面的电话对我来说很好:1.3618590385878444 公里。
-
@ManoDestra 我知道它是这样工作的,但是我试图让代码具有一个通用邮政编码(始终设置一个邮政编码)和另一个邮政编码根据它的属性进行更改,然后工作与每个属性的距离
标签: javascript geocoding distance haversine