JavaScript:无法从另一个函数获取变量值

时间:2015-09-01 17:50:01

标签: javascript

我面临从另一个函数获取变量值的问题。我试图从谷歌地图中获取该地点与当前位置的距离,但使用Haversine Formula计算距离。

我的HTML:

<p>
  <script>
  lat = "<?php echo $atm_row_data->latitude;?>";
  lng = "<?php echo $atm_row_data->longitude;?>";
  dist = getDistance(lat, lng);
  document.write(dist);
  </script>
</p>

我的JavaScript:

var curPosition;
var lat, lng;

/**** get current position ****/
function getPosition() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showCurrentPosition);
    } else {
        alert('Geolocation is not supported by this browser.');
    }
}

function showCurrentPosition(position) {
    lat = position.coords.latitude;
    lng = position.coords.longitude;
    curPosition = new google.maps.LatLng(lat, lng);
    console.log('curPosition: '+curPosition); <--- this works
}

/******** Haversine Formula of Getting Distance ********/
var rad = function(x) {
  return x * Math.PI / 180;
};

function getDistance(lt, lg) {
    console.log(curPosition); <--- this shows undefined
    var p1 = curPosition;
    var R = 6378137; // Earth’s mean radius in meter
    var dLat = rad(lt - p1.lat());
    var dLong = rad(lg - p1.lng());
    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(rad(p1.lat())) * Math.cos(rad(lt)) *
    Math.sin(dLong / 2) * Math.sin(dLong / 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c;
    if (d >= 1000)
        return Math.round( (d / 1000) * 100) / 100 + "Km";
    else
        return Math.round( (d * 100) / 100) + "m";
};
/******** END Haversine Formula of Getting Distance ********/

我哪里错了?

感谢任何帮助...

2 个答案:

答案 0 :(得分:1)

在您的脚本代码中,您的唯一电话getDistance(lat,lng),但永远不会调用showCurrentPosition(position)!因此变量curPosition未定义,因为它尚未定义

您需要为变量showCurrentPosition(position)调用curPosition来保存值。

也许在getPosition()函数的开头调用getDistance()可以解决问题,因为它似乎会调用showCurrentPosition

替代显示HTML中的位置(这只是一个快速片段,您可以根据自己的喜好调整它):

function getPositionHTML() {
    navigator.geolocation.getCurrentPosition(function(pos) {
        curPosition = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
    });
    return curPosition;
}

它基本上和你的其他功能一样,但它依赖于单一责任原则,所以一旦你调用了这个功能,你就可以随意操纵curPosition

答案 1 :(得分:1)

知道google api,navigator.geolocation有一个回调函数,所以showcurrentPostion是回调函数,但事情是你永远不会调用 getPosition()&lt; -

function getDistance(lt, lg) {
    console.log(curPosition); <--- this shows undefined <---- so this will always be undefined
    var p1 = curPosition;
    var R = 6378137; // Earth’s mean radius in meter
    var dLat = rad(lt - p1.lat());
    var dLong = rad(lg - p1.lng());
    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(rad(p1.lat())) * Math.cos(rad(lt)) *  <--- see comment
    Math.sin(dLong / 2) * Math.sin(dLong / 2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c;
    if (d >= 1000)
        return Math.round( (d / 1000) * 100) / 100 + "Km";
    else
        return Math.round( (d * 100) / 100) + "m";
};
  • 评论:&lt; ------ p1 curposition获取一个带有lat和long的google地图对象,我知道lat()不是一个函数,所以这会失败 所以即使你得到当前位置,上面的函数(getDistance())也会失败

首先调用getPosition()&lt; ---你需要获得位置

编辑:我看到你可以调用console.log而你说它有效,所以我认为这是一个范围问题,

我为你做了一个例子 - &gt; http://codepen.io/anon/pen/qOBMPj 我无法在笔中呈现googlemap,但您可以查看源代码,了解其完成方式。希望这能帮助你。

所以为了做这个计算,你真的不需要谷歌地图你只需要第一个和第二个坐标,但在谷歌地图上做点什么很有趣:)