versiones guia español actualizar mysql math markers

mysql - guia - qgis español



Obtenga resultados que caigan dentro de los radios de los marcadores de la base de datos (3)

El punto esencial de su geometría es que dos círculos se superponen si la distancia entre sus centros es menor que la suma de sus radios. Ya que estamos haciendo una comparación, podemos usar el cuadrado de la distancia, ya que eso evita una operación de raíz cuadrada. En el original, cada radio se fija en 1, la suma de los dos radios es 2 y el cuadrado de la suma es 4.

Hay una gran diferencia entre la pregunta original y la nueva. En el primero tienes círculos de radio fijo y el segundo tienes círculos de radio variable. La constante 4 en la expresión de comparación [...distance^2...] <= 4 debe reemplazarse, ya que es un artefacto del radio fijo del original. Para implementar esto, agregue el campo km en la consulta. Y como debería comprobar, no estaba utilizando ppl.radius en el filtro DÓNDE, por lo que no es sorprendente que la variación de ese valor no haya cambiado los resultados de la consulta.

SELECT ppl.latitude, ppl.longitude, ppl.radius FROM ( people ppl ), ( SELECT latitude, longitude, km FROM radiuses ) AS B WHERE [...distance^2...] <= POW( ppl.radius + B.km, 2)

Debo decir que esta pregunta tardó mucho más en entenderse de lo que debería, porque usted llama a la entidad "eso no es una persona" un "radio", cuando realmente tiene una propiedad que debería llamarse " radio ''en dos entidades diferentes. Así que nombra a esa otra entidad algo descriptivo.

Actualización 16 de noviembre de 2012

Me gustaría volver a plantear esta pregunta, ofreciendo una nueva recompensa por una solución sólida y buena. Parece que solo la solución ( la respuesta de shubhansh ) no funciona de manera efectiva ahora. Te explicaré por qué.

En primer lugar, este es el mapa en vivo que tengo con radios y personas, los radios están en red y las personas en blue .

Como puede ver, hay two personas en este mapa con eight radios, básicamente estoy obteniendo solo la persona que es la Person A , pero no estoy obteniendo la Person B , supongo que el SQL no lo está seleccionando correctamente, lo cual Necesito que sea preciso y exacto desde el radio de la persona y el radio del marcador.

Parece que lo que se recoge está dentro de los radios, no aquellos que se superponen a un radio, lo necesito para poder obtener cualquier resultado para cualquier radio que se superponga entre sí.

Estoy buscando un SQL preciso y exacto que la respuesta de Shubhansh. Puede leer a continuación para leer exactamente cómo necesito la consulta para actuar y captar personas precisas.

Los datos, PERSONAS :

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

Tenga en cuenta que el radius está 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 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

Los datos de MySQL que puede utilizar para probar su 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'');

Antiguo resumen

Nota: todas las latitudes y longitudes se hacen al azar.

Tengo un applet de mapas en el que un usuario puede colocar su radio de una ubicación de lat / lng, con un radio de 1 km.

Ahora, hay otro usuario que puede colocar sus radios , en cualquier ubicación del mapa, cada uno con un radio de 1 km (igual que el usuario anterior).

Así, el usuario A es rojo y el usuario B es azul.

Básicamente, el usuario A almacena sus radios en una tabla que se ve así:

+-----------+---------+-----------+-----------+ | 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 el usuario B almacena su radio en otra tabla que se ve así: (nota: solo pueden almacenar 1 coordenadas por cuenta):

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

Quiero poder capturar a los usuarios que se encuentran dentro de los radios definidos, incluso si los círculos de radio están tocando, en la imagen del mapa. Sólo el marcador C podría recoger el radio simple, 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 desarrolladores de Google, está cerca, pero no solo lo que realiza lo que necesito.

EDITAR : He encontrado una mejor, esto está muy cerca, pero aún no es lo que estoy buscando, ya que usa un límite de latitud y longitud en las coordenadas cuando tengo varias en una tabla.


En el corazón de su problema está la pregunta "¿Cómo puedo saber si dos círculos se superponen?". La respuesta a eso es "si la distancia entre sus centros es menor que la suma de sus radios". Entonces, lo que estás buscando es cómo determinar la distancia entre dos puntos.

La otra respuesta es tratar la latitud y la longitud como si fueran un plano cartesiano. lo que no hacen (la longitud tiende hacia cero cuando te acercas a los polos desde el ecuador). Ahora, como una aproximación, puede funcionar bien para su solución, dependiendo de la precisión que necesite. Por otro lado, si necesita que esto sea muy preciso, necesita la fórmula de Haversine. Aquí hay una gran descripción de cómo implementarlo en MySQL:

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

De la diapositiva 7 de esa presentación, tiene la siguiente fórmula:

3956*2*ASIN(SQRT(POWER(SIN((orig.lat-dest.lat)*pi()/180/2),2)+ COS(orig.lat*pi()/180)*COS(dest.lat*pi()/180)* POWER(SIN((orig.lon-dest.lon)*pi()/180/2),2)))

Tenga en cuenta que el primer número es el radio medio de la tierra en millas ; Cambia eso a 6371 por kilómetros.

La forma en que utilice esta distancia calculada dependerá de los detalles no incluidos en su publicación, como la cantidad de puntos con los que está tratando, la dispersión geográfica, los requisitos de rendimiento y si los datos son estáticos o no se actualizan continuamente. .

Menciono estas cosas porque el rendimiento será un problema, especialmente si tiene una cantidad significativa de datos y / o se actualiza continuamente (como las ubicaciones de los usuarios en función de los datos GPS de su teléfono).

Una forma en que puede ayudar con el problema de rendimiento es usar cuadrados en lugar de círculos, y usar la aproximación de un grado = 111.12 km. De esa manera, puede eliminar automáticamente cualquier punto que esté obviamente lejos uno del otro. Entonces, solo queda calcular la fórmula de Haversine solo para el puñado de puntos que se encuentran dentro del área de interés.

Espero que esto sea útil para señalarle en la dirección correcta.


Para resolver esto, debe comprender la ecuación de círculo, que es algo como esto. Para que cualquier punto (x, y) caiga dentro del círculo con el centro (x1, y1) y el radio r es

(x-x1)^2 + (y - y1)^2 <= r^2 where a^b = a to the power b

Aquí, en su caso, los usuarios B (latitud, longitud) son el centro del círculo, los usuarios A (latitud, longitud) son los puntos (x, y) y el radio = 2kms.

Pero el problema básico es cambiar los grados de latitudes a longitudes, así que aquí hay una solución, 1 grado = 111.12 km. Así que para mantener las unidades iguales en ambos lados de la ecuación, las convertiremos a Kms.

Entonces nuestra ecuación final se convierte en:

((x-x1)*111.12)^2 + ((y-y1)*111.12)^2 = 4 (=2^2)

Sentencia SQL para el mismo debe verse algo como esto

SELECT A.user_id, A.radius_id, A.latitude, A.logitude FROM UserA AS A, (SELECT user_id, latitude, longitude FROM UserB WHERE user_id = 8) AS B WHERE (POW((A.latitude-B.latitude)*111.12, 2) + POW((A.longitude - B.longitude)*111.12, 2)) <= 4 /* **Edit** Here I have used (A.longitude - B.longitude)*111.12, for more accurate results one can replace it with (A.longitude - B.longitude)*111.12*cos(A.latitude)) or (A.longitude - B.longitude)*111.12*cos(B.latitude)) And, as i have suggested in the comments that first filter some records based on approximation, so whether one uses A.latitude or B.latitude it will not make much difference */

Espero que esto ayude ...