0

JQMとPhonegapを使用しています。2点間の距離を計算する機能があります。私はこれをXcodeで行っており、シミュレーターにlat = 51.4863 long=-3.179169を与えました。

distance = function(lat1, lon1, lat2, lon2, unit) 
{ 
    var radlat1 = Math.PI * lat1/180;
    var radlat2 = Math.PI * lat2/180;
    var radlon1 = Math.PI * lon1/180;
    var radlon2 = Math.PI * lon2/180;
    var theta = lon1-lon2;
    var radtheta = Math.PI * theta/180;
    var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
    dist = Math.acos(dist);
    dist = dist * 180/Math.PI;
    dist = dist * 60 * 1.1515;
    dist = dist * 1.609344;
    if (unit=="M") { dist = dist / 1.609344 ;}
    if (unit=="N") { dist = dist * 0.8684 ;}
    alert(dist);
    return dist;
}

距離を返したい場所のデータベースもあります。

db.transactions executeSQLの成功コールバックから呼び出された場合、distance関数は間違った数値を返します。

ただし、getCurrentPositionの成功コールバックでこの関数を呼び出すと、正常に機能します。ここでSQLSelectQueryも実行していることに注意してください。

関数が機能しているときの私のコードは以下のとおりです。

$( document ).delegate("#mfinder", "pageinit", function() {

  var db = window.openDatabase("Database", "1.0", "location Data", 200000);
  db.transaction(inputData, errorCB, inputDataSuccess);
});

function inputData(tx) {
    tx.executeSql('DROP TABLE IF EXISTS locations');
    tx.executeSql('CREATE TABLE locations (id UNIQUE, name, lat, lon, pcode)');
    tx.executeSql('INSERT INTO locations VALUES (1, "My house", 51.4863, -3.179169, "E20QP")');
    tx.executeSql('INSERT INTO locations VALUES (2, "Manchester", 51.548577,0.708275, "ABC123")');
}

function inputDataSuccess() {
    var db = window.openDatabase("Database", "1.0", "location Data", 200000);
    db.transaction(readLocations, errorCB);
}

function readLocations(tx) {
    tx.executeSql('select * from locations', [], getDistance, errorCB);
}

function getDistance (tx, r){
    d1 = r.rows.item(1).lat;
    d2 = r.rows.item(1).lon;
    d3 = r.rows.item(1).name;
}

$("#fm").click(function() {
navigator.geolocation.getCurrentPosition(onSuccess, onError);
});

function onSuccess(position) {
    clat = position.coords.latitude;
    clon = position.coords.longitude;
    var x = distance(clat, clon, d1, d2, "M");
    alert(x); //THIS WORKS!
}

関数が間違った数値を返す場合、私のコードは次のようになります。

clat = 0;
clon = 0;
$("#fm").click(function() {
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
    var db = window.openDatabase("Database", "1.0", "location Data", 200000);
    db.transaction(inputData, errorCB, inputDataSuccess);
});

function onSuccess(position) {
    clat = position.coords.latitude;
    clon = position.coords.longitude;
}

function inputData(tx) {
    tx.executeSql('DROP TABLE IF EXISTS locations');
    tx.executeSql('CREATE TABLE locations (id UNIQUE, name, lat, lon, pcode)');
    tx.executeSql('INSERT INTO locations VALUES (1, "My house", 51.4863, -3.179169, "E20QP")');
    tx.executeSql('INSERT INTO locations VALUES (2, "Manchester", 51.548577,0.708275, "ABC123")');
}

function inputDataSuccess() {
    var db = window.openDatabase("Database", "1.0", "location Data", 200000);
    db.transaction(readLocations, errorCB);
}

function readLocations(tx) {
    tx.executeSql('select * from locations', [], getDistance, errorCB);
}

function getDistance (tx, r){
    d1 = r.rows.item(1).lat;
    d2 = r.rows.item(1).lon;
    d3 = r.rows.item(1).name;
var milesAway = distance(clat, clon, d1, d2, "M"); //wrong figures!!!
alert(milesAway);
}

それが機能し、次のようになる最初の方法.... PageInitで、データを作成し、メモリにデータを選択しています。次に、「クリック」機能により、位置情報サービスが有効になり、距離機能が実行されます。

2番目のシナリオは、pageinitで何も起こらず、すべてがClickイベントにあります。ここでは、最初にユーザーの位置を取得してから、データベースを実行し、1つのデータ行を取得して距離を計算します。

さて、誰かが私が間違った数字を取得している理由を教えてもらえますか?理想的には、2番目のコードベースを機能させたいのですが、そうすれば、たとえばDIV要素に追加するために大量のデータをループできます。私の問題を見てくれた人に感謝します。

4

1 に答える 1

0

コードを非同期で呼び出していないためだと確信しています。DB トランザクションが実行される前に clat と clone が設定されることを期待しています。getPosition の呼び出しは非同期であるため、おそらく getDistance メソッドの後に返されるため、誤った結果が返されます。clat と clon を設定した後、onSuccess メソッドで window.openDatabase と db.transaction() を呼び出すように設定してみてください。これで正しい結果が得られるはずです。

于 2012-06-14T13:26:49.173 に答える