20220707——站点数据插值
站点数据本来是想在GIS里尝试的,发现GIS里那个属性表数据转为点要素这一步好像没有代码,没有办法批量处理;考虑用R语言批量完成站点数据插值为格点数据,掩膜提取后平均分区统计至县域;
站点插值参考:(看不懂的官方help文件以及百度,有的理解也不到位)
R语言空间插值的几种方法及案例应用_R语言中文社区的博客-CSDN博客
这块关于该源码处的经纬度坐标转平面坐标,我自己尝试的时候有点问题,并没有转为平面坐标,并且他会把平面坐标转为经纬度坐标,不太懂???
#dsp1<-spTransform(dsp,CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))#将经纬度转成平面坐标,使用WGS参考系
分区统计参考:
【R-terra包|第二节】:栅格重分类、投影变换、分区统计_地理空间科学的博客-CSDN博客
中途遇到一些问题,比如两个包相同的函数,指定用某一个包的函数方法:
R不同包相同函数名问题(屏蔽警告,使用不同包下相同函数名解决方案)_w7913766的博客-CSDN博客
R处理txt文本数据、插值转栅格掩膜提取并分区统计:
代码在上述相关博客基础上改进完成
library(raster)
library(sp)
library(sf)
library(rgdal)
library(gstat)
library(maptools)
library(xlsx)
library(dismo)
library(terra)
library(xlsx)
library(tidyverse)
library(skimr)
library(DataExplorer)
library(caret)
library(pROC)
library(dplyr)
setwd("D:/ncc_datas/datapre/pre")
filelist <- list.files(pattern="^SURF.*")
filelist
for (i in 1:length(filelist)) {
mydata<-read.table(filelist[i],header=T,na.strings = c("NA"))
mydata<-mydata[,c(1,2,3,10)]
names(mydata)<-c("station","lat","log","tpre")
mydata<-mydata[which(mydata[,2]>=3100 & mydata[,2]<=4300),]
mydata<-mydata[which(mydata[,3]>=11000 & mydata[,3]<=12300),]
mydata<-mydata[which(mydata[,4]<=31000),]
mydata[,2]<-as.character(mydata[,2])
mydata[,2]<-as.numeric(substr(mydata[,2][],start = 1, stop = 2))+as.numeric(substr(mydata[,2][],start = 3, stop = 4))/60
mydata[,3]<-as.character(mydata[,3])
mydata[,3]<-as.numeric(substr(mydata[,3][],start = 1, stop = 3))+as.numeric(substr(mydata[,3][],start = 4, stop = 5))/60
mydata[,4]<-mydata[,4]*0.1
rdata<-aggregate(cbind(mydata$lat,mydata$log,mydata$tpre), by=list(type=mydata$station),mean)
names(rdata)<-c("station","lat","log","tpre")
###interpolation###
bound <- readOGR(dsn = "E:/north china/region", layer = "ncc",
stringsAsFactors = F,
use_iconv = TRUE,
encoding = "UTF-8")
#plot(bound,col="grey")
WGS84<- CRS("+proj=longlat +datum=WGS84 +no_defs")#设置参考系WGS84
bound1<-spTransform(bound,WGS84)#将平面坐标转换成经纬度,使用WGS参考系
dsp <- SpatialPoints(cbind(rdata[,3],rdata[,2]), proj4string=CRS("+proj=longlat +datum=WGS84"))
dsp <- SpatialPointsDataFrame(dsp,rdata)
blank_raster<-raster(nrow=1000,ncol=1000,extent(bound1))
values(blank_raster)<-1
bound_raster<-rasterize(bound1,blank_raster)
bound_raster[!(is.na(bound_raster))] <- 1
Grid<-as(bound_raster,"SpatialGridDataFrame")#首先现将边界栅格转成空间网格
v<- variogram(log(tpre) ~ 1, data =dsp)
#plot(v,plot.number=T)
v.fit<-fit.variogram(v,model=vgm(1,"Ste",1))
#plot(v,v.fit)
kri<-krige(formula=tpre~1,locations=dsp,newdata=Grid,model=v.fit,nmax=12, nmin=10)#location为已知点的坐标;newdata为需要插值的点的位置;nmax和nmin分别代表最多和最少搜索点的个数
#spplot(kri["var1.pred"])
kkri<-raster(kri)
boundcpy <- readOGR(dsn = "D:/ncc_datas/datapre/chinacroparea", layer = "ncccpy",
stringsAsFactors = F,
use_iconv = TRUE,
encoding = "UTF-8")
boundcpy1<-spTransform(boundcpy,WGS84)
#plot(bound1,col="grey")
#掩膜分区统计
kk<-mask(kkri,boundcpy1)
tj<-terra::extract(kk,bound1,mean,na.rm=TRUE)
}
空气污染物栅格数据提取
library(raster)
library(terra)
setwd("D:/ncc_datas/datapre/AAOD/aaod_2005")
filelist <- list.files(pattern="^OMI.*")
filelist
fqtj<-c()
for (i in 1:length(filelist)) {
air<-raster(filelist[i])
boundcpy <- readOGR(dsn = "D:/ncc_datas/datapre/chinacroparea", layer = "ncccpy",
stringsAsFactors = F,
use_iconv = TRUE,
encoding = "UTF-8")
boundcpy1<-spTransform(boundcpy,WGS84)
kk<-mask(air,boundcpy1)
tj<-terra::extract(kk,bound1,mean,na.rm=TRUE)
fqtj<-cbind(fqtj,tj)
}
wjm=paste("D:/ncc_datas/datapre/AAOD/excel/",substr(basename(filelist[i]), start = 21, stop = 24))
path<-file.path(paste(wjm,'.xlsx'))
write.xlsx(tj,file=path,sheetName = "Sheet1",append = TRUE)
栅格数据多年趋势判断:
对于作物耕地格点数据,由于现有的数据时间序列离理想的数据时间序列还差五年,看一下现有数据集中每个格点在00-15年间变化趋势,涉及到栅格数据多年趋势判断,完全参考以下博主代码,可行!
计算栅格数据像元的趋势值及检验值P_低调的大耳朵图图的博客-CSDN博客
博主源码上自己按自己的数据修改了一丢丢
[a,R]=geotiffread('Maize2000.tif.tif');%先导入某个图像的投影信息,为后续图像输出做准确
info=geotiffinfo('Maize2000.tif.tif');
[m,n]=size(a);
years=16;
data=zeros(m*n,years);
k=1;
list=dir('M*.tif')
for i=1:16
file=list(i).name
bz=importdata(file);
bz=reshape(bz,m*n,1);
data(:,k)=bz;
k=k+1;
end
xielv=zeros(m,n);p=zeros(m,n);
for j=1:length(data)
bz=data(j,:);
bz=bz';
X=[ones(size(bz)) bz];
X(:,2)=[1:years]';
[b,bint,r,rint,stats] = regress(bz,X);
pz=stats(3);
p(j)=pz;
xielv(j)=b(2);
end
name1='slope.tif';
name2='myp_P.tif';
geotiffwrite(name1,xielv,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
geotiffwrite(name2,p,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
栅格数据按属性提取:比如作物耕地网格有无,按属性提取有耕地的网格后,无法用它来裁剪具有耕地区域的一些数据,?
参考以下博主:Arcgis基础操作之栅格数据的按掩膜提取和属性提取_哔哩哔哩_bilibili
好像只能手动将栅格先转为面,再按属性表中的字段值来提取有耕地区域的面要素
栅格统一转成面要素后,可以按属性提取:“筛选”
https://jingyan.baidu.com/article/6dad5075cc9263e022e36e2e.html
多个文件夹处理:
[R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。 - #小小林 - 博客园
20220708——栅格数据掩膜以及分区统计
在R里进行上述操作12幅图得半个小时,在ARCGIS里,只需要一分钟,转——ARCGIS处理
GIS里处理也真不错,可以查看官方文档有示例代码,也可以先手动,然后完成一幅图后在“结果”中复制代码;
9.批量栅格裁剪并分区统计
import arcpy
from arcpy.sa import *
arcpy.env.workspace=r'D:\ncc_datas\datapre\AAOD\aaod_2007'
rasters=arcpy.ListRasters("OMI*",'tif')
mask=r'D:\ncc_datas\datapre\maizeaa\m2007.shp'
outpath=r'D:\ncc_datas\datapre\my'
outpathb=r'D:\ncc_datas\datapre\AAOD\excel-2007'
for raster in rasters:
... out=outpath+'\\'+raster.split("_")[2].split(".")[0]+".tif"
... tif=ExtractByMask(raster, mask)
arcpy.CheckOutExtension("Spatial")
outtable=outpath+'\\'+raster.split("_")[2].split(".")[0]+".dbf"
outzsat=ZonalStatisticsAsTable("E:/north china/region/ncc.shp", "PAC", tif,outtable, "DATA", "MEAN")
out_xls = outpathb+'\\'+raster.split("_")[2].split(".")[0]+".xls"
arcpy.TableToExcel_conversion(outzsat, out_xls)
R语言处理空间数据太慢了,还是再尝试一下GIS吧;
站点数据QGIS批转为点要素文件后,再GIS试着插值处理吧
20220709——站点数据QGIS批转为点要素文件后,再GIS插值批处理
批量点要素插值,掩膜以及分区统计
import arcpy
from arcpy.sa import *
arcpy.env.workspace=r'D:\ncc_datas\datapre\tmax\tma_2005'
featureclasses = arcpy.ListFeatureClasses("t*","point")
outpath=r'D:\ncc_datas\datapre\tmax\shiyan'
mask=r'D:\ncc_datas\datapre\maizeaa\m2005.shp'
outpathb=r'D:\ncc_datas\datapre\tmax\excel_2005'
for featureclass in featureclasses:
... out=outpath+'\\'+featureclass.split("-")[2].split(".")[0]+".tif"
... kri=arcpy.gp.Kriging_sa(featureclass, "Field4", out, "Spherical 0.047800", "0.01", "VARIABLE 12", "")
... tif=ExtractByMask(kri, mask)
... arcpy.CheckOutExtension("Spatial")
... outtable=outpath+'\\'+featureclass.split("-")[2].split(".")[0]+".dbf"
... outzsat=ZonalStatisticsAsTable("E:/north china/region/ncc.shp", "PAC", tif,outtable, "DATA", "MEAN")
... out_xls = outpathb+'\\'+featureclass.split("-")[2].split(".")[0]+".xls"
... arcpy.TableToExcel_conversion(outzsat, out_xls)
GEE里重新掩膜分区整理ERA5辐射数据
20220801——
换了电脑后把之前GIS文件拷贝过来后,发现连接不上xlsx的表格;参考以下大神操作,解决!