2016-06-13 4 views
0

私は与えられた緯度/経度から特定の半径内の地球上の特定の点を見つけるために異なる式を試しています。私は '余弦の球法則'とHaversineの実装と信じているものを使ってきました。下記式についてsqlクエリの余弦/球面法則

、これらは変数である:

[$ LAT/$のLON] =原点

[緯度/経度] =第二の点の点が

[$半径=余弦

3959 * acos(cos(radians('.$lat.')) * cos(radians(latitude)) * cos(radians(longitude) - radians('.$lon.')) + sin(radians('.$lat.')) * sin(radians(latitude)))) <= '.$radius.'; 

半正矢の半径

球状の法則(少なくとも、私はそれだと思う!)

3959*3.1415926*sqrt((latitude-'.$lat.')*(latitude-'.$lat.') + cos(latitude/57.29578)*cos('.$lat.'/57.29578)*(longitude-'.$lon.')*(longitude-'.$lon.'))/180) <= '.$radius.';'; 

私は当初半正矢は限り精度としての金の標準だったと言って、多くの情報に出くわしました。しかし、余弦の球法則はHaversineよりも正確ですが、測定距離が5メートル以上である限り、より正確であるという意見もあるようです。さらに、Vincentyは正確さを両立すると言われています。

3つの質問:

は私の半正矢公式実際半正矢またはそれが何か他のものですか?

どのような考えが最も正確ですか?

誰でも私に上記フォーラムのラインに沿ってVincentyのための配合を教えてもらえますか?

ありがとうございました!

答えて

-1

私の答えはあなたの第一及び第二の答え

Q1のためのより具体的な次のようになります。それは何か他の私の半正矢式は実際に半正矢ですか?

私ドンは、あなたはそれが書き込み1を か、正確に半正矢式のSQLクエリは、Googleの開発者向けサイトからその Click Here For Details

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

最も近い見つかりますこのSQL文です作られたあなたの半正矢式を理解していません37、-122の座標に25マイル以内の20の位置。その行の緯度/経度とターゲットの緯度/経度に基づいて距離を計算し、距離値が25未満の行のみを求め、クエリ全体を距離で並べ替え、20の結果に制限します。マイルの代わりにキロメートルで検索するには、3959を6371に置き換えてください。

このSQLクエリに対して変更を加えることができます。

質問2:どのような考えが最も正確ですか?

誰が勝つことができるのかについての最終的な答えはありませんか?しかし、我々はそれに対処することができます:

1.Haversineはより高速です。

2.余弦の球法則は、小距離に対してより正確です。

そしてQ3について、私はvincenty式が最も正確であることを知っているが、それは最も遅い一つ

+0

Q1:あなたのお勧めの式は 'SELECT IDから始まり、(3959の* ACOS(' ...余弦式の球状の法則として 'acos'ブランドそれは、間違いない半正矢式Q2.1余弦はより高速ではありません。Q2.2余弦の球法則は、小さな差よりも正確ではありません。 –

0

あなたのいわゆる半正矢式は完全に間違っています。

まず、7つの左括弧と8つの右括弧が含まれています。

二次的に度からラジアンへの変換は、場合によっては57.29578で割ることによって行われます。正面には定数pi、背面には定数180があります。

第3のhaversine(x) = sin(x/2) ** 2と私はどこでも/ 2が表示されません。

第4に、asinファンクションコールが前面にあるはずです。

正しい式here

関連する問題