Конвертировать DD (десятичные градусы) в DMS (градусы, минуты, секунды) в Python? - PullRequest
14 голосов
/ 05 апреля 2010

Как преобразовать десятичные градусы в градусы, минуты, секунды в Python? Формула уже написана?

Ответы [ 8 ]

13 голосов
/ 05 апреля 2010

Это именно то, для чего было изобретено divmod:

>>> 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)
10 голосов
/ 23 апреля 2012

Вот моя обновленная версия, основанная на версии Пола Макгуайра. Этот должен правильно обрабатывать негативы.

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 голосов
/ 05 октября 2012

Если вы хотите правильно обработать негативы, первая ненулевая мера устанавливается как отрицательная. Это противоречит общепринятой практике - указывать все градусы, минуты и секунды как отрицательные ( Википедия показывает 40 ° 26.7717, -79 ° 56.93172 в качестве действительного примера обозначения градусов-минут, в котором градусы отрицательны и минуты не имеют знака), а установка градусов на отрицательное значение не имеет никакого эффекта, если часть градусов равна 0. Вот функция, которая адекватно обрабатывает это, основываясь на функциях Пола МакГвайра и Баенса:

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)
6 голосов
/ 05 апреля 2010

Всего пара * 60 умножений и пара int усечений, т.е.:

>>> 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
>>> 
3 голосов
/ 11 апреля 2015

Это мой код 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 голосов
/ 17 сентября 2018

Улучшение ответа @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)
2 голосов
/ 02 июня 2015

Знак лучше возвращать отдельно, так что его можно использовать, например, для выбора ('N', 'S') или ('E', 'W').

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
0 голосов
/ 05 апреля 2010

Используйте fmod и округление, чтобы разделить градусы и дробь. Умножьте дробь на 60 и повторите, чтобы получить минуты и остаток. Затем умножьте эту последнюю часть на 60 еще раз, чтобы получить количество секунд.

...