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
}

それで、誰かがおそらくそのlat / lngを別の方法で取得するためのアイデア/解決策を持っていますか、それとも私はこれについて完全に間違っていますか?

4

3 に答える 3

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 に答える
0

次の呼び出しがブロックされていない場合、これはまったく機能しません。

navigator.geolocation.getCurrentPosition(getCoords, getError);

これを呼び出す方法は、distanceFromCurrent() メソッドの終わりに到達する前に getCurrentPosition() の結果が完了しないことを意味します。

代わりに、次のようにして、distanceFromCurrent() の代わりに update() を呼び出すことができます。これにより、最終的に現在の緯度/経度の値を使用して 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 に答える
-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 に答える