如何用R将GPS坐标小数格式转换为DMS(度分秒)格式
R实现GPS小数坐标转DMS格式并识别未知值
核心思路
编写小数坐标转DMS格式的专用函数,批量处理数据框中的经纬度列,同时自动识别并标记各类未知值(包括NA、非数值字符串等)。
步骤1:模拟测试数据
先构造与实际场景匹配的测试数据,包含有效小数坐标、NA、自定义未知标记:
# 模拟含未知值的GPS数据框 gps_df <- data.frame( longitude = c(116.3972, 120.1551, NA, "未知", 104.0668), latitude = c(39.9042, 30.2741, "无数据", 30.6638, NA), stringsAsFactors = FALSE )
步骤2:编写转换函数
该函数会优先识别未知值,仅对有效小数坐标执行DMS转换:
decimal_to_dms <- function(x) { # 识别各类未知值:NA、空字符串、自定义标记 if (is.na(x) || x == "" || x %in% c("未知", "无数据")) { return("未知") } # 转换为数值类型,失败则标记为未知 x_num <- as.numeric(x) if (is.na(x_num)) { return("未知") } # 计算度、分、秒 degrees <- floor(x_num) min_decimal <- abs(x_num - degrees) * 60 minutes <- floor(min_decimal) seconds <- round((min_decimal - minutes) * 60, 1) # 格式化输出,确保分钟为两位、秒为带一位小数的三位格式 sprintf("%d°%02d'%03.1f", degrees, minutes, seconds) }
步骤3:批量处理数据框
对经纬度列批量应用转换函数,合并为目标格式:
# 批量转换经纬度 gps_df$lon_dms <- sapply(gps_df$longitude, decimal_to_dms) gps_df$lat_dms <- sapply(gps_df$latitude, decimal_to_dms) # 合并为需求的"纬度, 经度"格式 gps_df$full_gps_dms <- paste(gps_df$lat_dms, gps_df$lon_dms, sep = ", ") # 查看最终结果 print(gps_df[, c("longitude", "latitude", "full_gps_dms")])
关键说明
- 未知值扩展:如果你的数据有其他格式的未知标记(比如"NA"字符串),直接在函数的判断条件中添加即可。
- 格式化细节:
%02d确保分钟显示为两位数字(如05'而非5'),%03.1f确保秒显示为带一位小数的三位格式(如02.7、67.9)。 - 效率适配:
sapply可高效处理800+行数据,无需手动循环。
内容的提问来源于stack exchange,提问作者Alice Hobbs
相关产品推荐
相关产品推荐

