更新2012年11月16日
我想再次提出這個問題,提供一個新的獎勵以獲得一個堅實的,良好的解決方案。看來只有解決方案(shubhansh
's answer)現在不能有效工作。我會解釋爲什麼。獲取落在數據庫標記半徑內的結果
首先,這是現場地圖我有半徑和人民,半徑在red
和人民都在blue
。
正如你所看到的,有two
人在這個地圖eight
半徑,基本上我只得到這是Person A
的人,但我沒有得到Person B
,我猜測SQL沒有正確地拾取它,我需要它從人的半徑和標記半徑精確而準確。
它看起來像拾取的是在半徑內,而不是那些重疊半徑,我需要它能夠獲取任何半徑相互重疊的任何結果。
我在尋找一個精確而準確的SQL比shubhansh的答案。您可以閱讀以下內容,瞭解我如何確切地查詢查詢並採集準確的人員。
的數據,PEOPLE:
+-----------+-----------+--------+
| latitude | longitude | radius |
+-----------+-----------+--------+
| 51.517395 | -0.053129 | 5.6 |
| 51.506607 | -0.116129 | 0.7 |
+-----------+-----------+--------+
請注意:radius
是以千米。
+-----------+-----------+-----+
| latitude | longitude | km |
+-----------+-----------+-----+
| 51.502117 | -0.103340 | 0.3 |
| 51.498913 | -0.120850 | 0.7 |
| 51.496078 | -0.108919 | 0.7 |
| 51.496506 | -0.095873 | 0.7 |
| 51.503399 | -0.090723 | 0.7 |
| 51.508049 | -0.100336 | 0.7 |
| 51.508797 | -0.112610 | 0.7 |
| 51.505535 | -0.125227 | 0.7 |
| 51.502331 | -0.108061 | 0.7 |
+-----------+-----------+-----+
當前的SQL我使用:
SELECT ppl.latitude,
ppl.longitude,
ppl.radius
FROM
(
people ppl
),
(
SELECT latitude, longitude
FROM radiuses
) AS radius
WHERE (POW((ppl.longitude - radius.longitude) * 111.12 * COS(ppl.latitude), 2) + POW((ppl.longitude - radius.longitude) * 111.12, 2)) <= 4
GROUP BY ppl.id
數據爲MySQL,你可以用它來測試您的查詢,
INSERT INTO radiuses (id, latitude, longitude, km) VALUES ('1', '51.502117', '-0.103340', '0.3'), ('2', '51.498913', '-0.120850', '0.7'), ('3', '51.496078', '-0.108919', '0.7'), ('4', '51.496506', '-0.095873', '0.7'), ('5', '51.503399', '-0.090723', '0.7'), ('6', '51.508049', '-0.100336', '0.7'), ('7', '51.508797', '-0.112610', '0.7'), ('8', '51.505535', '-0.125227', '0.7'), ('9', '51.502331', '-0.108061', '0.7');
INSERT INTO people (id, latitude, longitude, radius) VALUES ('1', '51.517395', '-0.053129', '5.6'), ('2', '51.506607', '-0.116129', '0.7');
舊總結
注意:所有的經度和緯度都是隨機產生的。
我有一個地圖applet,用戶可以將他的半徑放置在半徑爲1km的經緯度位置。
現在,還有另一個用戶可以在地圖上的任何位置放置他的半徑,每個半徑1km(與上面的用戶相同)。
像這樣用戶A是紅色並且用戶B是藍色。
基本上用戶A店他半徑中,看起來像這樣的表:
+-----------+---------+-----------+-----------+
| radius_id | user_id | latitude | longitude |
+-----------+---------+-----------+-----------+
| 1 | 1 | 81.802117 | -1.110035 |
| 2 | 1 | 81.798272 | -1.144196 |
| 3 | 1 | 81.726782 | -1.135919 |
+-----------+---------+-----------+-----------+
而且用戶B店他在另一個表看起來像這樣半徑 - (注:他們每個賬戶只能存儲1個座標):
+---------+-----------+-----------+
| user_id | latitude | longitude |
+---------+-----------+-----------+
| 6 | 81.444126 | -1.244910 |
+---------+-----------+-----------+
我希望能夠在地圖圖片中選取落在所定義的半徑範圍內的用戶,即使半徑圓正在觸摸。當A
和B
不需要時,只有標記C
才能夠拾取單個半徑。
我相信這是可能的,但我不知道如何在MySQL中想出這種系統。
我在Google Developers網站上發現了它,但它並不僅僅是我需要的功能。
編輯:我已經找到一個更好的,這是非常接近,但仍然不是我要找的,因爲它使用了1約束緯度,當我經度座標在一個表中有多個。
這可能是一個答案,給你一個提示http://stackoverflow.com/questions/11502469/find-records-with-lattitude-and-logintude/11502530#11502530你只是添加一個'WHERE距離<1234'到查詢。 – fdomig 2012-07-24 10:35:13