/**
 *  AbstractGeoPoint
 *  Copyright 03.06.2015 by Michael Peter Christen, @0rb1t3r
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *  
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *  
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program in the file lgpl21.txt
 *  If not, see <http://www.gnu.org/licenses/>.
 */

package ai.susi.geo;

public abstract class AbstractGeoPoint implements GeoPoint {

    /**
     * compute the distance between two points using the Haversine Algorithm
     * https://en.wikipedia.org/wiki/Haversine_formula
     * @param othr the other point
     * @return the distance of this point and the other point in meter
     */
    public double distance(final GeoPoint othr) {
        return distance(this.lat(), this.lon(), othr.lat(), othr.lon());
    }
    
    public static double distance(final double lat1, final double lon1, final double lat2, final double lon2) {        
        double dlat = (lat2 - lat1) * D2R; double dlon = (lon2 - lon1) * D2R;
        double a = Math.pow(Math.sin(dlat / 2.0d), 2.0d) +
                   Math.cos(lat1 * D2R) * Math.cos(lat2 * D2R) * Math.pow(Math.sin(dlon / 2.0d), 2.0d);
        double c = 2.0d * Math.atan2(Math.sqrt(a), Math.sqrt(1.0d - a));
        return EQUATOR_EARTH_RADIUS * c;
    }

    static final double EQUATOR_EARTH_RADIUS = 63781370.0d;
    static final double D2R = (Math.PI / 180.0d);

}

/**
 *  AbstractGeoPoint
 *  Copyright 03.06.2015 by Michael Peter Christen, @0rb1t3r
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *  
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *  
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program in the file lgpl21.txt
 *  If not, see <http://www.gnu.org/licenses/>.
 */

package ai.susi.geo;

public abstract class AbstractGeoPoint implements GeoPoint {

    /**
     * compute the distance between two points using the Haversine Algorithm
     * https://en.wikipedia.org/wiki/Haversine_formula
     * @param othr the other point
     * @return the distance of this point and the other point in meter
     */
    public double distance(final GeoPoint othr) {
        return distance(this.lat(), this.lon(), othr.lat(), othr.lon());
    }
    
    public static double distance(final double lat1, final double lon1, final double lat2, final double lon2) {        
        double dlat = (lat2 - lat1) * D2R; double dlon = (lon2 - lon1) * D2R;
        double a = Math.pow(Math.sin(dlat / 2.0d), 2.0d) +
                   Math.cos(lat1 * D2R) * Math.cos(lat2 * D2R) * Math.pow(Math.sin(dlon / 2.0d), 2.0d);
        double c = 2.0d * Math.atan2(Math.sqrt(a), Math.sqrt(1.0d - a));
        return EQUATOR_EARTH_RADIUS * c;
    }

    static final double EQUATOR_EARTH_RADIUS = 6378137.0d;
    static final double D2R = (Math.PI / 180.0d);

}

Fix #190