我的 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 格式中不带秒组件的输入?
尝试:
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)