2011-10-27 74 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,左下LAT)

LAT2 = MAX(右上LAT,左下LAT)

LON1 = MIN(右上LON,底部-left LON)

LON2 = MAX(右上LON,左下LON)

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

不會處理反經絡。總理和赤道是容易的。你如何處理反? – JT703

+2

我沒有做一個涵蓋其中一個極點。 :P – Crontab

+0

好。我也不想要你。感謝編輯。 – JT703

-1

只需查找所有小於右邊緣且大於左邊緣的點,該點小於底邊並大於頂邊。

在4,4-點和您的右上方是(5,5)和左下角是(3,3) - 3 5爲x和3 5 y的。你有一場比賽。

+1

請解釋你的downvotes,它不會幫助任何人(包括我),如果你不留下解釋。 – Whetstone

相關問題