8

私の webapp では、1 から n の場所の緯度/経度座標を含むデータベース クエリからの JSON データ応答があります。data[i]その場所から現在位置までの方位を計算したい。

ここでコードを修正しましたが、返された方位が正しくありません。

//starting lat/long along with converting lat to rads
var endLat = toRad(location.lat());        
var endLong = location.lng();

//loop over response, calculate new headings for links and add link to array
for(var i=0; i<data.length; i++){

  //this link's lat/long coordinates, convert lat to rads
  var startLat = toRad(data[i].lat);
  var startLong = data[i].lon;

  //get the delta values between start and end coordinates in rads
  var dLong = toRad(endLong - startLong);

  //calculate 
  var y = Math.sin(dLong)*Math.cos(endLong);
  var x = Math.cos(startLat)*Math.sin(endLat)-Math.sin(startLat)*Math.cos(endLat)*Math.cos(dLong);
  var bearing = Math.atan(y, x);
  bearing = (toDeg(bearing) + 360) % 360;

  panoLinks.push({'heading': bearing, 'description': data[i].description, 'pano': data[i].description});
}

//radian/degree conversions
function toRad(convert){
  return convert * Math.PI/180;
}

function toDeg(convert){
  return convert * 180/Math.PI;
}

上記の関数と値の使用

startLat= 43.6822, converts to 0.7623982145146669 radians
startLong= -70.450769

endLat= 43.682211, converts to 0.7623984065008848 radians
endLong= -70.45070

dLong = startLong - endLong, converts to 0.0000011170107216805305 radians

のコンパス度になります。

bearing= 0.000014910023935499339

これは間違いなくオフです。どこで間違ったのですか?

4

3 に答える 3

7

これは、受け入れられた回答の編集であり、私にとっては機能するようにいくつかの変更が加えられています(主に、緯度、経度値での toRad 関数の使用)。

    var geo = {
        /**
         * Calculate the bearing between two positions as a value from 0-360
         *
         * @param lat1 - The latitude of the first position
         * @param lng1 - The longitude of the first position
         * @param lat2 - The latitude of the second position
         * @param lng2 - The longitude of the second position
         *
         * @return int - The bearing between 0 and 360
         */
        bearing : function (lat1,lng1,lat2,lng2) {
            var dLon = this._toRad(lng2-lng1);
            var y = Math.sin(dLon) * Math.cos(this._toRad(lat2));
            var x = Math.cos(this._toRad(lat1))*Math.sin(this._toRad(lat2)) - Math.sin(this._toRad(lat1))*Math.cos(this._toRad(lat2))*Math.cos(dLon);
            var brng = this._toDeg(Math.atan2(y, x));
            return ((brng + 360) % 360);
        },

       /**
         * Since not all browsers implement this we have our own utility that will
         * convert from degrees into radians
         *
         * @param deg - The degrees to be converted into radians
         * @return radians
         */
        _toRad : function(deg) {
             return deg * Math.PI / 180;
        },

        /**
         * Since not all browsers implement this we have our own utility that will
         * convert from radians into degrees
         *
         * @param rad - The radians to be converted into degrees
         * @return degrees
         */
        _toDeg : function(rad) {
            return rad * 180 / Math.PI;
        },
    };

    /** Usage **/
    var myInitialBearing = geo.bearing(0,0,45,45);

理論とオンライン計算機は、 http ://www.movable-type.co.uk/scripts/latlong.html で検索できます。

于 2015-01-14T09:32:48.357 に答える
3

短距離で非常に大まかな方法​​が必要な場合は、地球半径6,378,137m(WGS84回転楕円体の半主軸の長さ)を使用して、緯度と経度の差に基づいて三角形の辺を計算できます。次に、適切な方位を計算します。それは真の方位になりますが、短距離では十分に接近している可能性があります。

局所的な磁気偏角を計算するには、ユーザーに任せる必要があります。

例えばあなたの例のために:

startLat  = 43.6822
startLong = -70.450769

endLat  = 43.682211
endLong = -70.45070

diff lat  = 0.000011 = 1.22m
diff long = 0.000069 = 7.68m

終点は始点の北と東にあるため、方位は次のように見つけることができます。

tan a = 7.68 / 1.22
    a = 81°

つまり、方向は東から北です。

これはおそらくマッピングと測量のスレッドにあるはずです。数学がうまくいったら、ここに来て解決策を見つけてください。

編集

緯度をメートルに変換するには、最初に赤道(または任意の大円)での地球の円周を計算します。

c = 2πR where r = 6378137m
  = 40,075,000 (approx)

次に、360°から円周の比率を取得します。

dist = c * deg / 360
     = 40,075,000m * 0.000011° / 360°
     = 1.223m

経度の場合、緯度が極に近づくにつれて距離が狭くなるため、同じ式が使用され、結果に緯度の正弦が乗算されます。

     = 40,075,000m * 0.000069° / 360° * cos(0.000011°)
     = 7.681m

地球半径の値は必ずしも正確ではありません。地球は完全な球体ではありません(扁球、一種の洋ナシの形をしています)。精度を高めるために、さまざまな場所でさまざまな近似が使用されていますが、私が使用したもので十分です。

于 2012-07-10T15:21:04.290 に答える