如何在Python中将十进制度数(DD)转换为度分秒(DMS)?
你想知道怎么把十进制度(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)