更新2012年11月16日
我想再次提出这个问题,有一个坚实的,很好地解决了新的赏金提供。 看来,只有解决方案( shubhansh
的回答 )没有有效地现在的工作。 我会解释为什么。
首先,这是现场地图我有半径和人民,半径是red
和人民都在blue
。
正如你所看到的,有two
人在这个地图eight
半径,基本上我只得到这是个人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');
老摘要
注意:所有的经度和纬度都只是随机发。
我有一个小应用程序映射,用户可以将自己的一个纬度/经度位置的半径 ,用一公里半径。
现在,有一个可以把他的半径 ,在任何位置在地图上,每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。
我发现这对谷歌开发者网站上已经很接近了,但不只是它所执行我所需要的。
- 创建与PHP,MySQL和谷歌地图商店定位器
编辑 :我已经找到一个更好的,这是非常接近,但仍然不是我要找的,因为它使用了1约束纬度,当我有一个表中的多个经度坐标。
- 外接圆内由纬度/经度数据库中选择点