You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:31:19