0

私はモバイル Web サイトの地理位置情報ツールに取り組んでいますが、これまでのところ次のようになっています。

ここからのジオロケーション検証

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(successFunction, errorFunction);
} else {
    console.log('Geolocation not enabled in your browser.');
}

Caspar の回答のtoRad()関数は次のとおりです

if (typeof(Number.prototype.toRad) === "undefined") {
    Number.prototype.toRad = function() {
        return this * Math.PI / 180;
    }
}

そして、最初のリンクからのsuccessFunction() 、 Movable Type Scriptsおよびその他のいくつかの変更:

function successFunction(position) {

    var lat1 = position.coords.latitude;
    var lon1 = position.coords.longitude;

    function calcdist(nLoja,nLat,nLong) {
        this.loja = nLoja;
        this.lat = nLat;
        this.long = nLong;
    }

    aLocal = new Array(3)
    aLocal[0] = new calcdist("leblon",-22.982279,-43.217792);
    aLocal[1] = new calcdist("ipanema",-22.98376,-43.212138);
    aLocal[2] = new calcdist("barra",-22.999118,-43.357867);

    var i = 0;
    //for (var i = 0; i < 4; i++){

        lat2 = aLocal[i].lat;
        lon2 = aLocal[i].long;

        var R = 6371;
        var dLat = (lat2-lat1).toRad();
        var dLon = (lon2-lon1).toRad();
        var lat1 = lat1.toRad();
        var lat2 = lat2.toRad();

        var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
        var d = R * c;

        var thediv = document.getElementById('locationinfo');
            thediv.innerHTML = '<p>Distance user-' + aLocal[i].loja + ': ' + d + '</p>';

    //}
}

これは、デスクトップと iPhone で問題なく動作します。問題は、i=0;行にコメントを付けて、for()直後のステートメントのコメントを外すと発生します (閉じ括弧も同様です)。Chrome のコンソールから次のエラーが返されます。

Uncaught TypeError: Cannot read property 'lat' of undefined

この行の場合:

lat2 = aLocal[i].lat;

ループの理由は、(ユーザーと各ショップの間の最小の距離を取得することによって) どのショップがユーザーに近いかを確認するために x 回の計算を実行したいからです。しかし、ループが許可されない理由がわかりません。

よろしくお願いします。

4

2 に答える 2

2

あなたのループ条件はi<4そうiなりますが0, 1, 2, 3、配列インデックスしかありません0, 1, 2

配列の長さを超えることはできないため、ループ条件を次のように変更して配列の長さまで移動します。i < aLocal.length

for(i = 0; i < aLocal.length; i++) {
于 2012-10-31T19:43:24.683 に答える
1

aLocalには 3 つの要素があります。ループは 0 から 3 になるため、4 つの要素になります。

for (var $i = 0; $i < aLocal.length; $i++) {
    //...
}
于 2012-10-31T19:42:44.950 に答える