Great Circle Calculation

Abr 23 2010

El problema es simple: encontrar puntos cercanos a un centro, en un radio de n kilometros. Esto parece simple, pero realmente puede ser complejo, tomando en cuenta que la tierra no es plana.
Asi que les dejo esta función, basada en los principios matematicos que pueden chequear en http://en.wikipedia.org/wiki/Great-circle_distance .


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;
}

La funcion devuelve una condición SQL necesaria para restringir un resultado a los puntos dentro del circulo. Supone un campo longitude, un campo latitude y una constante KMRADIUS . Esta ultima podria parametrizarse tambien, pero en mi caso, siempre era igual.

Otra versión de la nota aca http://www.matiascelani.com.ar/content/great-circle-calculation