Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Query para agrupar por distancias

Estas en el tema de Query para agrupar por distancias en el foro de Mysql en Foros del Web. Hola, tengo en una base de datos la latitud y longitud de 100.000 usuario y los quiero mostrar en un mapa, pero cuando el mapa ...
  #1 (permalink)  
Antiguo 28/05/2012, 10:03
 
Fecha de Ingreso: marzo-2008
Mensajes: 99
Antigüedad: 16 años, 1 mes
Puntos: 0
Pregunta Query para agrupar por distancias

Hola,
tengo en una base de datos la latitud y longitud de 100.000 usuario y los quiero mostrar en un mapa, pero cuando el mapa esta con zoom lejos quiero mostrar la canidad de personas que hay en una zona al estilo: http://ijustmadelove.com/

Como puedo hacer la query esta???
  #2 (permalink)  
Antiguo 28/05/2012, 11:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Query para agrupar por distancias

Eso no es algo que se resuelva en SQL. Eso se construye con javascript, usando los objetos que la API de Gogle te provee.
Con MySQL sólo puedes obtener agrupamientos por proximidad, pero la visualización en los mapas no es tema de Base de datos...

Verifica en el foro de tu lenguaje de programación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 28/05/2012, 11:35
 
Fecha de Ingreso: marzo-2008
Mensajes: 99
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Query para agrupar por distancias

Hola gnzsoloyo,
entiendo que la visualización de los resultados se hace por la api de google maps, pero el numero que indica la cantidad de personas que hay en cierto punto tiene y las coordenadas de los puntos vienen del lado del servidor.

mirando las peticiones veo que se hace una peticion por ajax al server y le manda las coordenadas y el zoom y el server le devuelve los puntos y la cantidad de resultados.

no se podría hacer una query mysql para obtener estos valores??
  #4 (permalink)  
Antiguo 28/05/2012, 11:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Query para agrupar por distancias

A eso me refiero con que haces un agrupamiento por proximidad.
Lo que haces es que te devuelva todos los puntos contenidos dentro de un rango desde un punto y alrededor de él, o bien que queden dentro de un área definida.
En el primer caso se usa una serie de funciones anidadas para calcular la distancia entre puntos (no te puedo dar la fórmula ahora porque la tengo en mi casa y estoy trabajando), donde uno de los parámetros es el radio del área circular que se usará y su centro.
En el segundo caso necesitarías enviar cuatro coordenadas para definir un MBR (minimum boundary rectangle), dentro del cual se hará la búsqueda.
Una tercera posibilidad es la de usar listas de ciudades con sus coordenadas, de modo que se pueda obtener la lista agrupada por ciudad y país...

En cualquiera de los casos, necesitas un conjunto de tablas espaciales con la información mínima geográfica de ciudades, estados y países.
¿Tienes ya esa info?

Otra posibilidad es que uses los recursos de la API de GoogleMaps para obtener esa data... Pero la cantidad de peticiones del servicio gratuito es de alrededor de 1.500 diarias. No sé si eso te servirá.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 28/05/2012, 12:05
 
Fecha de Ingreso: marzo-2008
Mensajes: 99
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Query para agrupar por distancias

La estructura de mi tabla es:

id_usuario
lat
long
ciudad
provincia
pais

Podria hacer algo así???


select count(*) cant,ciudad,provincia,pais from tbl
where distancia(lat,long)<zoom having cant

donde distancia(lat,long) seria la función para calcular distancia y zoom es parametro
  #6 (permalink)  
Antiguo 28/05/2012, 13:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Query para agrupar por distancias

Mas o menos...
Si por "zoom" te estás refiriendo al parámetro "zoom" de Googlemaps, no. Ese es un parámetro entero, de un ranto de 0 a 15, que permite determinar la capa de mapas que se usará.
Pero en este caso zoom es una distancia en kilómetros o millas (según la fórmula que se use), que determina el centro de radio desde un punto dado, y que determina un círculo dentro del cual deben caer las coordenadas para ser devueltos en la consulta.
Pero lo que se hace en realidad es trabajar con objetos espaciales, que son mucho más eficientes que una simple operación trigonométrica (la que se escribe en la función) y que permiten verificar si el punto está o no dentro del área indicada.
Para eso se trabaja con columnas espaciales y datos espaciales.
Hay un capítulo dedicado a eso en el manual de referencia. Dame hasta esta noche y te paso algunos detalles.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 29/05/2012, 03:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Query para agrupar por distancias

Esta función devuelve la distancia en kilómetros entre dos puntos dados, pasados por parámetro (dlatitu y longitud de cada punto):
DELIMITER $$
Código MySQL:
Ver original
  1. CREATE FUNCTION `FN_DISTANCIA`(LAT_P1 FLOAT, LNG_P1 FLOAT, FLOAT, LAT_P2 FLOAT, LNG_P2) RETURNS float
  2.   RETURN ((6378 * 2 * ASIN(SQRT(  POWER(SIN((LAT_P1 - LAT_P2) * PI()/180 / 2), 2) + COS(LAT_P1 * PI()/180) *  COS(LAT_P2 * PI()/180) *  POWER(SIN((LNG_P1 -LNG_P2) * PI()/180 / 2), 2)))));
Esta fórmula, aplicada en la consulta y con la distancia mínima, permite filtrar aquellos puntos que estén dentro del rango de la distancia que busques.

El caso de los campos espaciales requiere algunos conocimientos más. Puedes empezar dandole una mirada a http://dev.mysql.com/doc/refman/5.0/...xtensions.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 29/05/2012, 03:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Query para agrupar por distancias

gonzalo,
no estaría de más subir esa función al FAQ de MySQL.

saludos y gracias

Última edición por jurena; 29/05/2012 a las 14:12
  #9 (permalink)  
Antiguo 30/05/2012, 12:52
 
Fecha de Ingreso: marzo-2008
Mensajes: 99
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Query para agrupar por distancias

Proba con html_entity_decode
http://php.net/manual/es/function.ht...ity-decode.php
  #10 (permalink)  
Antiguo 30/05/2012, 12:53
 
Fecha de Ingreso: marzo-2008
Mensajes: 99
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Query para agrupar por distancias

Me equivoque de post... queria responder otro, perdon

Etiquetas: agrupar, distancias, query
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:46.