我正在創建一個MySQL查詢,查找在世界指定區域內的所有記錄。每條記錄都包含一個點(緯度/經度),並且我有指定區域的右上角(經度/緯度)和左下角(經度/緯度)。如何查詢緯度/經度範圍內的所有記錄?
有了這些信息,我該如何找到合適的記錄?
我正在創建一個MySQL查詢,查找在世界指定區域內的所有記錄。每條記錄都包含一個點(緯度/經度),並且我有指定區域的右上角(經度/緯度)和左下角(經度/緯度)。如何查詢緯度/經度範圍內的所有記錄?
有了這些信息,我該如何找到合適的記錄?
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)
我寧願沒有想到如何處理一個盒子,對地球上真正的一極的頂部或底部坐鎮,雖然。 =)
只需查找所有小於右邊緣且大於左邊緣的點,該點小於底邊並大於頂邊。
在4,4-點和您的右上方是(5,5)和左下角是(3,3) - 3 5爲x和3 5 y的。你有一場比賽。
請解釋你的downvotes,它不會幫助任何人(包括我),如果你不留下解釋。 – Whetstone
你可以運行'describe [table_name];'併發布表結構的輸出嗎? –
如果區域總是一個簡單的矩形/框? Whetstone爲此發佈了簡單的答案。如果它更復雜,你可能需要這個http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html。 – nafisto