Convertir DD (degrés décimaux) en DMS (degrés minutes secondes) en Python?
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)
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)
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)
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
>>>
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), '" ')
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
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)
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.