DMS 转换方法不接受没有秒组件的输入

问题描述 投票:0回答:1

我的 Python 代码中有一个方法可以将纬度和经度转换为度分秒 (DMS) 格式。但是,我注意到该方法仅接受格式为

44°05′00″N 120°34′00″W
的输入,其中秒组件是明确指定的。当我尝试输入不带秒分量的纬度和经度(如
44°05′N 120°34′W
)时,该方法会引发错误。

def convert_dms_to_lat_long(self, dms):
        # Convert DMS format to latitude and longitude
        lat_deg, lat_min, lat_sec, lat_dir, long_deg, long_min, long_sec, long_dir = re.findall(r'\d+|[NSEW]', dms)
        lat = int(lat_deg) + float(lat_min)/60 + float(lat_sec)/3600
        long = -(int(long_deg) + float(long_min)/60 + float(long_sec)/3600) if long_dir in ['S', 'W'] else int(long_deg) + float(long_min)/60 + float(long_sec)/3600
        return round(lat, 5), round(long, 5)

有没有办法修改此方法,使其接受 DMS 格式中不带秒组件的输入?

python math tuples
1个回答
0
投票

尝试:

import re


def convert_dms_to_lat_long(dms):
    # Convert DMS format to latitude and longitude
    lat_deg, lat_min, lat_sec, lat_dir, long_deg, long_min, long_sec, long_dir = (
        re.match(
            r"(\d+)°(\d+)′(?:(\d+)″)?([NSEW]) (\d+)°(\d+)′(?:(\d+)″)?([NSEW])", dms
        ).groups()
    )
    lat_sec = 0 if lat_sec is None else lat_sec
    long_sec = 0 if long_sec is None else long_sec

    lat = int(lat_deg) + float(lat_min) / 60 + float(lat_sec) / 3600
    long = (
        -(int(long_deg) + float(long_min) / 60 + float(long_sec) / 3600)
        if long_dir in ["S", "W"]
        else int(long_deg) + float(long_min) / 60 + float(long_sec) / 3600
    )
    return round(lat, 5), round(long, 5)


print(convert_dms_to_lat_long("44°05′00″N 120°34′00″W"))
print(convert_dms_to_lat_long("44°05′N 120°34′00″W"))
print(convert_dms_to_lat_long("44°05′00″N 120°34′W"))
print(convert_dms_to_lat_long("44°05′N 120°34′W"))

打印:

(44.08333, -120.56667)
(44.08333, -120.56667)
(44.08333, -120.56667)
(44.08333, -120.56667)
© www.soinside.com 2019 - 2024. All rights reserved.