Je ne pense pas que cela fonctionne pour les négatifs. Il ne fonctionne pas avec les négatifs. -122.442 retourne (-123,33,28.8). Devrait être (-122,26,31.12) voulez-vous dire (-122, -26, -31.12)? Je pense que -123 + 33/60 + 28.8/3600, dans les faits, l'égalité des -122.442 Une multiplication par 3600, suivie par 2 divisions par 60, n'a pas l'air aussi efficace que possible.
Si vous souhaitez gérer négatifs correctement, le premier non nul de mesure est définie négative. Il est contraire à la pratique courante de spécifier tous les degrés, les minutes et les secondes comme négatifs (Wikipedia affiche 40° 26.7717, -79° 56.93172 comme un exemple valable de degrés-minutes de notation, dont les diplômes sont négatifs et les minutes ont pas de signe), et en définissant des degrés négatifs n'ont aucun effet si les degrés partie est de 0. Voici une fonction qui gère adéquatement, selon Paul McGuire et baens fonctions:
defDecimaltoDMS(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),'" ')
À l'aide de Decimal comme un nom de variable peut entrer en conflit avec decimal.Decimal et n'est pas une bonne idée. Grande réponse. J'ai improoved vous code.
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][0if d >=0else1]return'{}º{}\'{:.2f}"{}'.format(abs(d), abs(m), abs(s), compass_str)
Utilisation fmod et arrondi pour 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. Il faut multiplier cette dernière partie de 60 à nouveau pour obtenir le nombre de secondes.
C'est exactement ce que
divmod
a été inventé pour:Il ne fonctionne pas avec les négatifs. -122.442 retourne (-123,33,28.8). Devrait être (-122,26,31.12)
voulez-vous dire
(-122, -26, -31.12)
? Je pense que-123 + 33/60 + 28.8/3600
, dans les faits, l'égalité des-122.442
Une multiplication par 3600, suivie par 2 divisions par 60, n'a pas l'air aussi efficace que possible.
OriginalL'auteur PaulMcG
Voici ma version mise à jour basé sur Paul McGuire. Celui-ci doit gérer négatifs correctement.
OriginalL'auteur Erik L
Si vous souhaitez gérer négatifs correctement, le premier non nul de mesure est définie négative. Il est contraire à la pratique courante de spécifier tous les degrés, les minutes et les secondes comme négatifs (Wikipedia affiche 40° 26.7717, -79° 56.93172 comme un exemple valable de degrés-minutes de notation, dont les diplômes sont négatifs et les minutes ont pas de signe), et en définissant des degrés négatifs n'ont aucun effet si les degrés partie est de 0. Voici une fonction qui gère adéquatement, selon Paul McGuire et baens fonctions:
OriginalL'auteur iamed2
Juste un couple de
* 60
de multiplications et d'un couple deint
troncatures, c'est à dire:OriginalL'auteur Alex Martelli
C'est mon code Python:
Decimal
comme un nom de variable peut entrer en conflit avecdecimal.Decimal
et n'est pas une bonne idée.Grande réponse. J'ai improoved vous code.
OriginalL'auteur
Le signe a de mieux être retournés séparément, de sorte qu'il peut être utilisé pour choisir
('N', 'S')
ou('E', 'W')
, par exemple.OriginalL'auteur musiphil
L'amélioration de @chqrlie réponse:
OriginalL'auteur Gustavo Gonçalves
Utilisation
fmod
et arrondi pour 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. Il faut multiplier cette dernière partie de 60 à nouveau pour obtenir le nombre de secondes.math.modf
.OriginalL'auteur Donal Fellows