0

2 地点間のマイル数を計算する関数を PHP ページで見つけましたが、これは正しくありません。Googleマップで動作するはずですが、距離の違いはGoogleマップでさらに1.3倍から1.65倍の範囲です(より正確です)。

関数は次のとおりです。

$M =  69.09 * rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));

少し複雑だと思いますが、これが正しいかどうかを知るためにジオメトリについてあまり知りません。

もう少しノウハウのある人がこれを見て、何が問題なのかを理解できますか?

4

7 に答える 7

5

「カラスが飛ぶ距離」(2 点間の直線) と走行距離を比較しているのではないでしょうか?

また、PHP での 2 点間の距離の計算については、この投稿を参照してください。

于 2009-03-19T20:19:35.140 に答える
2

地球の表面上の距離を計算するには、精度と必要な計算が異なる少なくとも 3 つの異なる方法があります。

  1. 余弦の球面法則[あまり正確ではなく、計算が非常に簡単]
  2. Haversine Formula [距離が短い場合を除いて正確ですが、計算は比較的簡単です]
  3. Vincenty Formula [非常に正確で、地球表面のいくつかの異なる楕円体モデルを使用でき、計算がより複雑]

あなたが提供した例は余弦計算の法則のようですが、Vincenty Formula を使用しているため、Google Maps の方が正確です。(Vincenty のリンクは、ウィキペディアのページよりも詳細に式を説明していることがわかります)

編集:地球の表面の偏差によって導入されたエラーは些細なものであり、あなたが見ているエラーを構成することはできないという上記のコメントを見ました。残念ながら、これは非常に長い距離にのみ当てはまります。数百キロ以下の距離では、誤差は明らかに重要です。

于 2009-03-19T20:38:27.403 に答える
2

経度と緯度がある 2 点間の距離を計算するためのHaversine 式を探しています。

Javascript での簡単な実装は、ここで見つけることができます。これは、PHP に簡単に変換できるはずです。

于 2009-03-19T20:27:47.117 に答える
1

これはより単純なバージョンですが、非常に離れた場所では正確ではありません:

    const ONE_DEGREE = 111120;

public function distance( $point ) {
    $coef = cos( $this->getLatitude() / 180 * M_PI );
    $x = $this->getLatitude() - $point->getLatitude();
    $y = ( $this->getLongitude() - $point->getLongitude() ) * $coef;
    $result = sqrt( $x * $x + $y * $y ) * self::ONE_DEGREE;
    return $result;
}

$point と $this は、getLatitude() と getLongitude() メソッドを持つ Location クラスのインスタンスです。

于 2009-03-20T05:04:04.070 に答える
0

私も幾何学について何も知りませんが、グーグルはこのページを提案しました。

于 2009-03-19T20:19:59.150 に答える
0

参照している計算では、球座標系が使用されているようです。式はほぼ正しい。計算がうまくいかない原因の一部は、使用している半径です。69.09 は球 (この場合は地球) の半径です。ご存知かもしれませんが、地球は実際には球体ではなく、楕円体です。以下の処方を試すことをお勧めします。

3963 * acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2)));

より正確な結果を得るには、Vincenty または Haversine 計算を使用する必要があります。

編集: 明確にするために、報告しているエラーの大部分が球面座標計算を使用しているためであることを暗示しようとしているわけではありません。そのエラーは、表示されているものよりもはるかに小さいです。69.09 は地球の半径を度数に合わせて調整した値であり、単純にラジアンを使用するよりも直感的ではないため、私が提供した公式調整は公式のより明確なバージョンになることを目的としていました。さらに、非常に短い距離を計算する場合、計算を行うシステムが十分な小数点以下の桁数で動作している限り、上記の式を使用すると (約 1m の距離まで) 非常に正確であることに注意してください。最新のコンピューティングで float を使用すると、この精度が得られます。

于 2009-03-19T20:28:11.920 に答える
0

式は正確なようです。たとえば、Wikipedia on "great circle distance"を参照してください。前の係数 69.09 は、大円に沿って測定された 1 度のマイル数 (たとえば、赤道での経度 1 度のマイル) であると私は信じているので、答えはマイルになります。

直線距離と走行距離を誤って比較している可能性があるという jonstjohn の考えは、私には最も可能性の高い説明のように思えます。

編集:または、小さな区切りで作業している場合、Wikipediaが言及している丸め誤差である可能性があります。しかし、私は最初に直接/走行距離の違いに指を向けます.

于 2009-03-19T20:28:18.863 に答える