Foros del Web » Programando para Internet » Ruby »

[SOLUCIONADO] Consulta para obtener registros aproximados geograficamente

Estas en el tema de Consulta para obtener registros aproximados geograficamente en el foro de Ruby en Foros del Web. Hola amigos, Tengo una aplicacion que muestra lugares en un mapa y los lugares los tengo almacenados en la base de datos con su latitud ...
  #1 (permalink)  
Antiguo 01/02/2015, 09:55
Avatar de kalvinman  
Fecha de Ingreso: octubre-2006
Ubicación: Bogota Colombia
Mensajes: 849
Antigüedad: 18 años, 1 mes
Puntos: 22
Pregunta Consulta para obtener registros aproximados geograficamente

Hola amigos,

Tengo una aplicacion que muestra lugares en un mapa y los lugares los tengo almacenados en la base de datos con su latitud y longitud, luego usando el geolocation de html5 obtengo la ubicacion del usuario.

Quiero hacer un consulta que me muestre los 10 registros mas cercanos a su ubicación, como podría hacerlo?
  #2 (permalink)  
Antiguo 01/02/2015, 15:57
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.489
Antigüedad: 22 años, 3 meses
Puntos: 2114
Respuesta: Consulta para obtener registros aproximados geograficamente

Yo tenía esto hecho por ahí. Es un método que usa la fórmula de Haversine para calcular distancias en un globo. Supongo que lo cogí o adapté de algún otro lugar:
Código Ruby:
Ver original
  1. def distance(a,b)
  2.  
  3.     lat1 = a[0]
  4.     long1 = a[1]
  5.     lat2 = b[0]
  6.     long2 = b[1]
  7.  
  8.     dtor = Math::PI/180
  9.     r = 6378.14*1000
  10.    
  11.     rlat1 = lat1 * dtor
  12.     rlong1 = long1 * dtor
  13.     rlat2 = lat2 * dtor
  14.     rlong2 = long2 * dtor
  15.    
  16.     dlon = rlong1 - rlong2
  17.     dlat = rlat1 - rlat2
  18.    
  19.     a = Math::sin(dlat/2)**2 + Math::cos(rlat1) * Math::cos(rlat2) * Math::sin(dlon/2)**2
  20.     c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1-a))
  21.  
  22.     r * c
  23.  
  24. end

Con eso, en un bucle aparte, puedes calcular las distancias y guardarlas en algún método del objeto y al final ordenarlas con un .sort_by(&:distancia). El método espera dos arrays con latitud y longitud de ambos puntos.
__________________
(:
  #3 (permalink)  
Antiguo 02/02/2015, 05:50
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.489
Antigüedad: 22 años, 3 meses
Puntos: 2114
Respuesta: Consulta para obtener registros aproximados geograficamente

Bueno, releyendo, si quieres hacer una consulta directamente, puedes hacer algo así:

Código Ruby:
Ver original
  1. Modelo.select("haversine(?, ?, lat, long) as 'distancia'", latitud, longitud).limit(10).order('distancia')

Pensé que era sólo ordenar, sin consultar, que es realmente más sencillo porque ya tienes funciones incorporadas de SQL para calcular distancias.
__________________
(:
  #4 (permalink)  
Antiguo 02/02/2015, 09:45
Avatar de kalvinman  
Fecha de Ingreso: octubre-2006
Ubicación: Bogota Colombia
Mensajes: 849
Antigüedad: 18 años, 1 mes
Puntos: 22
Respuesta: Consulta para obtener registros aproximados geograficamente

muchisimas gracias por sus aportes amigos, ambos fueron muy utiles y mediante ellos encontre varias cosas muy útiles, mirando lo de haversine encontré esto:

https://github.com/geokit/geokit-rails

Que creo que es lo que voy a usar. xD

Etiquetas: rails
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 09:42.