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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 00:26:05