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

Dav*_*vid 15 python angle format-conversion degrees unit-conversion

你如何在Python中将十进制度转换为度数分钟秒?有没有已经写过的公式?

Pau*_*McG 15

这正是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)
Run Code Online (Sandbox Code Playgroud)

  • 它不适用于否定.-122.442返回(-123,33,28.8).应该是(-122,26,31.12) (2认同)
  • 只花了 10 年时间,但这里有一个解决方案,所有值都是正值或负值,而不是混合的。 (2认同)

Eri*_*k L 10

这是我基于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)
Run Code Online (Sandbox Code Playgroud)


小智 8

如果要正确处理负数,则将第一个非零度量设置为负数.与通常的做法相反,将所有度,分和秒指定为负数(维基百科显示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)
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 6

只需几次* 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
>>> 
Run Code Online (Sandbox Code Playgroud)


小智 5

这是我的Python代码:

\n\n
def DecimaltoDMS(Decimal):\n    d = int(Decimal)\n    m = int((Decimal - d) * 60)\n    s = (Decimal - d - m/60) * 3600.00\n    z= round(s, 2)\n    if d >= 0:\n        print ("N ", abs(d), "\xc2\xba ", abs(m), "\' ", abs(z), \'" \')\n    else:\n        print ("S ", abs(d), "\xc2\xba ", abs(m), "\' ", abs(z), \'" \')\n
Run Code Online (Sandbox Code Playgroud)\n

  • 使用“Decimal”作为变量名可能会与“decimal.Decimal”冲突,这不是一个好主意。 (4认同)

Gus*_*ves 5

改进@chqrlie 答案:

\n\n
    def deg_to_dms(deg, type=\'lat\'):\n        decimals, number = math.modf(deg)\n        d = int(number)\n        m = int(decimals * 60)\n        s = (deg - d - m / 60) * 3600.00\n        compass = {\n            \'lat\': (\'N\',\'S\'),\n            \'lon\': (\'E\',\'W\')\n        }\n        compass_str = compass[type][0 if d >= 0 else 1]\n        return \'{}\xc2\xba{}\\\'{:.2f}"{}\'.format(abs(d), abs(m), abs(s), compass_str)\n
Run Code Online (Sandbox Code Playgroud)\n


Don*_*ows 0

使用fmod和 四舍五入将度数和分数分开。将分数乘以 60 并重复以获得分钟和余数。然后将最后一部分再次乘以 60 即可得到秒数。