Obter resultados que se enquadram nos raios do marcador do banco de dados

Atualização de 16 de novembro de 2012

Eu gostaria de levantar essa questão novamente, oferecendo com uma nova recompensa por uma solução sólida e boa. Parece que só a solução (shubhanshresposta) não funciona efetivamente agora. Eu explicarei porque.

Em primeiro lugar, este é o mapa ao vivo que tenho com radiuses e pessoas, os raios estão emred e as pessoas estão emblue.

Como você pode ver, existemtwo pessoas neste mapa comeight radioses, basicamente eu estou recebendo apenas a pessoa que éPerson A, mas eu não estou conseguindoPerson B, Eu estou supondo que o SQL não está pegando corretamente o que eu preciso para ser preciso e preciso do raio da pessoa e os raios do marcador.

Parece que o que é escolhido são dentro dos raios, não aqueles que se sobrepõem a um raio, eu preciso que ele seja capaz de pegar qualquer resultado para qualquer raio que se sobreponha.

Eu estou procurando por uma SQL precisa e precisa que a resposta do shubhansh. Você pode ler abaixo para ler exatamente como preciso que a consulta aja e escolha pessoas precisas.

Os dados,PESSOAS:

+-----------+-----------+--------+
| latitude  | longitude | radius |
+-----------+-----------+--------+
| 51.517395 | -0.053129 | 5.6    |
| 51.506607 | -0.116129 | 0.7    |
+-----------+-----------+--------+

Por favor note queradius está em quilômetros.

+-----------+-----------+-----+
| 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 |
+-----------+-----------+-----+

O SQL atual que uso:

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

Os dados para o MySQL que você pode usar para testar sua consulta,

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');
Resumo antigo

Nota: todas as latitudes e longitudes são feitas aleatoriamente.

Eu tenho um applet de mapa que um usuário pode colocar seuraio de uma localização lat / lng, com um raio de 1 km.

Agora, existe outro usuário que pode colocar seuraios, em qualquer local no mapa, cada um com 1 km de raio (o mesmo que o usuário acima).

Como issoUsuário A é vermelho eUsuário B é azul.

BasicamenteUsuário A armazena seus radiuses em uma tabela que se parece com isso:

+-----------+---------+-----------+-----------+
| radius_id | user_id | latitude  | longitude |
+-----------+---------+-----------+-----------+
|         1 |       1 | 81.802117 | -1.110035 |
|         2 |       1 | 81.798272 | -1.144196 |
|         3 |       1 | 81.726782 | -1.135919 |
+-----------+---------+-----------+-----------+

EUsuário B armazena seu raio em outra tabela que se parece com isso - (note: eles só podem armazenar 1 coordenadas por conta):

+---------+-----------+-----------+
| user_id | latitude  | longitude |
+---------+-----------+-----------+
|       6 | 81.444126 | -1.244910 |
+---------+-----------+-----------+

Eu quero ser capaz de pegar os usuários que caem dentro dos raios definidos, mesmo se os círculos de raio estão tocando, na imagem do mapa. Apenas marcadorC seria capaz de pegar o raio único, quandoA eB não.

Tenho certeza de que isso é possível, mas não sei como criar esse tipo de sistema no MySQL.

Achei isso no site do Google Developers, mas não apenas o que ele precisa.

Criando um localizador de lojas com PHP, MySQL e Google Maps

EDITAR: Eu encontrei um melhor, isso é muito próximo, mas ainda não é o que eu estou procurando, uma vez que usa um limite de coordenadas de latitude e longitude quando eu tenho vários em uma tabela.

Selecione pontos de um banco de dados por latitude / longitude dentro de um círculo delimitador

questionAnswers(3)

yourAnswerToTheQuestion