71

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

  1. ヘバーシン式を使用する
  2. 大圏距離公式を使用する
  3. データベースで空間検索エンジンを使用する

オプション #3 は、ATM のオプションではありません。大圏距離の式ハバーシンの式同義語だといつも思っていたので、少し混乱していますが、明らかに間違っていましたか?

ハバーシンフォーミュラ

上記のスクリーン ショットは、すばらしいGeo (proximity) Search with 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 の 数式など- 最も正確なようです) に出くわしましたが、それは私をさらに混乱させます...

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

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

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


唯一の理論的な答えに基づいて、次の大圏距離公式をテストしました。

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

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

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

コサインの球面法則式は、Haversine 式のほぼ 2 倍の速さであることが明らかになり、精度の違いはほとんどの使用例で無視されます。


ここにいくつかのテスト場所があります:

  • Google 本社( 37.422045-122.084347)
  • カリフォルニア州サンフランシスコ( 37.77493, -122.419416)
  • エッフェル塔、フランス( 48.8582, 2.294407)
  • オペラハウス、シドニー( -33.856553, 151.214696)

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

  • ヴィンセンティ式:49 087.066 meters
  • ハバーシン式:49 103.006 meters
  • 余弦の球面法則:49 103.006 meters

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

  • ヴィンセンティ式:8 989 724.399 meters
  • ハバーシン式:8 967 042.917 meters
  • 余弦の球面法則:8 967 042.917 meters

Google 本社 - オペラ ハウス、シドニー:

  • ヴィンセンティ式:11 939 773.640 meters
  • ハバーシン式:11 952 717.240 meters
  • 余弦の球面法則:11 952 717.240 meters

ご覧のとおり、Haversine Formula と Spherical Law of Cosines の間に目立った違いはありませんが、Vincenty Formula と比較して距離オフセットが 22 kmもあります。これは、球面ではなく地球の楕円体近似を使用するためです。

4

2 に答える 2

12

したがって、次のことを行います。

  • p0 からの距離でレコードを並べ替える
  • p0 からの距離が r 未満のレコードのみを選択する

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

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

于 2012-03-29T01:30:36.973 に答える