2009-06-25 9 views
7

私のDBには、中心点と半径(メートル)が格納されています。MySQLのHaversine公式の逆数ですか?

私はlat/lngを渡したいと思っています。私が保存したmysqlの値に、私が渡したポイントがその円の中にあるかどうかを教えてくれる円を作成させます。 haversine forumla(これは私の主張がすでにデータベースに入っていたと仮定します)と同様に、これを行うことを可能にするものがありますか?

半正矢式: (3959の* ACOS(COS(ラジアン(40))* COS(ラジアン(LAT))* COS(ラジアン(long) - ラジアン(-110))+罪(ラジアン(40)) * SIN(ラジアン(long)))

デシベル:

circleLatCenter、circleLngCenter半径

がどこLAT FOOから> 選択IDを渡し、円を機能させる(でLNG:circleLat、circleLng、半径)

答えて

2

私は偉大な円距離で境界ボックスを計算し、それをデータベースに照会することによって同様の地理的検索を行ってきました。バウンディングボックスからサークルに「角を丸める」ためには、アプリケーション内に別のパスが必要です。

  1. 計算DELTAX、点である。だから

    、ポイントのデータベースが与えられると、探索点(X、Y)との距離Dは、(X、Y)のD内のすべてのポイントを見つけます。距離DをY軸に沿って移動した場合

  2. デルタYを計算します。これは、距離DをX軸に沿って移動した場合のポイントです。
  3. あなたのバウンディングボックスを計算します。ポイントの(X-DELTAX、Y-deltaY移動)、(X + DELTAX、Y + deltaY移動)
  4. クエリデータベース演算子BETWEEN SQLを使用します。テーブルからWHERE X X-DELTAX BETWEEN *選択して、 X +デルタXとYの間Y-デルタYとY +デルタY
  5. 後処理実際の大きな円の距離を計算して戻し点のリストを返し、距離円内にない四角形の角の点を削除します。

ショートカットとして、私は通常、緯度と経度の両方の度数を計算します(赤道では、マイル単位の度数がポールでlonと異なるため)。deltaXと(D * degrees-Lat-per-mile)または度 - lon-per-mileとしてデルタYを使用します。私がすでにSQLクエリの後の実際の距離を計算しているので、赤道対極の違いはあまり重要ではありません。

FYI - 0.167469 0.014564度-LON-あたりのマイル、および0.014483度-LAT-あたりのマイル

+0

私は同じことをしています(正方形で最初のパスをし、斜辺の長さで角を丸めます)。しかし、あなたはこの投稿を書いて以来、それを行うより良い方法を見つけましたか? –

-1

私はこれが長年死んだ記事であることを知っていますが、これを誰もが遭遇した場合には、「逆向きの式」を作成する必要はありません。 Haversine公式は、点aと点bとの間の距離を与える。あなたの計算のために、ポイントbとポイントaとの間の距離が必要です。これらは同じ値です。

SELECT *, 
(3959 * acos(cos(radians(40)) * cos(radians(`circleLatCenter`)) * cos(radians(`circleLngCenter`) - radians(-110)) + sin(radians(40)) * sin(radians(`circleLngCenter`))) as `haversine` 
FROM `table` WHERE 1=1 
HAVING `haversine` < `Radius` 
+0

'acos()'はhaversine計算ではないことを意味し、 "cosinesの球法則"です。 –

関連する問題