一、数据内容结构简介

以月为单位,每个文件代表一个月,每个文件中包括所有站点的详细数据(可能是全国的气象站点)

"中国地面气候资料日值数据集(V3.0)"包含了中国699个基准、基本气象站1951年1月以来本站气压、气温、降水量、蒸发量、相对湿度、风向风速、日照时数和0cm地温要素的日值数据。

如图,

r语言气泡图绘制题目 r语言气象数据整合_csv

其中各列含义依次为

“站点”,“纬度”,“经度”,“海拔”, “年”,“月”,“日”,“平均气温”, “最大气温”,“最小气温”

二、所要实现的效果

源数据是以月为单位,月文件下包含各个站点信息。

所要实现的效果是,以站点为单位,每个站点为一独立文件,该文件下包括各月数据。

本次要单独提出几个站点数据,代号为50136,51470,52602,54351的站点,即每个月文件下的第一列数据。

若要提取所有数据,代码更改部分下文已有简单说明

ps:平均、最大、最小气温数据需要进行单独处理,除10.

最终效果图示:

r语言气泡图绘制题目 r语言气象数据整合_csv_02

三、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文件,运行各个站点文件则直接放在该目录下。

r语言气泡图绘制题目 r语言气象数据整合_r语言气泡图绘制题目_03

四、统计各站点所有年月份的气温总和shp输出

4.1运行环境

在以上处理结果的基础上,对各个分开的各个站点进行汇总统计。

具体来说,也就是,在步骤三的基础上👇(所有的站点)

已经生成好了所有的站点文件。其中,result文件夹为存放结果数据。

r语言气泡图绘制题目 r语言气象数据整合_r语言气泡图绘制题目_04

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文件放在同目录下,运行结果环境如下👇

r语言气泡图绘制题目 r语言气象数据整合_csv_05


shp文件

r语言气泡图绘制题目 r语言气象数据整合_csv_06