嗨我一直在努力使用有正弦公式来获取用户当前位置和数组中的对象之间的距离,我已经找到了这个问题的一个很好的答案但是当我尝试使用变量而不是实际坐标配方工作,希望有人会知道我哪里出错了
这是让我达到这一点的问题,谢谢Talkol的回答
Using the Haversine Formula in Javascript
这是我到目前为止所得到的
navigator.geolocation.getCurrentPosition (function (posa)
{
var lat = posa.coords.latitude.toFixed(6);
var lng = posa.coords.longitude.toFixed(6);
});
function getCurrent() {
var lat1 = lat;
var lon1 = lng;
var lat2 = 42.741;
var lon2 = -71.3161;
Number.prototype.toRad = function() {
return this * Math.PI / 180;
}
var R = 6371; // km
//has a problem with the .toRad() method below.
var x1 = lat2-lat1;
var dLat = x1.toRad();
var x2 = lon2-lon1;
var dLon = x2.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;
alert(d);
var distance = d
$("#distance").val (distance);
}
答案 0 :(得分:1)
我试图让您的代码正常运行。我最终使用了自己的代码。如您所见,lat2& lon2是全局声明的。两个函数Haversine()和deg2rad()在load()之外声明,带有参数和返回值。
<script type="text/javascript">
var lat2 = 42.741;
var lon2 = -71.3161;
function deg2rad(degrees){
radians = degrees * (Math.PI/180);
return radians;
}
function Haversine(lat1,lon1,lat2,lon2) {
deltaLat = lat2 - lat1 ;
deltaLon = lon2 - lon1 ;
earthRadius = 6369087 ; // in meters 3959 in miles.
alpha = deltaLat/2;
beta = deltaLon/2;
a = Math.sin(deg2rad(alpha)) * Math.sin(deg2rad(alpha)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(deg2rad(beta)) * Math.sin(deg2rad(beta)) ;
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
distance = earthRadius * c;
return distance.toFixed(2);
}
function load(){//Called on page load
if(navigator.geolocation)
{
navigator.geolocation.getCurrentPosition(function(position)
{
var lat1 = position.coords.latitude.toFixed(6);
var lon1 = position.coords.longitude.toFixed(6);
var distance = Haversine(lat1,lon1,lat2,lon2)+ " meters";
$("#distance").val (distance);
});
}
}
</script>
答案 1 :(得分:0)
您似乎没有在范围中声明lat
或lng
- 它们当前在异步getCurrentPosition
回调函数中被指定为局部变量,因此它们当前是{{ 1}}变量(而不是undefined
个对象)。
您需要在回调中调用Number
,并传入getCurrent
和lat
参数。您还需要将它们保留为lng
个对象 - 您对Number
的调用将强行将其转换为字符串,这也会阻止.toFixed
工作。
最后,您还应该只将.toRad
功能添加到.toRad
一次,而不是每次都调用Number.prototype
。