¿Convertir DD (grados decimales) a DMS (grados minutos segundos) en Python?

¿Cómo se convierten los grados decimales en grados Minutos Segundos en Python? ¿Hay una fórmula ya escrita?

Esto es exactamente para lo que divmod fue inventado:

 >>> def decdeg2dms(dd): ... mnt,sec = divmod(dd*3600,60) ... deg,mnt = divmod(mnt,60) ... return deg,mnt,sec >>> dd = 45 + 30.0/60 + 1.0/3600 >>> print dd 45.5002777778 >>> decdeg2dms(dd) (45.0, 30.0, 1.0) 

Aquí está mi versión actualizada basada en la de Paul McGuire. Éste debería manejar los negativos correctamente.

 def decdeg2dms(dd): is_positive = dd >= 0 dd = abs(dd) minutes,seconds = divmod(dd*3600,60) degrees,minutes = divmod(minutes,60) degrees = degrees if is_positive else -degrees return (degrees,minutes,seconds) 

Si desea manejar los negativos correctamente, la primera medida distinta de cero se establece como negativa. Es contrario a la práctica común especificar todos los grados, minutos y segundos como negativos ( Wikipedia muestra 40 ° 26.7717, -79 ° 56.93172 como un ejemplo válido de notación de grados-minutos, en el que los grados son negativos y los minutos no tienen signo), y establecer grados como negativos no tiene ningún efecto si la porción de grados es 0. Aquí hay una función que maneja esto adecuadamente, basada en las funciones de Paul McGuire y Baens:

 def decdeg2dms(dd): negative = dd < 0 dd = abs(dd) minutes,seconds = divmod(dd*3600,60) degrees,minutes = divmod(minutes,60) if negative: if degrees > 0: degrees = -degrees elif minutes > 0: minutes = -minutes else: seconds = -seconds return (degrees,minutes,seconds) 

Solo un par de * 60 multiplicaciones y un par de truncamientos int , es decir:

 >>> decdegrees = 31.125 >>> degrees = int(decdegrees) >>> temp = 60 * (decdegrees - degrees) >>> minutes = int(temp) >>> seconds = 60 * (temp - minutes) >>> print degrees, minutes, seconds 31 7 30.0 >>> 

Este es mi código Python:

 def DecimaltoDMS(Decimal): d = int(Decimal) m = int((Decimal - d) * 60) s = (Decimal - d - m/60) * 3600.00 z= round(s, 2) if d >= 0: print ("N ", abs(d), "º ", abs(m), "' ", abs(z), '" ') else: print ("S ", abs(d), "º ", abs(m), "' ", abs(z), '" ') 

Es mejor que el signo se devuelva por separado, de modo que se pueda utilizar para elegir entre ('N', 'S') o ('E', 'W') , por ejemplo.

 import math def dd_to_dms(degs): neg = degs < 0 degs = (-1) ** neg * degs degs, d_int = math.modf(degs) mins, m_int = math.modf(60 * degs) secs = 60 * mins return neg, d_int, m_int, secs 

Mejorando la respuesta de @chqrlie:

  def deg_to_dms(deg, type='lat'): decimals, number = math.modf(deg) d = int(number) m = int(decimals * 60) s = (deg - d - m / 60) * 3600.00 compass = { 'lat': ('N','S'), 'lon': ('E','W') } compass_str = compass[type][0 if d >= 0 else 1] return '{}º{}\'{:.2f}"{}'.format(abs(d), abs(m), abs(s), compass_str) 

Usa fmod y el redondeo para obtener los grados y la fracción separados. Multiplica la fracción por 60 y repite para obtener minutos y un rest. Luego multiplica esa última parte por 60 nuevamente para obtener el número de segundos.