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

时间:2010-04-05 16:32:41

标签: python angle degrees format-conversion unit-conversion

如何在Python中将十进制度转换为度数分钟秒?是否已经编写了一个公式?

11 个答案:

答案 0 :(得分:13)

这正是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)

答案 1 :(得分:9)

这是我基于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)

答案 2 :(得分:8)

如果要正确处理负数,则将第一个非零指标设置为负数。与通常的做法相反,将所有度数,分钟和秒指定为负数(Wikipedia显示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)

答案 3 :(得分: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
>>> 

答案 4 :(得分:3)

这是我的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), '" ')

答案 5 :(得分:2)

最好单独返回该符号,以便可以使用它来选择('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

答案 6 :(得分:2)

改善@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)

答案 7 :(得分:1)

这是我略有不同的方法,对于正和负十进制度,其工作方式与我的HP Prime相同...

def dms(deg):
    f,d = math.modf(deg)
    s,m = math.modf(abs(f) * 60)
    return (d,m,s * 60)

答案 8 :(得分:0)

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

答案 9 :(得分:0)

现在我们可以使用LatLon库...

https://pypi.org/project/LatLon/

>> palmyra = LatLon(Latitude(5.8833), Longitude(-162.0833)) # Location of Palmyra Atoll in decimal degrees
>> palmyra = LatLon(5.8833, -162.0833) # Same thing but simpler! 
>> palmyra = LatLon(Latitude(degree = 5, minute = 52, second = 59.88),
                     Longitude(degree = -162, minute = -4.998) # or more complicated!
>> print palmyra.to_string('d% %m% %S% %H') # Print coordinates to degree minute second
('5 52 59.88 N', '162 4 59.88 W')`

答案 10 :(得分:0)

如果您的数据位于 DataFrame 中,您可以使用库 clean_lat_long() 中的函数 DataPrep。使用 pip install dataprep 安装 DataPrep。

from dataprep.clean import clean_lat_long
df = pd.DataFrame({"coord": [(45.5003, -122.4420), (5.8833, -162.0833)]})

df2 = clean_lat_long(df, "coord", output_format="dms")
# print(df2)
                 coord                        coord_clean
0  (45.5003, -122.442)  45° 30′ 1.08″ N, 122° 26′ 31.2″ W
1  (5.8833, -162.0833)  5° 52′ 59.88″ N, 162° 4′ 59.88″ W

或者如果纬度和经度在不同的列中:

df = pd.DataFrame({"latitude": [45.5003, 5.8833], "longitude": [-122.4420, -162.0833]})

df2 = clean_lat_long(df, lat_col="latitude", long_col="longitude", output_format="dms")
# print(df2)
   latitude  longitude                 latitude_longitude
0   45.5003  -122.4420  45° 30′ 1.08″ N, 122° 26′ 31.2″ W
1    5.8833  -162.0833  5° 52′ 59.88″ N, 162° 4′ 59.88″ W