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

Posted

技术标签:

【中文标题】在带有变量的javascript中使用haversine公式【英文标题】:using the haversine formula in javascript with variables 【发布时间】:2013-07-23 10:43:07 【问题描述】:

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

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

【问题讨论】:

【参考方案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>

【讨论】:

感谢您花时间通过查看您所写的内容来回答我已经学到了很多关于构建我的功能的知识,我将尝试重新构建我在这些方面得到的东西。我也看到这类似于试图做的目标,但无法让它为我工作***.com/questions/13166261/… 6371 ...那公里不是米吗?例如,在纽约,半径是 6369087 米 @kuanb 你是对的我已经改变了答案以适应【参考方案2】:

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

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

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

【讨论】:

感谢您抽出宝贵时间回答我真的很感激,我想我还有很多东西要学,并且一直在阅读不同类型的异步函数,也许使用类似 var distance = new Function("lat1", "lat2", lon1, lon2, "return arg1 * arg2;"); 不,不要使用Function - 没有必要。

以上是关于在带有变量的javascript中使用haversine公式的主要内容,如果未能解决你的问题,请参考以下文章

使用带有样式组件的 Javascript 变量

如何在 django 模板中获取带有 javascript 变量的数组元素?

带有 InnerHtml 的 Javascript 变量不起作用

带有私有变量的JavaScript构造函数模式[重复]

如何在 javascript fetch() 方法上传递带有 url 的变量?

在 JavaScript 中使用带有字符串的开关