Etags Desarrollos





Latitud y longitud.

Category : Development / Programación · by Apr 6th, 2014

La semana anterior tuve que generar una búsqueda de empresas en un radio dado por una coordenada en latitud y longitud.

Para esto había que calcular por medio de mysql las empresas que dentro de un radio determinado estuvieran ubicadas dentro de ese radio.

En internet encontré muchas variantes para hacerlo pero las 2 que dieron resultado fueron las siguientes.

$sql = "SELECT  DISTINCT p.ID,
3956 * 2 *
ASIN(SQRT( POWER(SIN((".$lat." - abs(pm1.meta_value)) * pi()/180 / 2),2)
+ COS(".$lat." * pi()/180 ) * COS( abs(pm1.meta_value) *  pi()/180)
* POWER(SIN((".$lng." - pm2.meta_value) *  pi()/180 / 2), 2) ))
as Distance
FROM  ". $wpdb->prefix ."posts p
INNER JOIN ". $wpdb->prefix ."postmeta pm1 ON (p.ID = pm1.post_id) AND (pm1.meta_key = 'latitude')
INNER JOIN ". $wpdb->prefix ."postmeta pm2 ON (p.ID = pm2.post_id) AND (pm2.meta_key = 'longitude')
WHERE p.post_type = 'empresa'
HAVING Distance >= '".$radius."'
ORDER BY Distance ASC
LIMIT 0,".$qty;

y

$sql = "SELECT DISTINCT p.ID,
(
(ACOS(SIN(".$lat." * PI() / 180)
* SIN(pm1.meta_value * PI() / 180) + COS(".$lat." * PI() / 180)
* COS(pm1.meta_value * PI() / 180) * COS((".$lng." - pm2.meta_value) * PI() / 180))
* 180 / PI()) * 60 * 1.1515) AS Distance
FROM  ". $wpdb->prefix ."posts p
INNER JOIN ". $wpdb->prefix ."postmeta pm1 ON (p.ID = pm1.post_id) AND (pm1.meta_key = 'latitude')
INNER JOIN ". $wpdb->prefix ."postmeta pm2 ON (p.ID = pm2.post_id) AND (pm2.meta_key = 'longitude')
WHERE p.post_type = 'empresa'
HAVING Distance >= '".$radius."'
ORDER BY Distance ASC
LIMIT 0,".$qty;

Esto es para el caso de wordpress en donde $lat  es la variable latitud y $lng es la variable longitud de referencia. La variable $qty es la cantidad de empresas que deseamos traer, ordenadas por distancia.

Este es el caso para un post_type que le incluimos las variables latitude y longitude para establecer dentro del post las coordenadas del negocio.

Para el caso de una tabla simple con latitud y longitud sería

$sql = "SELECT DISTINCT p.ID,
(
(ACOS(SIN(".$lat." * PI() / 180)
* SIN(p.latitude * PI() / 180) + COS(".$lat." * PI() / 180)
* COS(p.latitude * PI() / 180) * COS((".$lng." - p.longitude) * PI() / 180))
* 180 / PI()) * 60 * 1.1515) AS Distance
FROM tabla_geolocalizacion p
HAVING Distance >= '".$radius."'
ORDER BY Distance ASC
LIMIT 0,".$qty;

Esta sería la consulta para una sóla tabla de geolocalización con latitud y longituda de cada empresa.

Espero que les sea de ayuda, cualquier consulta me avisan.

SHARE :

Leave a Reply

Your email address will not be published. Required fields are marked *