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

Python实现DSM格式地理坐标转十进制坐标报错解决

解决DSM坐标转十进制坐标并生成元组的问题

问题分析

你碰到的could not convert string to float: "45'49."错误,本质是DSM格式的坐标字符串包含单引号、多余末尾小数点这类非数值字符,无法直接转成浮点数。得先解析字符串提取度、分信息,再计算十进制坐标值。

解决方案

1. 编写坐标转换函数

先实现一个处理单个DSM坐标字符串的函数,完成格式清洗与数值转换:

def dsm_to_decimal(coordinate_str):
    # 移除字符串末尾多余的小数点
    coordinate_str = coordinate_str.rstrip('.')
    # 按单引号拆分度和分(DSM格式为「度'分」)
    degrees, minutes = coordinate_str.split("'")
    # 十进制坐标计算公式:度 + 分/60
    decimal_coord = float(degrees) + float(minutes)/60
    return decimal_coord

2. 批量处理DataFrame并生成元组列

假设你的DataFrame名为df,用apply方法批量转换经纬度,再组合成元组列:

import pandas as pd

# 模拟你的原始数据结构
data = {
    'longitude': ["2'45.8167", "8'31.3133", "8'41.3133"],
    'latitude': ["47'29.8583", "46'44.7967", "45'42.7967"]
}
df = pd.DataFrame(data)

# 转换经纬度为十进制值
df['lon_decimal'] = df['longitude'].apply(dsm_to_decimal)
df['lat_decimal'] = df['latitude'].apply(dsm_to_decimal)

# 生成坐标元组列
df['coordinate_tuple'] = list(zip(df['lon_decimal'], df['lat_decimal']))

# 查看结果
print(df['coordinate_tuple'])

3. 验证输出结果

运行代码后,coordinate_tuple列会生成你预期的结果:

(2.763611111111111, 47.49763888888889)
(8.52188888888889, 46.74661111111111)
(8.688555555555555, 45.71327777777778)

可选:处理带方向符号的坐标

如果你的坐标包含西经(W)或南纬(S)符号,可修改函数添加符号判断:

def dsm_to_decimal(coordinate_str):
    # 判断坐标方向,西经/南纬取负号
    sign = -1 if ('W' in coordinate_str or 'S' in coordinate_str) else 1
    # 移除方向符号和末尾小数点
    coordinate_str = coordinate_str.replace('W', '').replace('S', '').rstrip('.')
    degrees, minutes = coordinate_str.split("'")
    decimal_coord = sign * (float(degrees) + float(minutes)/60)
    return decimal_coord

内容的提问来源于stack exchange,提问作者MARCOS SANTOS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:08:30