2012-08-30 111 views
1

这个函数是异步的,在这种情况下,这是我的大部分问题。地理位置和计算从当前经纬度到另一经度纬度的距离

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

一切工作正常,除了我不能在其异步功能外使用currLatcurrLong

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 
} 

因此,没有人有一个想法/解决方案可能获得该纬度/经度不同的方式或我要对这个完全错误的?

+0

您是否找到解决方案?把你的函数放在回调函数中,不幸的是javascript如何工作 – 2012-08-30 20:00:34

回答

0

参数添加在您的distanceFromCurrent功能,并调用它inyour回调,其中的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(" "); 
//.... 
-1

getCorrentPosition是异步的。 您需要发送一个指向将与数据一起使用的funcion的指针作为第一个参数。 示例

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

+0

为什么我得到一个'-1'? – brunoais

0

以下呼叫被封锁没有那么这将无法工作。

navigator.geolocation.getCurrentPosition(getCoords, getError); 

的方式您的通话,这意味着getCurrentPosition的结果()不会有你达到distanceFromCurrent()方法的年底前完成。

相反,您可以执行以下操作并调用update()而不是distanceFromCurrent()。这将最终调用您的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); 
    ... 
} 
相关问题