Question

J'ai implémenté la formule "bearing" de http://www.movable-type.co.uk/scripts/latlong.html.Mais cela semble très inexact – je soupçonne des erreurs dans ma mise en œuvre.Pourriez-vous m'aider à le trouver ?Mon code est ci-dessous :

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;
}
Était-ce utile?

La solution

Tu as juste tes parenthèses () au mauvais endroit.

Vous ajoutez des degrés à une valeur en radians, ce qui ne fonctionnera pas. toDegrees() fera la conversion des radians en degrés pour vous, alors vous effectuez la normalisation une fois que vous avez une valeur en degrés.

Tu as:

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

Mais il vous faut :

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

N'oubliez pas également que toutes les entrées Math.sin(), Math.cos() et toutes les autres fonctions trigonométriques doivent être en radians.Si vos entrées sont des degrés, vous devrez les convertir en utilisant Math.toRadians() d'abord.

Autres conseils

Voici le code final:

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;
}

Porter d'une coordonnée à une autre et trouver le nord, l'est, le sud, la Weast :) Entrez la description de l'image ici

     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;
        }
            }

Version un peu nettoyée de @IvanT répond:

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 est:

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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top