DMS转换方法不接受没有秒部分的输入
我在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)