web-dev-qa-db-ja.com

地理的近接度を計算する数式

アプリケーションに地理的近接検索を実装する必要がありますが、使用する正しい式に関して非常に混乱しています。 WebとStackOverflowでいくつかの検索を行った結果、ソリューションが次のようになっていることがわかりました。

  1. Haversine Formulaを使用します
  2. Great-Circle Distance Formulaを使用します
  3. データベースでSpatial Search Engineを使用します

オプション#3は、私にとってATMではありません。 大循環距離式ハヴェルシン式同義語だったのにいつも間違っていたので、今は少し混乱しています。

Haversine Formula

上記のスクリーンショットは、素晴らしいMySQLでのジオ(近接)検索の論文からのもので、次の機能を使用しています。

ASIN, SQRT, POWER, SIN, PI, COS

のバリエーションも見ました同じ式 ( 余弦の球面法則、このように:

(3956 * ACOS(COS(RADIANS(o_lat)) * COS(RADIANS(d_lat)) * COS(RADIANS(d_lon) - RADIANS(o_lon)) + SIN(RADIANS(o_lat)) * SIN(RADIANS(d_lat))))

以下の機能を使用します。

ACOS, COS, RADIANS, SIN

私は数学の専門家ではありませんが、これらの式は同じですか?私はいくつかのより多くのバリエーションと式に出会いました(余弦の球の法則Vincenty's-これは最も正確だと思われます)、それは私をさらに混乱させます...

PHP/MySQLで実装するための適切な汎用式を選択する必要があります。上記の式の違いを説明できる人はいますか?

  • 計算が最も速いのはどれですか?
  • どれが最も正確な結果を提供しますか?
  • 速度/結果の精度の点でどれが最適ですか?

これらの質問に対する洞察力に感謝します。


theonlytheory answerに基づいて、次のGreat-Circle Distance Formulasをテストしました。

  • ビンセントフォーミュラ
  • ハーバーシンフォーミュラ
  • 余弦の球面法則

Vincenty Formulaは完全に遅いですが、かなり正確です(0.5 mmまで)

Haversine FormulaはVincenty Formulaよりもはるかに高速です。約6秒で100万回の計算を実行することができました。

余弦公式の球面法則は、Haversine公式のほぼ2倍の速さであり、ほとんどの使用例では精度の違いは怠慢ですであることが明らかになりました。


テスト場所は次のとおりです。

  • Google HQ37.422045-122.084347
  • カリフォルニア州サンフランシスコ37.77493-122.419416
  • フランス、エッフェル塔48.85822.294407
  • オペラハウス、シドニー-33.856553151.214696

Google HQ-カリフォルニア州サンフランシスコ:

  • ビンセントフォーミュラ:49 087.066 meters
  • Haversine Formula:49 103.006 meters
  • 余弦の球面法則:49 103.006 meters

Google HQ-エッフェル塔、フランス:

  • ビンセントフォーミュラ:8 989 724.399 meters
  • Haversine Formula:8 967 042.917 meters
  • 余弦の球面法則:8 967 042.917 meters

Google HQ-Opera House、Sydney:

  • ビンセントフォーミュラ:11 939 773.640 meters
  • Haversine Formula:11 952 717.240 meters
  • 余弦の球面法則:11 952 717.240 meters

ご覧のように、顕著な差はありません Haversine Formulaとコサインの球面法則の間にありますが、両方とも22キロメートルもの距離オフセット Vincenty Formulaと比較して球体の代わりに地球の楕円体近似を使用します。

67
Alix Axel

余弦の法則とHaversine Formulaは、無限の精度のマシンを想定して同一の結果をもたらします。 Haversine式は、浮動小数点エラーに対してより堅牢です。ただし、今日のマシンには有効桁数15桁の倍精度があり、余弦の法則がうまく機能する場合があります。これらの式は両方とも球体を想定していますが、Vicentyの反復解法(最も正確)は楕円体を想定しています(実際には地球は楕円体ではなく、ジオイドです)。いくつかの参照: http://www.movable-type.co.uk/scripts/gis-faq-5.1.html

より良くなります:コサインの法則で使用される緯度に注意してください。また、ヘイバーシンは、地心緯度であり、測地緯度とは異なります。球体の場合、これら2つは同じです。

計算が最も速いのはどれですか?

最速から最速への順序は、コサインの法則(5回のトリガー呼び出し)-> haversine(sqrtを含む)-> Vicenty(forループでこれを反復的に解決する必要があります)

どれが最も正確ですか?

ヴィセンティ。

速度と精度の両方を考慮する場合、どちらが最適ですか?

問題の領域が、計算しようとしている距離に対して地球が平らであると見なすことができる場合、x = kx *経度の差の形式の式を解くことができます(詳細は説明しません) 、y = ky *緯度の差。次に、距離= sqrt(dxdx + dydy)。問題の領域が距離の2乗で解けるようなものである場合、sqrtを取る必要はなく、この式はあなたが得る可能性がある限り速くなります。 vector距離-xは東方向の距離、yは北方向の距離を計算できるという利点があります。それ以外の場合は、3を試して、状況に最適なものを選択してください。

35
morpheus

だからあなたがしたい:

  • p0からの距離でレコードをソートします
  • p0からの距離がrより小さいレコードのみを選択します

秘Theは、そのために大円距離を正確に計算する必要がないことです! any関数を使用して、1組のポイントから実際の値に変換できますポイント間の円の距離が大きくなると厳密に増加します。そのような関数は多数あり、正確な大圏距離のさまざまな式よりも計算がはるかに速いものもあります。そのような関数の1つが3Dのユークリッド距離です。緯度と経度を球体上の3Dポイントに変換するには、逆三角関数は必要ありません。

X、Y、Zが得られると、p0での接平面からの距離も使用できるため、p0からポイントまでの距離は実際には必要ないことがわかります。その距離は大円距離とともに厳密に増加し、線形結合としてX、Y、Zから計算されます。平方根も必要ありません。必要な大円距離に対応する係数とカットオフ距離を事前に計算するだけです。

12
BASTA