アプリケーションに地理的近接検索を実装する必要がありますが、使用する正しい式について非常に混乱しています。Web と StackOverflow でいくつか検索した結果、解決策は次のとおりであることがわかりました。
- ヘバーシン式を使用する
大圏距離公式を使用する- データベースで空間検索エンジンを使用する
オプション #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もあります。これは、球面ではなく地球の楕円体近似を使用するためです。