一、数据内容结构简介
以月为单位,每个文件代表一个月,每个文件中包括所有站点的详细数据(可能是全国的气象站点)
"中国地面气候资料日值数据集(V3.0)"包含了中国699个基准、基本气象站1951年1月以来本站气压、气温、降水量、蒸发量、相对湿度、风向风速、日照时数和0cm地温要素的日值数据。
如图,
其中各列含义依次为
“站点”,“纬度”,“经度”,“海拔”, “年”,“月”,“日”,“平均气温”, “最大气温”,“最小气温”
二、所要实现的效果
源数据是以月为单位,月文件下包含各个站点信息。
所要实现的效果是,以站点为单位,每个站点为一独立文件,该文件下包括各月数据。
本次要单独提出几个站点数据,代号为50136,51470,52602,54351的站点,即每个月文件下的第一列数据。
若要提取所有数据,代码更改部分下文已有简单说明
ps:平均、最大、最小气温数据需要进行单独处理,除10.
最终效果图示:
三、R脚本实现
3.1初级版本——部分站点提取
rm(list = ls())
setwd("B:/Temp3/test")
#筛选出所有数据文件,以“SURF_CLI_CHN_MUL_DAY-TEM”为搜索关键词----
flies=list.files(pattern = "SURF_CLI_CHN_MUL_DAY-TEM")
#检索每一个文件内容----------------------------------------------
for (flie in 1:length(flies)) {
data<-read.table(file = flies[flie])
#将数据按照V1列分组(站点列)
sites=split(data,f=data$V1)
#定义所需站点数组,若要提取所有数据,只需更改此处,以及site
#即以下三列,for控制改为length(sites)
partldata=c(50136,51470,52602,54351)
for (i in partldata) {
#单独一个站点的数据(dataframe格式)
site=data.frame(sites[[paste(i)]])
write.table(site[,1:10],#只取前10列
paste(sites[[paste(i)]][1,1],
"站点.csv"),#文件名
sep = "," ,#以“,”分割才能有正常格式,很迷
append = T,#每个文件(每个月份)的数据都依次追加
row.names = F,
col.names = F)
print(paste(i,"完成"))
}
print("Yeah! 又完成了一个文件")
}
print("Good!")
#为其添加列名,并处理气温数据-------------------------------------
#搜索出完成的文件,以“5”开头、“.csv”为结尾为特征搜索
data5=list.files(pattern = "5*.csv$")
for (j in 1:length(data5)) {
datacsv=read.csv(data5[j],header = F)
names(datacsv)<-c("站点","纬度","经度","海拔",
"年","月","日","平均气温",
"最大气温","最小气温")
#datacsv$平均气温<-datacsv$平均气温/10
#datacsv$最大气温<-datacsv$最大气温/10
#datacsv$最小气温<-datacsv$最小气温/10
write.table(datacsv,
paste(data5[j]),
sep = "," ,
append=F,
row.names = F)
}
3.1终极版本——全部站点处理
(此版本为后期更新,未在下载中存留)
rm(list = ls())
setwd("B:/Temp3/test1")
#筛选出所有数据文件,以“SURF_CLI_CHN_MUL_DAY-TEM”为搜索关键词----
flies=list.files(pattern = "SURF_CLI_CHN_MUL_DAY-TEM")
flies
#检索每一个文件内容----------------------------------------------
for (flie in 1:length(flies)) {
data<-read.table(file = flies[flie])
#将数据按照V1列分组(站点列)
sites=split(data,f=data$V1)
for (i in 1:length(sites)) {
#单独一个站点的数据(dataframe格式)
site=data.frame(sites[i])
write.table(site[,1:10],#只取前10列
paste(sites[[i]][1,1],
"站点.csv"),#文件名
sep = "," ,#以“,”分割才能有正常格式,很迷
append = T,#每个文件(每个月份)的数据都依次追加
row.names = F,
col.names = F)
print(sites[[i]][1,1])
}
print("Yeah! 又完成了一个文件")
}
print("Good!")
#为其添加列名,并处理气温数据-------------------------------------
#搜索出完成的文件,以“5”开头、“.csv”为结尾为特征搜索
data5=list.files(pattern = "5*.csv$")
for (j in 1:length(data5)) {
datacsv=read.csv(data5[j],header = F)
#names(datacsv)<-c("站点","纬度","经度","海拔",
# "年","月","日","平均气温",
# "最大气温","最小气温")
datacsv$V8<-datacsv$V8/10
datacsv$V9<-datacsv$V9/10
datacsv$V10<-datacsv$V10/10
write.table(datacsv,
paste(data5[j]),
sep = "," ,
append=F,
row.names = F,
col.names=F
)
}
P.S. 代码后期做了微小的调整。
①
对经纬度进行除100注:此处经纬度有瑕疵,不能简单除100,我没有做修改,大家注意②对三个气温进行除10
③去掉了加入列名代码,因为后期处理不方便
终极版本运行环境如下(包含运行结果)
环境下为各个气象TXT文件,运行各个站点文件则直接放在该目录下。
四、统计各站点所有年月份的气温总和shp输出
4.1运行环境
在以上处理结果的基础上,对各个分开的各个站点进行汇总统计。
具体来说,也就是,在步骤三的基础上👇(所有的站点)
已经生成好了所有的站点文件。其中,result文件夹为存放结果数据。
4.2代码实现
rm(list = ls())
setwd("B:/Temp3/test1")
#导包-----------------------------------------------------
library(maptools)
library(rgdal)
library(sp)
#读取数据--------------------------------------------------
data5=list.files(pattern = "5*.csv$")
#汇总数据-------------------------------------------------
for (j in 1:length(data5)) {
datacsv=read.csv(data5[j],header = F)
id=datacsv[1,1]
longitude=datacsv[1,2]
latitude=datacsv[1,3]
SumTem=sum(datacsv[,8])#计算该站点所有年月份的气温总和
datacsv=matrix(c(id,longitude,latitude,SumTem),1)
write.table(datacsv,
"result/sitelocation.csv",
sep = "," ,
append=T,
row.names = F,
col.names = F)
}
#添加列名----------------------------------------------------
resultdata=read.csv("result/sitelocation.csv",header = F)
names(resultdata)<-c("site","Lat","Lon","tem")
write.table(resultdata,"result/sitelocation.csv",sep = "," ,append=F,row.names = F)
#生成shp文件-------------------------------------------------
resultdata=read.csv("result/sitelocation.csv",header = T)
coordinates(resultdata)<-~Lon+Lat
proj4string(resultdata)<-CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
writeOGR(resultdata,
dsn = "B:/Temp3/test1/result",#设置输出路径
layer = "result",#设置保存名称
driver = "ESRI Shapefile",#设置输出类型
overwrite_layer = T) #是否覆盖)
proj4坐标系网站:
P.S 生成shp文件时,尽量不要用汉字列名~ 不要用汉字~ 不要用汉字~
特别是设置其坐标参考系参数的时候~
4.3结果环境及成果
运行汇总的所有气温数据均放在一个csv中,并将shp文件放在同目录下,运行结果环境如下👇
shp文件