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
相关产品推荐
相关产品推荐

