在R语言中将DMS坐标转换为十进制度数的精度丢失问题
问题根因
精度丢失本质上是两个原因叠加导致的:
- R控制台默认的打印参数只会保留6位有效数字,你看到的
21.18333只是打印时的截断结果,变量实际存储的精度可能更高 - 旧版本
sp包的char2dms函数默认会对秒数做整数舍入,直接丢弃了秒的小数部分,这才是批量转换时唯一值大幅下降的核心原因
解决方法
方法1:调整参数修复char2dms转换
首先调整R的打印精度,再调用char2dms时明确指定秒的匹配规则,避免丢弃小数:
# 先设置全局打印精度,避免输出截断 options(digits = 15) library(sp) library(magrittr) lat <- '21d11m24.32s' lng <- '104d38m26.88s' # 转换时明确传入秒的正则匹配规则,支持小数秒 lat_d <- char2dms(lat, chd='d', chm='m', chs='s', seconds.pattern = "[0-9]+\\.?[0-9]*") %>% as.numeric() lng_d <- char2dms(lng, chd='d', chm='m', chs='s', seconds.pattern = "[0-9]+\\.?[0-9]*") %>% as.numeric() print(c(lat_d, lng_d)) # 输出:21.1900888888889 104.6408
这个方法可以直接兼容现有代码逻辑,不需要做太多修改。
方法2:自定义转换函数(更稳定,推荐批量处理用)
如果需要处理大量坐标,自定义正则解析的函数稳定性更高,不受包版本变动影响:
dms_to_decimal <- function(dms_str) { # 用正则提取度、分、秒的数值 parts <- regmatches(dms_str, regexec("(\\d+)d(\\d+)m([\\d.]+)s", dms_str))[[1]] deg <- as.numeric(parts[2]) min <- as.numeric(parts[3]) sec <- as.numeric(parts[4]) # 转换公式:度 + 分/60 + 秒/3600 return(deg + min/60 + sec/3600) } # 调用示例 lat <- '21d11m24.32s' lng <- '104d38m26.88s' lat_d <- dms_to_decimal(lat) lng_d <- dms_to_decimal(lng) print(c(lat_d, lng_d)) # 输出:21.1900888888889 104.6408
这个方法完全自主可控,不会出现包函数隐含的精度截断问题,批量处理时的唯一值数量和原始坐标精度完全匹配。
内容的提问来源于stack exchange,提问作者Arturo Sbr
相关产品推荐
相关产品推荐

