Пеленг от одной координаты к другой

Я реализовал формулу "подшипника" из http://www.movable-type.co.uk/scripts/latlong.html. Но это кажется очень неточным - я подозреваю, что в моей реализации есть ошибки. Не могли бы вы помочь мне его найти? Мой код ниже:

protected static double bearing(double lat1, double lon1, double lat2, double lon2){

double longDiff= lon2-lon1;
double y = Math.sin(longDiff)*Math.cos(lat2);
double x = Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(longDiff);

return Math.toDegrees((Math.atan2(y, x))+360)%360;
}

person Ivan T    schedule 26.02.2012    source источник


Ответы (4)


Просто у вас круглые скобки () не в том месте.

Вы добавляете градусы к значению в радианах, что не сработает. toDegrees() выполнит преобразование радианов в градусы за вас, затем вы выполните нормализацию, когда у вас будет значение в градусах.

У вас есть:

 Math.toDegrees( (Math.atan2(y, x))+360 ) % 360;

Но вам нужно:

( Math.toDegrees(Math.atan2(y, x)) + 360 ) % 360;

Помните также, что все входные данные для Math.sin(), Math.cos() и всех других тригонометрических функций должны быть в радианах. Если вы вводите градусы, вам нужно сначала преобразовать их, используя Math.toRadians().

person DNA    schedule 26.02.2012
comment
Правильно! Но все же входными параметрами являются ProcJobLocation.bearing (53.944592, 27.595215, 55.745752, 37.630768); и вывод 359.11592632310266. Тем не менее есть некоторая ошибка. - person Ivan T; 27.02.2012
comment
Кажется, что ваши входные данные выражены в градусах. Вам нужно преобразовать их в радианы, используя Math.toRadians(), иначе Math.sin(), Math.cos() и т. Д. Дадут неправильные результаты. - person DNA; 27.02.2012

Вот окончательный код:

protected static double bearing(double lat1, double lon1, double lat2, double lon2){
  double longitude1 = lon1;
  double longitude2 = lon2;
  double latitude1 = Math.toRadians(lat1);
  double latitude2 = Math.toRadians(lat2);
  double longDiff= Math.toRadians(longitude2-longitude1);
  double y= Math.sin(longDiff)*Math.cos(latitude2);
  double x=Math.cos(latitude1)*Math.sin(latitude2)-Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(longDiff);

  return (Math.toDegrees(Math.atan2(y, x))+360)%360;
}
person Ivan T    schedule 27.02.2012
comment
где lat1, lon1, lat2 и lon2 в радианах ???! Возможно нет. так почему вы переименовали долготу1 и долготу2 ?? - person Radu; 12.12.2016

Пеленг от одной координаты к другой и найдите север, восток, юг, запад :) введите описание изображения здесь

     public class FindBearing {
            public static void main(String[] args) {
                System.out.println(" Your Result >>> "+FindBearing.bearing(19.2859590, 73.4966430, 19.2861020, 73.4988090));    
            }   
            protected static String bearing(double lat1, double lon1, double lat2, double lon2){
          double longitude1 = lon1;
          double longitude2 = lon2;
          double latitude1 = Math.toRadians(lat1);
          double latitude2 = Math.toRadians(lat2);
          double longDiff= Math.toRadians(longitude2-longitude1);
          double y= Math.sin(longDiff)*Math.cos(latitude2);
          double x=Math.cos(latitude1)*Math.sin(latitude2)-Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(longDiff);
          double resultDegree= (Math.toDegrees(Math.atan2(y, x))+360)%360;
          String coordNames[] = {"N","NNE", "NE","ENE","E", "ESE","SE","SSE", "S","SSW", "SW","WSW", "W","WNW", "NW","NNW", "N"};
          double directionid = Math.round(resultDegree / 22.5); 
          // no of array contain 360/16=22.5
          if (directionid < 0) {
              directionid = directionid + 16;
               //no. of contains in array
          }
          String compasLoc=coordNames[(int) directionid];

          return resultDegree+" "+compasLoc;
        }
            }
person MAnoj Sarnaik    schedule 06.04.2015

Немного подправленная версия ответа @IvanT:

public static double bearingInRadians(LatLng src, LatLng dst) {
    double srcLat = Math.toRadians(src.getLatitude());
    double dstLat = Math.toRadians(dst.getLatitude());
    double dLng = Math.toRadians(dst.getLongitude() - src.getLongitude());

    return Math.atan2(Math.sin(dLng) * Math.cos(dstLat),
            Math.cos(srcLat) * Math.sin(dstLat) - 
              Math.sin(srcLat) * Math.cos(dstLat) * Math.cos(dLng));
}

public static double bearingInDegrees(LatLng src, LatLng dst) {
    return Math.toDegrees((bearingInRadians(src, dst) + Math.PI) % Math.PI);
}

Где LatLng:

public final class LatLng {
    private final double latitude;
    private final double longitude;

    public LatLng(double latitude, double longitude) {
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public double getLongitude() {
        return longitude;
    }
}
person mixel    schedule 23.09.2016