package pl.edu.agh.spatial; import static java.lang.Math.asin; import static java.lang.Math.cos; import static java.lang.Math.sin; import static java.lang.Math.sqrt; import static java.lang.Math.toRadians; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Point; public class HaversineDistanceCalculator { private static final double EARTH_RADIUS = 6371000; public static final HaversineDistanceCalculator EARTH_DISTANCE_CALCULATOR = new HaversineDistanceCalculator(EARTH_RADIUS); private double radius; public HaversineDistanceCalculator(double radius) { this.radius = radius; } public double distance(Coordinate from, Coordinate to) { double latitudeDelta = toRadians(from.y - to.y); double longitudeDelta = toRadians(from.x - to.x); double haversin = sin(latitudeDelta / 2) * sin(latitudeDelta / 2) + cos(toRadians(from.y)) * cos(toRadians(to.y)) * sin(longitudeDelta / 2) * sin(longitudeDelta / 2); return 2 * radius * asin(sqrt(haversin)); } public double distance(Point from, Point to) { return distance(from.getCoordinate(), to.getCoordinate()); } }