El siguiente devuelve 150 grados usando C# convertido desde JavaScript Cojinete de fórmulas, pero Google earth vuelve a 210 grados para los mismos valores. El código roto es GetBearing() pero también he incluido Calcular() para mostrar codificado los valores de la prueba y ParseCoordinate() para demostrar que soy la conversión de Grados-Minutos-segundos a radianes en grados decimales para GetBearing(). Son el JavaScript Teniendo fórmulas mal?
double DEG_PER_RAD = (180.0/Math.PI);
// Return Bearing (degrees)
private double GetBearing(double lat1, double lon1, double lat2, double lon2)
{
var dLon = lon2 - lon1;
var y = Math.Sin(dLon) * Math.Cos(lat2);
var x = Math.Cos(lat1)*Math.Sin(lat2)-Math.Sin(lat1)*Math.Cos(lat2)*Math.Cos(dLon);
return DEG_PER_RAD*Math.Atan2(y, x);
}
private void Calculate()
{
var lon1 = ParseCoordinate("38 51 30.5");
var lat1 = ParseCoordinate("78 12 33.8");
var lon2 = ParseCoordinate("38 45 46.2");
var lat2 = ParseCoordinate("78 16 46.0");
var bearing = GetBearing(lat1, lon1, lat2, lon2);
// Show bearing
...
}
// Convert Degree-Minute-Second to Degree.ddd
private double ParseCoordinate(string coordinate)
{
var dms = coordinate.Split(' ');
var rVal = 0.0;
var i = 0;
foreach (var s in dms)
{
double d;
double.TryParse(s, out d);
rVal += (d/(Math.Pow(60.0, i++)));
}
rVal /= DEG_PER_RAD;
return rVal;
}