在javascript中使用带有变量的hasrsine公式

时间:2013-07-23 10:43:08

标签: javascript geolocation haversine

嗨我一直在努力使用有正弦公式来获取用户当前位置和数组中的对象之间的距离,我已经找到了这个问题的一个很好的答案但是当我尝试使用变量而不是实际坐标配方工作,希望有人会知道我哪里出错了

这是让我达到这一点的问题,谢谢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);
}

2 个答案:

答案 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)

您似乎没有在范围中声明latlng - 它们当前在异步getCurrentPosition回调函数中被指定为局部变量,因此它们当前是{{ 1}}变量(而不是undefined个对象)。

您需要在回调中调用Number,并传入getCurrentlat参数。您还需要将它们保留为lng个对象 - 您对Number的调用将强行将其转换为字符串,这也会阻止.toFixed工作。

最后,您还应该只将.toRad功能添加到.toRad一次,而不是每次都调用Number.prototype