Javascript 距离您的位置计算器的距离存在错误

Javascript 距离您的位置计算器的距离存在错误,javascript,html,coordinates,distance,nan,Javascript,Html,Coordinates,Distance,Nan,我需要一个工具来测量一个固定点和我的位置之间的距离。我使用代码计算距离,并创建了从浏览器获取坐标的零件。 Get distance()返回NaN。怎么了 变量选项={ EnableHighAccurance:正确, 超时:5000, 最大值:0 }; navigator.geolocation.getCurrentPosition(成功、错误、选项); 功能成功(pos){ var lat1=位置坐标纬度; var lon1=位置坐标经度; var lat2=50;//样本目标纬度 var

我需要一个工具来测量一个固定点和我的位置之间的距离。我使用代码计算距离,并创建了从浏览器获取坐标的零件。 Get distance()返回NaN。怎么了

变量选项={ EnableHighAccurance:正确, 超时:5000, 最大值:0 }; navigator.geolocation.getCurrentPosition(成功、错误、选项); 功能成功(pos){ var lat1=位置坐标纬度; var lon1=位置坐标经度; var lat2=50;//样本目标纬度 var lon2=20;//样本目标经度 } 函数错误(err){ document.getElementById('demo').textContent=“错误。”; } //哈弗森公式 函数getDistance(lat1、lon1、lat2、lon2){ var R=6371;//地球半径,单位为km var dLat=deg2rad(lat2-lat1);//下面是deg2rad var-dLon=deg2rad(lon2-lon1); 变量a= 数学单(dLat/2)*数学单(dLat/2)+ 数学cos(deg2rad(lat1))*数学cos(deg2rad(lat2))* 数学单(dLon/2)*数学单(dLon/2); var c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a)); var d=R*c;//以公里为单位的距离 返回d; } 功能deg2rad(度){ 返回度*(数学PI/180) } 最终功能(getDistance、success、lat1、lon1、lat2、lon2、pos){ document.getElementById('demo').textContent=“距离:”+getDistance(lat1、lon1、lat2、lon2、success); } 最终(距离);
存在多个问题:

  • 是异步的。在调用
    final
    时,
    success
    尚未执行
  • 您的
    success
    函数声明局部变量。它们不能在它之外使用
  • 使用单个参数调用
    final
    ,而不提供
    lat1
    lat2
下面是一个示例(StackSnippets不允许使用该位置)

以及代码的固定版本:

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0
};
navigator.geolocation.getCurrentPosition(success, error, options);

function success(pos) {
  var lat1 = pos.coords.latitude;
  var lon1 = pos.coords.longitude;
  var lat2 = 50; //Sample target latitude
  var lon2 = 20; //Sample target longitude

  final(getDistance, lat1, lon1, lat2, lon2); // <-- call it from here
}

function error(err) {
  document.getElementById("demo").textContent = "Error.";
}

//haversine formula

function getDistance(lat1, lon1, lat2, lon2) {
  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);
}

function final(getDistance, lat1, lon1, lat2, lon2) {
  document.getElementById("demo").textContent = "Distance: " + getDistance(lat1, lon1, lat2, lon2);
}
var选项={
EnableHighAccurance:正确,
超时:5000,
最大值:0
};
navigator.geolocation.getCurrentPosition(成功、错误、选项);
功能成功(pos){
var lat1=位置坐标纬度;
var lon1=位置坐标经度;
var lat2=50;//样本目标纬度
var lon2=20;//样本目标经度

final(getDistance,lat1,lon1,lat2,lon2);//您只使用单个参数调用
final(getDistance);
,因此所有其余参数都未定义(
success
lat1
lat2
,…)。并且您的
success
函数什么也不做。它声明无法从外部访问的变量,并且对这些变量不做任何操作,不返回任何内容。如果我在其中放置其他参数,则会发生错误:未捕获引用错误:lat1未定义,因为它也未定义。您从未声明
lat1
变量B在
success
函数之外可以访问的le。还请注意。因此,在
success
函数有机会执行之前,您的
final
函数被调用。我认为您应该在阅读其他任何内容之前阅读此…: