2010-04-05 143 views
10

¿Cómo se convierten grados decimales a grados minutos Secands en Python? ¿Ya hay una fórmula escrita?Cómo convertir DD a DMS en Python

+0

@David: es una cuestión de multiplicar la parte decimal por 60. ¿Qué necesitas más allá de eso? – SilentGhost

Respuesta

0

Use fmod y redondee para obtener los grados y la fracción separados. Multiplica la fracción por 60 y repite para obtener minutos y un resto. Luego, multiplica esa última parte por 60 nuevamente para obtener la cantidad de segundos.

+1

Probablemente quiso decir 'math.modf'. – musiphil

6

Sólo un par de * 60 multiplicaciones y un par de int truncamientos, 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 
>>> 
12

Esto es exactamente lo que divmod fue inventado para:

>>> 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) 
+4

No creo que esto funcione para negativos. –

+2

No funciona con negativo. -122,442 devoluciones (-123,33,28.8). Debería ser (-122,26,31.12) –

+0

@baens - ¿Quiere decir '(-122, -26, -31.12)'? Creo que '-123 + 33/60 + 28.8/3600' de hecho es igual a -122.442' – PaulMcG

7

aquí está mi versión actualizada basan en Paul McGuire's. Éste debe 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) 
5

Si desea manejar los negativos correctamente, la primera medida distinta de cero se establece en negativo. 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 grados-minutos, en el que los grados son negativos y los minutos no tienen signo), y el establecimiento de grados como negativo no tiene ningún efecto si la porción de grados es 0. esta es una función que maneja adecuadamente este, basado en Paul McGuire y funciones 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) 
2

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), '" ') 
+2

Usar 'Decimal' como nombre de variable puede entrar en conflicto con' decimal.Decimal' y no es una buena idea. – musiphil

0

El signo ha regresado ser mejor por separado, de modo que pueda ser utilizado para elegir ('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 
Cuestiones relacionadas