DMS转换方法不接受没有秒部分的输入

1 投票
1 回答
21 浏览
提问于 2025-04-14 17:36

我在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格式输入呢?比如:对于开放测试:gc_dakota: GeoCoordinates(dms=44°05′N 120°34′W),我希望输出的结果是:44°05′N 120°34′W的坐标。

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)

撰写回答