1

この機能に問題があります:

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;
}

上記の関数を次のような値で呼び出すときの問題

(1.57454123333,103.6200516333,1.57483825,103.619484475)

戻りますNaNNaNそれが返される理由と解決方法を誰か教えてもらえますか?

4

4 に答える 4

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;

平方根を計算する前に 2 乗することで、正の値のみを操作することが保証されます。

于 2011-11-08T14:45:13.380 に答える
1

これを試して

function euclidean_method($lat1,$lon1,$lat2,$lon2) {
    $x = $lat1-$lat2;
    $y = $lon1-$lon2;
    return sqrt($x*$x+$y*$y)
}
于 2011-11-08T14:45:30.307 に答える
0

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

于 2011-11-08T14:45:17.187 に答える
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 1 2 - x 2 2 ) < (x 1 - x 2 ) 2 .

それがあなたのコードがx = float(0.00093541820670495)andを与えた理由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キロメートルで測定されます。

これがもう1つです(この回答に基づく)。そして、これがそのコードを検証するために使用したサービスです。

これがあなたを助けることを願っています! =)

于 2011-11-08T14:46:29.637 に答える