0

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

这是让我走到这一步的问题,谢谢Talkol的回答

在 Javascript 中使用 Haversine 公式

这就是我到目前为止所拥有的

  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);
}
4

2 回答 2

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>
于 2013-07-24T17:36:24.070 回答
0

您似乎没有声明latlng在范围内 - 它们当前被分配为异步getCurrentPosition回调函数中的局部变量,因此它们当前是undefined变量(而不是Number对象)。

您将需要getCurrent从回调中调用,并传入latandlng参数。您仍然需要将它们保留为Number对象 - 您的调用.toFixed将强制将它们转换为字符串,这也将阻止.toRad工作。

最后,您还应该只将.toRad函数添加Number.prototype一次,而不是每次getCurrent调用。

于 2013-07-23T10:51:58.190 回答