使用R语言将经纬度度分秒转为小数。
原始**度分秒**数据----------->>>>>>>> -----转换后的数据如图:
R代码如下:
rm(list = ls())
# 安装加载相应的包
library(xlsx)
library(stringr)
library(magrittr)
library(sp)
##### 公式开始 #####
dms2dd <- function(dms, EN="E"){ # EN默认设置为E,在DMS类中有E和N方向。在这里我们只需将度分秒转为数字,所以不必考虑方向的问题。
char.dms <- str_c(dms,"E") %>% # 并不影响最后的结果
str_replace(replacement = "d", pattern = "°") %>% # 这里用英文符号'和"替换了中文符号′与″
str_replace(replacement = "'", pattern = "′") %>% # 注意符号是中文字符还是英文字符
str_replace(replacement = "\"", pattern = "″") # "与″ '与′ 是不一样的。 DMS类中需要英文字符
dms <- char2dms(char.dms)
d <- dms@deg # 从dms类中获取度、分、秒的数值
m <- dms@min
s <- dms@sec
dd <- d + m/60 + s/3600 # 进行数据转换
return(dd)
}
##### 公式结束 #####
# 测试 ----------------------------------------------------------------------
# 1.导入数据
lonlat <- xlsx::read.xlsx(file = "lonlat.xlsx", sheetIndex = 1, header = T)
# 2.数据度分秒转数字
templist <- lapply(lonlat, dms2dd)
outlonlat <- do.call(cbind, templist)
# 3.输出结果
write.xlsx(outlonlat, file = "lonlat_new.xlsx", row.names = F)
这里主要利用sp包中DMS类中的相关方法。有兴趣的小伙伴可以看下例如:char2dms()和dd2dms()等相关函数。
首先利用stringr包中的字符串替换函数str_replace(),将度分秒的符号直接转为DMS类中可以识别的符号,然后进行数据的转换。