001 /*
002 * Copyright 2006 Marc Wick, geonames.org
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 */
017 package org.geonames.utils;
018
019 import static java.lang.Math.atan2;
020 import static java.lang.Math.cos;
021 import static java.lang.Math.sin;
022 import static java.lang.Math.toDegrees;
023 import static java.lang.Math.toRadians;
024
025 /**
026 * compass bearing from the first point to the second point in degrees.
027 *
028 * @author Marc Wick
029 */
030 public class Bearing {
031
032 /**
033 * Returns the direction from the first point to the second point in
034 * degrees. The direction is the clockwise angle between the magnetic north
035 * and the direction from point1 to point2
036 *
037 * @param lat1
038 * @param lng1
039 * @param lat2
040 * @param lng2
041 * @return
042 */
043 // http://www.movable-type.co.uk/scripts/latlong.html
044 public static double calculateBearing(double lat1, double lng1,
045 double lat2, double lng2) {
046 double dLon = toRadians(lng2 - lng1);
047 lat1 = toRadians(lat1);
048 lat2 = toRadians(lat2);
049 double y = sin(dLon) * cos(lat2);
050 double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
051 double brng = toDegrees(atan2(y, x));
052 return (brng + 360) % 360;
053 }
054 }