【发布时间】:2012-07-20 20:44:23
【问题描述】:
2012 年 11 月 16 日更新
我想再次提出这个问题,提供新的赏金以获得可靠、良好的解决方案。似乎只有解决方案 (shubhansh's answer) 现在无法有效工作。我会解释原因。
首先,这是我有半径和人的实时地图,半径在red,人在blue。
如您所见,这张地图中有 two 人,半径为 eight,基本上我只得到 @ 的人987654332@,但我没有收到 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');
旧总结
注意:所有经纬度都是随机制作的。
我有一个地图小程序,用户可以将他的 半径 放置在 lat/lng 位置,半径为 1 公里。
现在,有另一个用户可以将他的半径放在地图上的任何位置,每个位置的半径为 1 公里(与上面的用户相同)。
像这样用户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 Developers 网站上发现它很接近,但不仅仅是我需要的性能。
编辑:我找到了一个更好的,这是非常接近的,但仍然不是我想要的,因为当我在表中有多个时,它使用 1 个经纬度坐标.
【问题讨论】:
-
这可能是一个提示stackoverflow.com/questions/11502469/… 的答案,您只需在查询中添加
WHERE distance < 1234。