16a de noviembre de 2012
me gustaría plantear esta pregunta de nuevo, ofreciendo una nueva recompensa por una buena solución sólida,. Parece que solo la solución (shubhansh
's answer) no funciona de manera efectiva ahora. Explicaré por qué.Obtener resultados que caen dentro de radios marcadores de la base de datos de actualización de
primer lugar, este es el mapa en vivo que tengo con radios y las personas, los radios están en red
y la gente están en blue
.
Como se puede ver, hay two
personas en este mapa con eight
radios, básicamente, que estoy recibiendo sólo la persona que es Person A
, pero no estoy recibiendo Person B
, Supongo que el SQL no lo está recogiendo correctamente, y necesito que sea preciso y preciso a partir del radio de la persona y los radios marcadores.
Parece que lo que se recoge son los radios, no los que se superponen a un radio, necesito que pueda detectar los resultados de los radios que se superponen entre sí.
Estoy buscando un SQL preciso y preciso que la respuesta de shubhansh. Puede leer a continuación para leer exactamente cómo necesito la consulta para actuar y seleccionar personas precisas.
Los datos, PERSONAS:
+-----------+-----------+--------+
| latitude | longitude | radius |
+-----------+-----------+--------+
| 51.517395 | -0.053129 | 5.6 |
| 51.506607 | -0.116129 | 0.7 |
+-----------+-----------+--------+
Tenga en cuenta que es radius
en kiló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 |
+-----------+-----------+-----+
El SQL actual que utilizo:
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
Los datos de MySQL que se puede utilizar para probar la 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');
Resumen Antiguo
Nota: todas las latitudes y longitudes son hechas al azar.
que tienen un applet de mapa que un usuario puede colocar su radio de de una ubicación LAT/LNG, con un radio de 1 km.
Ahora, hay otro usuario que puede poner sus radios , en cualquier ubicación en el mapa, cada uno con un radio de 1 km (igual que el usuario anterior).
Como este El usuario A es rojo y El usuario B es azul.
Básicamente usuario A tiendas de sus radios en una mesa que tiene este aspecto:
+-----------+---------+-----------+-----------+
| radius_id | user_id | latitude | longitude |
+-----------+---------+-----------+-----------+
| 1 | 1 | 81.802117 | -1.110035 |
| 2 | 1 | 81.798272 | -1.144196 |
| 3 | 1 | 81.726782 | -1.135919 |
+-----------+---------+-----------+-----------+
Y usuario B tiendas de su radio en otra tabla que tiene este aspecto - (nota : solo pueden almacenar 1 coordenadas por cuenta):
+---------+-----------+-----------+
| user_id | latitude | longitude |
+---------+-----------+-----------+
| 6 | 81.444126 | -1.244910 |
+---------+-----------+-----------+
Quiero poder seleccionar aquellos usuarios que se encuentran dentro de los radios definidos, incluso si los círculos del radio se están tocando, en la imagen del mapa. Solo el marcador C
podría recoger el radio único, cuando A
y B
no lo hacen.
Estoy seguro de que esto es posible, pero no sé cómo crear este tipo de sistema en MySQL.
Encontré esto en el sitio de Google Developers, está cerca, pero no solo de lo que funciona. Necesito.
EDITAR: he encontrado una mejor, esto es muy estrecha, pero todavía no lo que yo estoy buscando, ya que utiliza 1 atado de la latitud y la longitud coordina cuando tener múltiples en una mesa.
Esto puede ser una respuesta que le da una pista http://stackoverflow.com/questions/11502469/find-records-with-lattitude-and-logintude/11502530#11502530 que acaba de agregar una distancia 'WHERE <1234 ' a la consulta. – fdomig