2011-11-08 13 views
1

から返される:なぜNaNは、私はこの機能に問題があり、ユークリッド法

function encludean_method($lat1,$lon1,$lat2,$lon2) 
{ 
    $x1 = $lat1; 
    $y1 = $lon1; 
    $x2 = $lat2; 
    $y2 = $lon2; 
    $x = (pow($x2,2) - pow($x1,2)); 
    $y = (pow($y2,2) - pow($y1,2)); 
    $distance = (sqrt($x + $y)); 
    return $distance; 
} 

問題Iは、

(1.57454123333,103.6200516333,1.57483825,103.619484475) 

などのいくつかの値を上記の関数を呼び出すときにNaNを返します。誰も私になぜNaNが返され、それを解決する方法を教えてもらえますか?

+5

なぜ他の変数にパラメータを割り当てるのですか? – onatm

答えて

7

$ xと$ yは負の値(実際にはあなたの例で起こります)を仮定することができ、合計で$ x + $ yの負の式を生成します。私は、正しいバージョンの方のようではないでしょう、何をやっていることは右のすべてであるかどうかはわからない:

$x1 = $lat1; 
$y1 = $lon1; 
$x2 = $lat2; 
$y2 = $lon2; 
$x = $x2 - $x1; 
$y = $y2 - $y1; 
$distance = (sqrt(pow($x, 2) + pow($y, 2))); 
return $distance; 

平方根を計算する前に二乗することにより、あなたは正の値での動作を保証していますのみ。

+0

...または 'return sqrt(pow($ lat2 - $ lat1、2)+ pow($ lon2 - $ lon1,2));' ...しかし+1。 – DaveRandom

+0

非常にpolkageistありがとうございます。私は本当にあなたの返信を感謝します。 私は今理解しました – Alsaket

0

問題は、あなたのxの値があなたのyの負の値よりも小さいため、あなたが根をとろうとしている負の値になることです。

+0

ありがとうマーカス。 – Alsaket

1

があるため、間違ったアルゴリズムにより、この

function euclidean_method($lat1,$lon1,$lat2,$lon2) { 
    $x = $lat1-$lat2; 
    $y = $lon1-$lon2; 
    return sqrt($x*$x+$y*$y) 
} 
+0

マイケルありがとうございました。私はあなたの返事にとても感謝します – Alsaket

+0

問題ありません。 'pow'やそれがすべての言語で同等であるという一般的な注意は、一般に、乗算を実行するだけでは2乗に比べて効率が悪いということです。 (つまり、 '$ x * $ x'は' pow($ x、2) 'より速く実行されます) –

+0

これは本当に知っておいしいです。もう一度やってみよう。 もう1つ質問がありますか? 距離(戻り値)をメートルに変換する方法はありますか?関数に送られたパラメータは、2つの非常に近い位置の座標を表しています。 – Alsaket

0

を試してみてください。

function encludean_method($lat1,$lon1,$lat2,$lon2) 
{ 
    $x1 = doubleval($lat1); 
    $y1 = doubleval($lon1); 
    $x2 = doubleval($lat2); 
    $y2 = doubleval($lon2); 

    $x = doubleval(pow($x2 - $x1, 2.0)); 
    $y = doubleval(pow($y2 - $y1, 2.0)); 

    $distance = doubleval(sqrt($x + $y)); 

    return ($distance); 
} 

( X - X )<( X - X )。

あなたのコードはx = float(0.00093541820670495)y = float(-0.11753762299304)です。したがって、sqrt(x + y)はゼロに近すぎます。

地球表面上のその点の距離を取得しようとしている場合、使用している式はデカルト座標系にのみ適用できます。

緯度と経度は度で測定されていることに注意してください。だからあなたが得る数字はちょっとミステリアスです。)

私はちょっとグーグルで調べてから、興味深いサービスと数式を見つけました。ここでは、おそらく起動しようとしているコードは次のとおりです。

function encludean_method($lat1, $lon1, $lat2, $lon2) 
{ 
    $R = 6372.8; // km 

    $lat1 = deg2rad($lat1); 
    $lat2 = deg2rad($lat2); 
    $lon1 = deg2rad($lon1); 
    $lon2 = deg2rad($lon2); 

    $a = (cos($lat2) * cos($lon2)) - (cos($lat1) * cos($lon1)); 
    $b = (cos($lat2) * sin($lon2)) - (cos($lat1) * sin($lon1)); 
    $c = sin($lat2) - sin($lat1); 
    $ch = sqrt(pow($a, 2.0) + pow($b, 2.0) + pow($c, 2.0)); 
    $phi = 2.0 * asin($ch/2.0); 

    return $R * $phi; 
} 

さて、encludean_method(1.5745, 103.6200, 1.5748, 103.6195)戻り、おそらくあなたが探している距離である0.0648375378577値、。 kmで測定した。

ここではexampleone moreです(this answerに基づいています)。そして、そのコードを確認するために私が使ったserviceがあります。

これがあなたを手伝ってくれることを願っています! =)

+0

shybovychaありがとうございました。今はうまくいく。 もう1つ質問がありますか? 実際に関数に送信される2つの値は、これらの非常に近い位置間の距離を計算するために(経度と緯度)です。あなたはその距離の測定単位(戻り値)はどう思いますか? (マイル、キロ、またはメートル)? – Alsaket

+0

@alsaket最新の投稿を参照してください。 – shybovycha

関連する問題