Supongamos que tenemos una tabla de puntos expresados como coordenadas GPS (latitud/longitud en grados) y deseamos obtener todos los puntos que se encuentran dentro de un radio específico (por ejemplo a menos de 100 metros de la ubicación actual). Con una correcta representación de los datos, es posible realizar este cálculo a través de una simple consulta SQL.
Cada punto se almacena en una tabla que posee dos campos donde guardar sus coordenadas GPS (latitud y longitud): lat
y lon
:
create table punto ( id bigint not null primary key, desc varchar(100) not null, lat float(10,6) not null, lon float(10,6) not null, index (lat) index (lon) );
Partiendo de una posición actual, es posible obtener todos los puntos que se encuentran a menos de una distancia máxima especificada utilizando la siguiente consulta SQL:
select desc, ( 6371 * acos(cos(radians(LATITUD_ACTUAL)) * cos(radians(lat)) * cos(radians(lon) - radians(LONGITUD_ACTUAL)) + sin(radians(LATITUD_ACTUAL)) * sin(radians(lat)))) as distancia from punto where lat between (LATITUD_ACTUAL-0.5) and (LATITUD_ACTUAL+0.5) and lon between (LONGITUD_ACTUAL-0.5) and (LONGITUD_ACTUAL+0.5) having distancia < (D/1000);
Donde:
- 6371 es el radio de la tierra expresado en kilómetros.
LATITUD_ACTUAL
es la latitud de la posición actual (desde donde se desean obtener puntos cercanos).LONGITUD_ACTUAL
es la longitud de la posición actual.- 0.5 grados de longitud/latitud equivalen aproximadamente a 55 kilómetros de distancia en horizontal/vertical respectivamente.
D
es el radio de búsqueda expresado en metros
En la consulta se deben reemplazar estas variables (LATITUD_ACTUAL
, LONGITUD_ACTUAL
y D
) por sus valores correspondientes. El resultado serán todos los puntos que se encuentran a menos de D
metros de distancia de la ubicación actual especificada mediante las coordenadas GPS (LATITUD_ACTUAL,LONGITUD_ACTUAL).
La cláusula where
implementa una especie de optimización. Si la tabla posee millones de puntos, estos cálculos insumen excesivo tiempo de procesamiento, resultando en un pobre rendimiento o cuello de botella. Lo que se hace entonces es reducir la búsqueda sólo a aquellos puntos que se encuentran dentro de un rectángulo de 55 kilómetros de lado, centrado en la coordenada GPS actual. Si es necesario se puede adaptar esta cota de acuerdo a la distancia D
especificada como parámetro.
Este cálculo utiliza trigonometría esférica para calcular distancias en la superficie de una esfera, basándose en la ley esférica de los cosenos.
Es importante notar que la tierra no es una esfera perfecta, sino que está achatada en los polos. Esto significa que este cálculo puede introducir hasta un 0,5% de error. Si la aplicación en cuestión requiere gran precisión, existen otras fórmulas de superficie elipsoidal que aproximan mucho mejor la superficie de la tierra.
Referencias
Calculate distance, bearing and more between Latitude/Longitude points
How big is a degree of Latitude Longitude
Calculating Geographic Distance: Concepts and Methods
MySQL 5.7 Reference Manual - Mathematical Functions
Tal vez pueda interesarte