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


Compartí este artículo