2012-02-26 21 views
15

Implementé la fórmula "rodamiento" de http://www.movable-type.co.uk/scripts/latlong.html. Pero parece muy impreciso, sospecho algunos errores en mi implementación. ¿Podrías ayudarme a encontrarlo? Mi código está debajo:Teniendo de una coordenada a otra

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

Respuesta

13

Usted acaba de tener su paréntesis () en el lugar equivocado.

Está agregando grados a un valor en radianes, que no funcionará. toDegrees() hará la conversión de radianes a grados para usted, luego realiza la normalización una vez que tiene un valor en grados.

tiene:

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

pero se necesita:

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

Recuerde también que todas las entradas a Math.sin(), Math.cos() y todas las otras funciones trigonométricas deben estar en radianes. Si sus entradas son grados, primero deberá convertirlas usando Math.toRadians().

+0

derecho! Pero todavía los parámetros de entrada son ProcJobLocation.bearing (53.944592, 27.595215, 55.745752, 37.630768); y la salida es 359.11592632310266. Todavía hay un error. –

+1

Sus entradas parecen estar en grados. Necesita convertirlos a radianes usando 'Math.toRadians()', de lo contrario 'Math.sin()', 'Math.cos()' etc dará resultados incorrectos. – DNA

+0

¡Gracias por tu ayuda! –

43

Aquí es el código 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; 
} 
+0

donde lat1, lon1, lat2 y lon2 están en radianes ??? Probablemente no. Entonces, ¿por qué cambias el nombre de longitude1 y longitude2? – Radu

8

cojinete de una coordenada a otra y encontrar el norte, este, sur, Weast :) enter image description here

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

Un poco limpia versión de @IvanT answer:

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

Dónde LatLng es:

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