Posts Tagged mapa

MySQL Adaptación de procedimiento almacenado para obtener puntos por latitud/longitud geolocalizados en un mapa dentro de un radio

Situación:

Partimos que tenemos una tabla con datos cada uno de los registros contiene una localización latitud y longitud, y queremos ubicarlos en un mapa,  y que además estén todos ellos dentro de un área determinada a partir de un punto inicial (alrededor). Por ejemplo en Madrid tenemos los siguientes puntos:

Punto concéntrico y área con un radio que engloba una serie de puntos

Punto concéntrico y área con un radio que engloba una serie de puntos

Entonces sabiendo las coordenadas del punto que está en el centro del recuadro negro queremos obtener los pines que hay dentro de esa área, para ello hago una consulta a la tabla que contiene las coordenadas de los pines rojo.

Código:

– Fuente original: http://www.mysqlfulltextsearch.com/geo_search.pdf

DELIMITER $$
-- @param radio El radio va en kilómetros
DROP PROCEDURE IF EXISTS `nombre_nuestra_basedatos`.`geoPuntosRadio`$$
CREATE DEFINER=`nombre_nuestra_basedatos`@`%`
PROCEDURE `geoPuntosRadio`(IN latuser double, IN longuser double, IN radio int)
BEGIN
declare lon1 float; declare lon2 float;
declare lat1 float; declare lat2 float;


-- calcular latitud/longitud del rectángulo:
set lon1 = longuser-radio/abs(cos(radians(latuser))*69);
set lon2 = longuser+radio/abs(cos(radians(latuser))*69);
set lat1 = latuser-(radio/69);
set lat2 = latuser+(radio/69);


-- Consulta con el resultado y distancia en km:
SELECT *,
6378.137 * 2 * ASIN(SQRT( POWER(SIN((latuser - c.latitud)
* pi()/180 / 2), 2) +
COS(latuser * pi()/180) * COS(c.latitud * pi()/180) *
POWER(SIN((longuser - c.longitud) * pi()/180 / 2), 2) )) as distancia


FROM nuestra_tabla c

WHERE c.longitud between lon1 and lon2
and c.latitud between lat1 and lat2

having distancia < radio ORDER BY distancia limit 10;
END$$
DELIMITER ;

Para obtener los datos dado que es un procedimiento almacenado en la base de datos usamos la llamada al procedimiento. Le pasamos las coordenadas del centro latitud/longitud y el radio que se desea cubrir en kilómetros.

call geoPuntosRadio(37.8,-0.8, 100) //latitud, longitud, radio (km)

Reconocimientos:

Este post a sido una adaptación de la obra titulada Geo (proximity) Search with MySQL por  Alexander Rubin (consultor senior en MySQL), donde  hace una introducción al cálculo de distancias en la Tierra mediante coordenadas y lo extrapola a MySQL. La obra original obtiene las coordenadas de usuarios guardadas en tablas.

,

4 Comentarios