2012年11月16日更新
我想再次提出这个问题,并为一个可靠、好的解决方案提供新的悬赏。似乎只有这个答案 (shubhansh
's answer) 现在不能有效地工作。我将解释原因。
首先,这是我拥有的带有半径和人员的实时地图,半径用红色
表示,人员用蓝色
表示。
正如你所看到的,这张地图上有两个
人和八个
半径,基本上我只得到了其中的一个人Person A
,但我没有得到Person B
,我猜测 SQL 查询没有正确地获取它,我需要准确且精确地从人的半径和标记的半径中获取结果。
似乎被捕捉到的是在半径内的内容,而不是重叠半径的内容,我需要能够捕捉到任何重叠的半径的任何结果。
我正在寻找比 shubhansh 答案更精确和准确的 SQL。您可以阅读下面的内容,了解我需要查询如何操作并获取准确的人员信息。
数据,人员:
+-----------+-----------+--------+
| 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');
旧摘要
注意: 所有的纬度和经度都是随机生成的。
我有一个地图小程序,用户可以在其中放置他们所在位置的半径,半径为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 |
+---------+-----------+-----------+
我希望能够选择在定义的半径内的用户,即使半径圆相互接触在地图图片上。只有标记C
才能捕捉到单个半径,而A
和B
则不能。
我相信这是可能的,但我不知道如何在MySQL中设计此类系统。
我在Google开发者网站上找到了一个相关的资料,但并不完全满足我的需求。
编辑:我找到了一个更好的资料,虽然它使用了1个纬度和经度坐标边界,但仍未满足我的要求,因为我在表格中有多个坐标边界。