緯度/経度範囲内のすべてのレコードを照会するにはどうすればよいですか?

私は、世界の指定された領域内にあるすべてのレコードを見つけるMySQLクエリを作成しようとしています。各レコードにはポイント(緯度/経度)があり、指定されたエリアの右上(緯度/経度)と左下(緯度/経度)のコーナーがあります。

この情報を使用して、適切な記録をどのように見つけることができますか?

3
describe [table_name]; を実行して、テーブル構造の出力をポストできますか?
追加された 著者 p.matsinopoulos,
エリアが単純な矩形/ボックスの場合はいつもですか? Whetstoneは簡単な答えを投稿しました。複雑な場合は、 dev.mysql.com /doc/refman/5.0/en/spatial-extensions.html をご覧ください。
追加された 著者 nafisto,

2 答え

LAT1 = MIN(右上の緯度、左下の緯度)

LAT2 = MAX(右上の緯度、左下の緯度)

LON1 = MIN(右上、左下、左下)

LON2 = MAX(右上、左下、左下)

SELECT fields
FROM points
WHERE lat BETWEEN LAT1 AND LAT2
AND lon BETWEEN LON1 AND LON2

この方法では、Prime Meridianまたは赤道とあなたの箱を交差させた場合、クエリーが処理する必要があります。

180番目の子午線(または反アミメリアン)を扱うためには、右の数字と左の数字を比較し、正しい数字が負であり、左の数値が正であるかどうかを調べる必要があります。もしそうなら、あなたは180度の子午線を越えました。あなたのクエリは次のようになります。

SELECT fields
FROM points
WHERE lat BETWEEN LAT1 AND LAT2
AND (lon BETWEEN LON1 AND -180 OR lon BETWEEN LON2 AND 180)

私はむしろ真の極の上の惑星の上か下に座っている箱をどう扱うか考えるのではない。 =)

6
追加された
それは反経絡を扱わないだろう。プライムと赤道は簡単です。あなたはどのようにアンチを扱いますか?
追加された 著者 JT703,
良い。私はあなたも望んでいません。編集していただきありがとうございます。
追加された 著者 JT703,
これは経度が0度を超えるラッピングを処理しますか? (つまり、ロンドン、イングランド)、それはこれを処理しますか?
追加された 著者 NickG,
私はポールの一つをカバーするためのものではない。 :P
追加された 著者 Crontab,
@トライヤー:いいえ、あなたが言及したケースではうまくいかないかもしれませんが、OPは私たちに右上と左下の点を与えてくれるので、ほんの矩形である可能性が高いです。
追加された 著者 Crontab,
いい答えですが、4緯度と経度を使ってどのように検索できますか?
追加された 著者 harsh4u,
箱が経度で整列していないと(NY市の周りのダイヤモンドを想像してみてください)、これはうまくいかないと思います。一般的には、プロジェクションを使用し、ポイントを使用する必要がありますポリゴンテスト
追加された 著者 TreyA,
はい、私は上部と下部コーナーが与えられていることを再度読んでいます。私はlat/lonで記述された線形ボックスを見るとまだ神経質になっています;)
追加された 著者 TreyA,

右端よりも小さく、左端よりも大きいすべての点を探してください。左端よりも小さく、下端よりも小さく、上端よりも大きくなっています。

Point at 4,4 and your top right is (5,5) and bottom left is (3,3) - 3<4<5 for x and 3<4<5 for y. You've got a match.

1
追加された
あなたのdownvotesを説明してください、あなたが説明を残していない場合、それは誰も(私を含む)助けません。
追加された 著者 Whetstone,