如何在Python中将十进制度数(DD)转换为度分秒(DMS)?

25 投票
15 回答
53779 浏览
提问于 2025-04-15 21:15

你想知道怎么把十进制度(Decimal Degrees)转换成度分秒(Degrees Minutes Seconds)在Python里吗?有没有现成的公式可以用?

15 个回答

14

如果你想正确处理负数,首先要把第一个非零的数值设为负数。通常情况下,我们不会把度、分和秒都标记为负数(维基百科上有个例子,显示40° 26.7717, -79° 56.93172是一个有效的度分表示法,其中度是负的,而分没有符号),而且如果度的部分是0,设置度为负数也没有任何效果。下面是一个函数,它能很好地处理这个问题,基于Paul McGuire和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)
17

这是我根据Paul McGuire的版本更新的。这一版应该能正确处理负数。

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)
28

这正是 divmod 被发明出来的目的:

def decdeg2dms(dd):
    mult = -1 if dd < 0 else 1
    mnt,sec = divmod(abs(dd)*3600, 60)
    deg,mnt = divmod(mnt, 60)
    return mult*deg, mult*mnt, mult*sec

dd = 45 + 30/60 + 1/3600
print(decdeg2dms(dd))

# negative value returns all negative elements
print(decdeg2dms(-122.442))

输出结果是:

(45.0, 30.0, 1.0)
(-122.0, -26.0, -31.199999999953434)

撰写回答