9

私のDBには、中心点と半径(メートル単位)を格納します。

lat / lngを渡そうとしています。次に、保存したmysql値に円を作成して、渡したポイントがその円内にあるかどうかを知らせます。半正矢関数のフォーラムラ(私のポイントがすでにデータベースにあると想定している)のように、これを可能にする何かがありますか?

半正矢関数:(3959 * acos(cos(radians(40))* cos(radians(lat))* cos(radians(long)-radians(-110))+ sin(radians(40))* sin(radians(long) )))

db:

circleLatCenter、circleLngCenter、Radius

渡す>fooからidを選択します。ここでlat、lng in(円関数を作成:circleLat、circleLng、radius)

4

3 に答える 3

4

MySQL には、多数の空間データ関数があります。

MySQL の空間拡張

ジオメトリ間の関係の測定に関するセクションは、あなたが求めているものだと思います:

ジオメトリ間の関係

于 2009-06-25T20:10:31.253 に答える
3

大圏距離を介して境界ボックスを計算し、それをデータベースに照会することで、同様の地理的検索を行いました。境界ボックスから円に「角を丸める」には、アプリケーションで別のパスが必要です。

したがって、ポイントのデータベース、検索ポイント (X,Y)、および距離 D が与えられた場合、(X,Y) の D 内にあるすべてのポイントを見つけます。

  1. Y 軸に沿って距離 D を移動した場合の点である deltaX を計算します。
  2. X 軸に沿って距離 D を移動した場合のポイントである deltaY を計算します。
  3. 境界ボックスを計算します: (X-deltaX,Y-deltaY),(X+deltaX,Y+deltaY)
  4. ポイントのクエリ データベースは SQL BETWEEN 演算子を使用します: SELECT * FROM TABLE WHERE X BETWEEN X-deltaX AND X+deltaX AND Y BETWEEN Y-deltaY AND Y+deltaY
  5. 返されたポイントのリストを後処理し、実際の大円距離を計算して、距離円内にない正方形の角にあるポイントを削除します。

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

参考までに - 0.167469 ~ 0.014564 度 - 経度/マイル、および 0.014483 度 - 緯度/マイル

于 2009-06-25T19:34:11.000 に答える
-1

これはとっくに死んでいる投稿であることは承知していますが、誰かがこれに出くわした場合に備えて、「reverse hasersine formula」を作成する必要はまったくありません。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`
于 2014-01-23T04:15:06.423 に答える