2011-10-27 2 views
2

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

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

+0

'describe [table_name];'を実行して、テーブル構造の出力をポストできますか? –

+0

エリアが単純な矩形/ボックスの場合はいつもですか? Whetstoneは簡単な答えを投稿しました。もっと複雑な場合は、http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.htmlが必要になる場合があります。 – nafisto

答えて

5

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

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

LON1 = MIN(右上LON、底-left LON)

LON2 = MAX

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

この方法であなたは子午線たり、ボックスで、赤道を越えた場合、クエリが処理する必要があります(右上経度、左下経度)。

180度の子午線(または反時計回り)を扱うには、右の数字を左の数字と比較し、正しい数字が負で、左の数字が正であるかどうかを確認する必要があります。もしそうなら、あなたは180度の子午線を越えました。あなたのクエリは、このようなものを見なければならないでしょう:

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

を私はむしろかかわらず、真の極のうちの1つの上に惑星の上部または下部に座っているボックスを処理する方法を考えないと思います。 =)

+1

は、反経絡を処理しませんでした。プライムと赤道は簡単です。あなたはどのようにアンチを扱いますか? – JT703

+2

私は1つの極をカバーするためのものではありません。 :P – Crontab

+0

良い。私はあなたも望んでいません。編集していただきありがとうございます。 – JT703

-1

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

ポイント4,4で、あなたの右上である(5,5)と左下である(3,3) - 3 5のxおよびyの3 5。あなたはマッチしている。

+1

説明を残さないと、あなたの下降音を説明してください。誰も(私を含めて)助けません。 – Whetstone

関連する問題