1

这个函数是异步的,在这种情况下这是我的大部分问题。

我想获取我所在位置的当前经度和纬度,然后我可以在distanceFromCurrent函数中使用它们来计算我当前位置和给georss定点之间的距离。

除了我不能在它的异步函数之外 使用currLat和之外,一切都很好。currLong

function getCurrentPosition(){
    navigator.geolocation.getCurrentPosition(getCoords, getError);
}

function getCoords(position){
    var currLat = position.coords.latitude;
    var currLon = position.coords.longitude;
}

function getError(error) {
    alert("Error");
}

// convert degrees to radians
Number.prototype.toRad = function() 
{ 
    return this * Math.PI / 180;
}

这是计算与当前纬度和经度的距离的函数,georss它可以像现在一样使用设置的纬度/经度。

function distanceFromCurrent(georss) 
{  
    getCurrentPosition();
    var currLat = 3.0;
    var currLon = 4.0;

    georss = jQuery.trim(georss);
    var pointLatLon = georss.split(" ");
    var pointLat = parseFloat(pointLatLon[0]);
    var pointLon = parseFloat(pointLatLon[1]);

    var R = 6371;                   //Radius of the earth in Km             
    var dLat = (pointLat - currLat).toRad();    //delta (difference between) latitude in radians
    var dLon = (pointLon - currLon).toRad();    //delta (difference between) longitude in radians

    currLat = currLat.toRad();          //conversion to radians
    pointLat = pointLat.toRad();

    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(currLat) * Math.cos(pointLat);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));   //must use atan2 as simple arctan cannot differentiate 1/1 and -1/-1
    var distance = R * c;   //sets the distance

    distance = Math.round(distance*10)/10;      //rounds number to closest 0.1 km
    return distance;    //returns the distance
}

那么,有没有人有想法/解决方案来以不同的方式获得纬度/经度,或者我是否完全错误地解决了这个问题?

4

3 回答 3

0

如果下面的调用没有阻塞,那么这根本不起作用。

navigator.geolocation.getCurrentPosition(getCoords, getError);

您调用此方法的方式意味着 getCurrentPosition() 的结果在您到达 distanceFromCurrent() 方法的末尾之前不会完成。

相反,您可以执行以下操作并调用 update() 而不是 distanceFromCurrent()。这最终将使用当前的 lat/lng 值调用您的 distanceFromCurrent() 方法。

注意:以下是伪代码,我怀疑它是否会正确传递您的 georss 值。

update()
{
 getCurrentPosition();
}
function getCurrentPosition(){
 navigator.geolocation.getCurrentPosition(getCoords, getError);
}

function getCoords(position){
 var currLat = position.coords.latitude;
 var currLon = position.coords.longitude;
 distanceFromCurrent(georss, lat, lng);
}

function distanceFromCurrent(georss, lat, lng) 
{  
    // Remove -> getCurrentPosition();
    var currLat = lat;
    var currLon = lng;

    georss = jQuery.trim(georss);
    ...
}
于 2012-08-30T17:04:22.440 回答
0

在你的 distanceFromCurrent 函数中添加参数,并在你的回调中调用它,其中 georss 是一个全局变量:

var georss = "43.12 7.12";

function getCoords(position){
    var currLat = position.coords.latitude;
    var currLon = position.coords.longitude;
    var distance = distanceFromCurrent(lat, lon, georss);
}

function distanceFromCurrent(georss, currLat, currLon){  
    // getCurrentPosition();
    // var currLat = 3.0;
    // var currLon = 4.0;
    georss = jQuery.trim(georss);
    var pointLatLon = georss.split(" ");
//....
于 2012-08-30T17:01:11.567 回答
-1

getCorrentPosition 是异步的。您需要发送一个指针作为第一个参数,该指针指向将处理数据的函数。例子

navigator.geolocation.getCurrentPosition(function(position) {
  var latitude = position.coords.latitude
  var longitude =  position.coords.longitude;
  distanceFromCurrent(currLatitude, currLongitude, latitude, longitude);
});

这应该是您开始的好方法。

问题是你试图以错误的方式解决你的问题。您应该调用 getCurrentPosition 并处理其中所有返回的数据。也许这样的事情(对你的功能进行一些更改)可以解决问题。

请记住,javascript 从不休眠(没有休眠),因此“现在”无法完成的所有事情都需要推迟。这就是这种方法所发生的事情。您需要考虑向函数发送回调而不是返回。因为我没有你所有的代码,所以我不知道如何转换它。但基本上你需要:

function distanceFromCurrent(georss, callback) 
{ //...

您可以在这里查看完整信息: https ://developer.mozilla.org/en-US/docs/Using_geolocation

于 2012-08-30T17:03:43.390 回答