Python DMS转经纬度方法兼容无秒数输入的改造问询
问题:DMS格式转经纬度方法兼容无秒数输入
我用Python实现了一个度分秒(DMS)转经纬度的方法,但它仅支持包含秒数的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)
解决方案
原代码的问题在于直接将正则提取结果解构为8个变量,但无秒数的输入只会提取出6个元素(纬度:度、分、方向;经度:度、分、方向),导致解构时数量不匹配报错。修改思路是先提取所有匹配内容,再判断是否缺少秒数,自动补0后再计算。
修改后的代码:
import re def convert_dms_to_lat_long(self, dms): # 提取输入中的所有数字和方向标识(N/S/E/W) parts = re.findall(r'\d+|[NSEW]', dms) # 处理纬度部分:判断是否存在秒数,无则补0 if len(parts[:3]) == 2: lat_deg, lat_min, lat_dir = parts[:3] lat_sec = '0' else: lat_deg, lat_min, lat_sec, lat_dir = parts[:4] # 处理经度部分:根据纬度的结构调整起始索引,再判断是否缺秒 long_start_idx = 3 if len(parts[:3]) == 2 else 4 long_parts = parts[long_start_idx:] if len(long_parts) == 2: long_deg, long_min, long_dir = long_parts long_sec = '0' else: long_deg, long_min, long_sec, long_dir = long_parts # 计算纬度值 lat = int(lat_deg) + float(lat_min)/60 + float(lat_sec)/3600 # 计算经度值,根据方向处理正负 long_val = int(long_deg) + float(long_min)/60 + float(long_sec)/3600 if long_dir in ['S', 'W']: long_val = -long_val return round(lat, 5), round(long_val, 5)
关键修改说明
- 不再直接解构正则结果,先将所有匹配内容存入列表,避免数量不匹配的报错
- 分别对纬度、经度部分做判断,缺少秒数时自动补
'0',保证计算逻辑统一 - 经度部分的起始索引根据纬度的结构动态调整,确保取到正确的经度片段
测试用例输入44°05′N 120°34′W,会自动补全秒数为0,最终输出经纬度:(44.08333, -120.56667)
内容的提问来源于stack exchange,提问作者kylie
相关产品推荐
相关产品推荐

