空间数据处理——R、matlab、GIS

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的表格;参考以下大神操作,解决!

ArcMap打开/连接Excel表格问题汇总 - 走看看 (zoukankan.com)

猜你喜欢

转载自blog.csdn.net/weixin_45626690/article/details/125660211
今日推荐