web-dev-qa-db-ja.com

toRad()Javascript関数スローエラー

2つの緯度経度ポイント間の距離を計算しますか?(Haversine式) で説明されている手法を使用して、2つのポイント(緯度と経度を含む)間の距離を見つけようとしています。

コードは以下のJavascriptです。

var R = 6371; // Radius of the earth in km
var dLat = (lat2-lat1).toRad();  // Javascript functions in radians
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
        Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c; // Distance in km

しかし、実装しようとすると、Uncaught TypeError: Object 20 has no Method 'toRad'というエラーが表示されます。

.toRad()を動作させるために特別なライブラリまたは何かが必要ですか?なぜなら、2行目で台無しになっているようだからです。

60
ptamzz

関数宣言がありません。

この場合toRad()では、最初に次のように定義する必要があります。

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

ページの下部 のすべてのコードセグメントに従って

111
Caspar Kleijne

または私の場合、これは機能しませんでした。 jquery内でtoRad()を呼び出す必要があるためです。私は100%確信していないので、私はこれをしました:

function CalcDistanceBetween(lat1, lon1, lat2, lon2) {
    //Radius of the earth in:  1.609344 miles,  6371 km  | var R = (6371 / 1.609344);
    var R = 3958.7558657440545; // Radius of earth in Miles 
    var dLat = toRad(lat2-lat1);
    var dLon = toRad(lon2-lon1); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * 
            Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c;
    return d;
}

function toRad(Value) {
    /** Converts numeric degrees to radians */
    return Value * Math.PI / 180;
}
25

私はプロジェクトのポイント間の多くの距離を計算する必要があったので、先に進んでコードを最適化しようとしました、私はここで見つけました。異なるブラウザでの平均では、私の新しい実装は、ここで説明したよりもほぼ3倍高速です

function distance(lat1, lon1, lat2, lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = (lat2 - lat1) * Math.PI / 180;  // deg2rad below
  var dLon = (lon2 - lon1) * Math.PI / 180;
  var a = 
     0.5 - Math.cos(dLat)/2 + 
     Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * 
     (1 - Math.cos(dLon))/2;

  return R * 2 * Math.asin(Math.sqrt(a));
}

私のjsPerf(Bartのおかげで大幅に改善されました)でプレイして、 results here を確認できます。

23
Salvador Dali

上記の方程式を単純化して、いくつかの計算を同じにしてみませんか?

Math.sin(dLat/2) * Math.sin(dLat/2) = (1.0-Math.cos(dLat))/2.0

Math.sin(dLon/2) * Math.sin(dLon/2) = (1.0-Math.cos(dLon))/2.0

4
jostmey

私は同じ問題を抱えていた..キャスパーの答えを見て、クイックフィックスを行った:_Ctrl+H_(検索と置換)、.toRad()のすべてのインスタンスを_* Math.PI / 180_に置き換えた。それは私のために働いた。

ただし、ブラウザのパフォーマンス速度などはわかりません。私のユースケースでは、ユーザーが地図をクリックしたときにのみこれが必要になります。

1
Nikhil VJ

私はいくつかのことを変更しました:

_if (!Number.prototype.toRad || (typeof(Number.prototype.toRad) === undefined)) {
_

そして、argumentsのチェックがないことに気付きました。引数が定義されていることを確認し、おそらくparseInt(arg, 10)/parseFloatをそこで実行する必要があります。

0
Cody