更新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