package arida.ufc.br.moap.functions.spatial;
import arida.ufc.br.moap.core.beans.LatLonPoint;
import arida.ufc.br.moap.function.api.IDistanceFunction;
/**
* @author igobrilhante
*
*/
public class Haversine implements IDistanceFunction<LatLonPoint> {
private final double R_EARTH = 6371; // KM
/*
* (non-Javadoc) @see
* mf.algorithm.distance.spi.IDistanceFunction#distance(java.lang.Object,
* java.lang.Object)
*/
@Override
public Double evaluate(LatLonPoint o1, LatLonPoint o2) {
// TODO Auto-generated method stub
double d = computeDistance(o1.getLatitude(), o1.getLongitude(),
o2.getLatitude(), o2.getLongitude());
return d;
}
/**
* @param lat1
* @param lon1
* @param lat2
* @param lon2
* @return
*/
private double computeDistance(double lat1, double lon1, double lat2, double lon2) {
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
double _lat1 = Math.toRadians(lat1);
double _lat2 = Math.toRadians(lat2);
double a = Math.pow(dLat/2, 2) + Math.pow(dLon/2, 2) * Math.cos(_lat1) * Math.cos(_lat2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double dist = R_EARTH * c;
return dist;
}
/*
* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
/*
* :: This function converts radians to decimal degrees :
*/
/*
* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
/**
* @param rad
* @return
*/
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "Haversine";
}
}