数学関連の質問PHP+緯度
-
21-08-2019 - |
質問
この機能にPHPのページを計算するマイル数の2ポイントが故障している。本イベントは終了いたしました。仕事をgoogleマップでの距離から1.3 1.65倍になgoogleマップである。
この機能:
$M = 69.09 * rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));
いかれる方はもちろん、全てのビット複雑で、わからないことも形状を知る良いことです。
できる人、マネジメントのノウハウを見ることだと間違っているのですか?
解決
たぶん、あなたは、走行距離と「カラスが飛ぶように、距離」(2点間の直接のライン)を比較している?
他のヒント
あなたが持っている2点間の距離を計算するhref="http://en.wikipedia.org/wiki/Haversine_formula" rel="nofollow noreferrer">半正矢式の
JavaScriptでそれを単純に実装ここで見つけることができますする 、これはPHPに変換するのは簡単でなければなりません。
少なくとも三つのカップルの方法での算定の距離は地球の表面は希少かつ高価であるため、その正確性および必要な計算である。
- 球面法Cosines [あまり 精度、非常に簡単な計算]
- Haversine式 [正しく小さい距離も比較的簡単な計算]
- Vincenty式 [高精度を利用できる複数の楕円体モデルは地球の表面に複雑な計算]
の例ではお客様よりご提供いただいたが、法律のcosines計算をGoogleマップはより正確なので、Vincenty式です。(そのVincentyリンクの説明の式によりこのWikipediaページ)
編集:私のコメント上記のエラーの偏差は、地球の表面は自明であるが、できない構成のエラーです。私はtrue、非常に大きます。での距離カップル百キロ以内の誤差でき味不明した。
ここで簡単なバージョンですが、非常に遠隔地のために正確ではありません。
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;
}
$ポイントと$これはgetLatitude(とLocationクラスのインスタンス)とgetLongitude()メソッドです。
私はどちらかの幾何学について何も知りませんが、Googleはこのページ提案しましたA>あなたはそれを見つけるでしょう.Maybe便利な
式が正確であるように見えます - を参照して、例えば、ウィキペディア大圏距離」に「を。前で69.09の要因は、私はあなたの答えは、マイルになり、1度にマイル数が大円(赤道における経度1度に例えばマイル)に沿って測定した、と信じている。
あなたは間違って走行距離と直線距離を比較することがありますjonstjohnのアイデアは、私にとって最も可能性のある説明のように思える。
の編集の:またはそれはあなたが小さな分離で作業している場合、ウィキペディアは、言及丸め誤差である可能性があります。しかし、私は最初の直接/走行距離差で私の指を指すことになります。
それはあなたの用途に球面座標系を参照している計算のように見えます。式は、ほぼ正しいです。あなたの計算をオフに投げることができるものの一部は、使用している半径です。 69.09は、球体(この場合はアース)の半径です。ご存知の通り、地球は本当に楕円のより多くの球、ではありません。私がしようとお勧めしたい以下の処方ます:
3963 * acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2)));
より正確な結果を得るために、あなたはVincentyまたは半正矢計算を使用するとよいでしょう。
編集:明確にするために、私はあなたが報告しているエラーの大半が原因球状座標計算を使用していることを意味するつもりはありませんよ。そのエラーは、あなたが見ているものよりもはるかに小さいです。 Iが供給式調整は69.09は、単にラジアンを使用するよりも少ない直感的である程度システムに調整地球の半径の値であったように、式の明確バージョンであることを意図しました。さらに、それは限り、計算を行うシステムが十分に小数点以下で働いているとして上記の式を使用して、非常に小さな距離を計算するために(約1メートルの距離まで)非常に正確であることは注目に値します。現代のコンピューティングにフロートを使用すると、あなたにこの精度を与えます。