Convertir DD (degrés décimaux) en DMS (degrés minutes secondes) en Python?

comment convertissez-vous les degrés décimaux en degrés Minutes secondes en Python? Est-il une Formule déjà écrit?

13
demandé sur smci 2010-04-05 20:32:40

8 réponses

C'est exactement ce que divmod a été inventé pour:

>>> 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)
13
répondu PaulMcG 2010-04-05 18:32:02

voici ma version mise à jour basée sur celle de Paul McGuire. Celui-ci doit traiter les négatifs correctement.

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)
8
répondu Erik L 2012-04-23 19:07:47

si vous voulez manipuler les négatifs correctement, la première mesure non nulle est positionnée négative. Il est contraire à la pratique courante de spécifier tous les degrés, minutes et secondes comme négatifs (Wikipédia indique 40° 26,7717, -79 ° 56,93172 comme exemple valide de notation degrés-minutes, dans laquelle les degrés sont négatifs et les minutes n'ont pas de signe), et le réglage degrés comme négatif n'a aucun effet si la portion degrés est 0. Voici une fonction qui gère adéquatement, selon les Fonctions de Paul McGuire et de 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)
7
répondu iamed2 2012-10-05 00:27:06

Juste un couple de * 60 multiplications et un couple de int troncatures, c'est à dire:

>>> 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
>>> 
6
répondu Alex Martelli 2010-04-05 17:56:02

Voici mon code 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), '" ')
3
répondu chqrlie 2015-04-11 09:59:33

le signe doit être retourné séparément, de sorte qu'il puisse être utilisé pour choisir ('N', 'S') ou ('E', 'W'), par exemple.

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
2
répondu musiphil 2015-06-01 22:49:30

améliorer @chqrlie réponse:

    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)
1
répondu Gustavo Gonçalves 2018-09-17 16:16:52

Utiliser fmod arrondi à obtenir les degrés et fractions séparées. Multiplier la fraction par 60 et répéter pour obtenir des minutes et un reste. Ensuite, multipliez cette dernière partie par 60 de nouveau pour obtenir le nombre de secondes.

0
répondu Donal Fellows 2010-04-05 16:51:27