我面临从另一个函数获取变量值的问题。我试图从谷歌地图中获取该地点与当前位置的距离,但使用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 ********/
我哪里错了?
感谢任何帮助...
答案 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";
};
首先调用getPosition()&lt; ---你需要获得位置
编辑:我看到你可以调用console.log而你说它有效,所以我认为这是一个范围问题,
我为你做了一个例子 - &gt; http://codepen.io/anon/pen/qOBMPj 我无法在笔中呈现googlemap,但您可以查看源代码,了解其完成方式。希望这能帮助你。
所以为了做这个计算,你真的不需要谷歌地图你只需要第一个和第二个坐标,但在谷歌地图上做点什么很有趣:)