经纬度有两种常见的形式,度分秒形式和小数点形式。在GIS软件中,利用经纬度生成坐标点一般都需要将度分秒形式的经纬度转换为小数点形式,如何方便的进行转换呢?EXCEL确实可以,但是每次都要修改很多公式,而且经常不知道为啥报错,今天我终于用R语言写出来了一个小程序,可以比较方便的将EXCEL中的度分秒经纬度转化为小数点,在这里记录分享一下。
EXCEL转换方式可以参阅往期文章:GIS基础教程之坐标系
R语言安装部署请参阅:R语言安装部署基础
下面是今天拿到的经纬度度分秒数据,表头E, N东经北纬,用上面引用的第一篇文章中的公式提取分、秒总是出错,所以我决定写一个程序出来,一劳永逸解决经纬度转换这个麻烦的问题。
使用过程中只需稍微修改一下代码即可,主要修改输入数据名称,分隔符。
简述一下写这个程序的思路:首先,读取数据,读取完成后,使用strsplit()函数进行度分秒的分割,然后使用循环语句,提取分割后的度分秒值,然后转换为数字型,计算,建立数据框,输出计算结果。
library(readxl)
ENdata <- read_excel(path = "样点.xlsx", sheet = 1, col_names = T) #读取EXCEL数据
EDegreedata <- strsplit(ENdata$E, split = "°") #度分隔符
Du <- vector()
for (i in 1:length(EDegreedata)){
Du[i] <- EDegreedata[[i]][1]
}
FenMiao <- vector()
for (i in 1:length(EDegreedata)){
FenMiao[i] <- EDegreedata[[i]][2]
}
EMindata <- strsplit(FenMiao, split = "′") #分分隔符
Fen <- vector()
for (i in 1:length(EMindata)){
Fen[i] <- EMindata[[i]][1]
}
Miao <- vector()
for (i in 1:length(EMindata)) {
Miao[i] <- EMindata[[i]][2]
}
Miaodata <- strsplit(Miao, split = "″") #秒分隔符
for (i in 1:length(Miaodata)) {
Miao[i] <- Miaodata[[i]]
}
E <- as.numeric(Du)+as.numeric(Fen)/60+as.numeric(Miao)/3600
NDegreedata <- strsplit(ENdata$N, split = "°") #度分隔符
Du <- vector()
for (i in 1:length(NDegreedata)){
Du[i] <- NDegreedata[[i]][1]
}
FenMiao <- vector()
for (i in 1:length(NDegreedata)){
FenMiao[i] <- NDegreedata[[i]][2]
}
NMindata <- strsplit(FenMiao, split = "′") #分分隔符
Fen <- vector()
for (i in 1:length(NMindata)){
Fen[i] <- NMindata[[i]][1]
}
Miao <- vector()
for (i in 1:length(NMindata)) {
Miao[i] <- NMindata[[i]][2]
}
Miaodata <- strsplit(Miao, split = "″") #秒分隔符
for (i in 1:length(Miaodata)) {
Miao[i] <- Miaodata[[i]]
}
N <- as.numeric(Du)+as.numeric(Fen)/60+as.numeric(Miao)/3600
EN <- data.frame(E,N)
write.csv(EN, file = "EN.csv") #输出结果文件
关于程序的执行,建议先运行前两行,读取EXCEL数据,主要是实际EXCEL中分隔符未必和程序中指定的一样,需要查看一下数据读取结果确认一下。
然后查看读取的数据中分隔符样式
如果和程序中不一样,可以先把上图中度分秒分割符依次在程序中注明的分隔符位置进行替换,修改后程序就可以正常运行了。
运行完成后即可打开“EN.csv”文件查看转换后的经纬度。
不过语句中包含了大量的循环,语句写的比较麻烦,执行效率也低,如果有R语言的大神,还请指点一下,如何能够修改语句,提高它的运行效率。