Great Circle Calculation

   Pasando a los bifes con el tema de la geolocalización y los mapas, vamos a dejar algo de código útil disponible, tanto para pruebas como para versiones finales (dependiendo el caso).
   El tema es hacer una búsqueda de puntos cercanos a cierto otro punto en un mapa, teniendo disponibles la latitud y longitud de estos.
Como la tierra no es plana, no es tan simple como parece, pero hay fórmulas para todo. Particularmente, esta fórmula puede ser utilizada en una consulta SQL sobre una tabla que contenga datos de los puntos.
   Para emprolijar, armé una función que devuelva solo la condición referida a este asunto (php/MySql)


function getGreatCircleSql($lat, $long) {
    $extraSql =
    "(ATAN2(
        SQRT(
          POW(COS(RADIANS({$lat})) *
               SIN(RADIANS(longitude - {$long})), 2) +
          POW(COS(RADIANS(latitude)) * SIN(RADIANS({$lat})) -
              SIN(RADIANS(latitude)) * COS(RADIANS({$lat})) *
              COS(RADIANS(longitude - {$long})), 2)),
        (SIN(RADIANS(latitude)) * SIN(RADIANS({$lat})) +
         COS(RADIANS(latitude)) * COS(RADIANS({$lat})) *
         COS(RADIANS(longitude - {$long})))
      ) * 6372.795 ) < ".KMRADIUS." ";

      return $extraSql;
}


Explicamos algunos detalles: esta función supone que hay un campo longitude, y un campo latitude en la tabla sobre la que se realizará la consulta. Utiliza además la constante KMRADIUS que contiene la distancia en Km dentro de la cual se buscará. Por supuesto esto último podria parametrizarse de ser necesario. Yo no lo necesité.

Recordemos que este método esta pensado para busquedas  dentro de un circulo de radio de KMRADIUS. En caso de que sirva un cuadrado, una optimización posible es utilizar la fórmula para obtener las coordenadas máximas y mínimas (meter el circulo en un cuadrado) y realizar la consulta utilizando comparaciones simples.

Para profundizar en el lado matemático, se puede ver http://en.wikipedia.org/wiki/Great-circle_distance