2011-07-28 1045 views

Respuesta

8

Creo que esto debería hacerlo.

double decimal_degrees; 

// set decimal_degrees value here 

double minutes = (decimal_degrees - Math.Floor(decimal_degrees)) * 60.0; 
double seconds = (minutes - Math.Floor(minutes)) * 60.0; 
double tenths = (seconds - Math.Floor(seconds)) * 10.0; 
// get rid of fractional part 
minutes = Math.Floor(minutes); 
seconds = Math.Floor(seconds); 
tenths = Math.Floor(tenths); 
27

Aquí hay una clase que hice hace tiempo.

public class GeoAngle 
{ 
    public bool IsNegative { get; set; } 
    public int Degrees { get; set; } 
    public int Minutes { get; set; } 
    public int Seconds { get; set; } 
    public int Milliseconds { get; set; } 



    public static GeoAngle FromDouble(double angleInDegrees) 
    { 
     //ensure the value will fall within the primary range [-180.0..+180.0] 
     while (angleInDegrees < -180.0) 
      angleInDegrees += 360.0; 

     while (angleInDegrees > 180.0) 
      angleInDegrees -= 360.0; 

     var result = new GeoAngle(); 

     //switch the value to positive 
     result.IsNegative = angleInDegrees < 0; 
     angleInDegrees = Math.Abs(angleInDegrees); 

     //gets the degree 
     result.Degrees = (int)Math.Floor(angleInDegrees); 
     var delta = angleInDegrees - result.Degrees; 

     //gets minutes and seconds 
     var seconds = (int)Math.Floor(3600.0 * delta); 
     result.Seconds = seconds % 60; 
     result.Minutes = (int)Math.Floor(seconds/60.0); 
     delta = delta * 3600.0 - seconds; 

     //gets fractions 
     result.Milliseconds = (int)(1000.0 * delta); 

     return result; 
    } 



    public override string ToString() 
    { 
     var degrees = this.IsNegative 
      ? -this.Degrees 
      : this.Degrees; 

     return string.Format(
      "{0}° {1:00}' {2:00}\"", 
      degrees, 
      this.Minutes, 
      this.Seconds); 
    } 



    public string ToString(string format) 
    { 
     switch (format) 
     { 
      case "NS": 
       return string.Format(
        "{0}° {1:00}' {2:00}\".{3:000} {4}", 
        this.Degrees, 
        this.Minutes, 
        this.Seconds, 
        this.Milliseconds, 
        this.IsNegative ? 'S' : 'N'); 

      case "WE": 
       return string.Format(
        "{0}° {1:00}' {2:00}\".{3:000} {4}", 
        this.Degrees, 
        this.Minutes, 
        this.Seconds, 
        this.Milliseconds, 
        this.IsNegative ? 'W' : 'E'); 

      default: 
       throw new NotImplementedException(); 
     } 
    } 
} 
+4

De lejos, esta es la mejor respuesta. –

+0

Esto es bueno, pero a menudo veo segundos como un valor de coma flotante que se ahogará en – Dan

0

Usted puede simplemente utilizar estas 2 funciones:

public Tuple<int,int,int> DecimalToDegrees(decimal decimalValue) 
{ 
return Tuple.Create(Convert.ToInt32(decimal.Truncate(decimalValue)),Convert.ToInt32((decimal.Truncate(Math.Abs(decimalValue)*60))%60),Convert.ToInt32((Math.Abs(decimalValue)*3600)%60)); 
} 

Y:

public decimal DecimalToDegrees(int deg , int min , int sec) 
{ //~2.3825224324453 Meters error due to accuracy 
    return deg+(min/60m)+(sec/3600m); 
} 
Cuestiones relacionadas