美文网首页R语言与统计分析数据-R语言-图表-决策-Linux-Python数据科学与R语言
R-地理基础操作-基于空间点的克里金插值(Krige)文末附Kr

R-地理基础操作-基于空间点的克里金插值(Krige)文末附Kr

作者: TroyShen | 来源:发表于2020-01-01 15:49 被阅读0次

目录

  • 0.问题导入
  • 1.随机生成示例数据
  • 2.生成插值目标精度的数据框(本实例以0.5°×0.5°为目标)
  • 3.将样本点转化为坐标点并对降水NA值进行筛除
  • 4.基于样本点进行克里金插值
  • 5.插值结果可视化并出图(图1)
  • 6.总结
  • 7.本篇所使用的软件包(没有的需要通过install.packages('')进行安装)
  • 8.致谢
  • 9.写在最后

0. 问题导入

当我们想把点状数据扩展成面状数据并进行可视化的时候,第一步操作就是插值。通常,我们会在ArcGIS中完成插值操作,今天这篇给大家带来R版的的插值算法(算法已打包成函数,只需要输入同示例数据相同结构的data.frame,即可实现插值与出图,文末附获取方式~)。

1. 随机生成示例数据

1.1 根据extent 生成示例区域shp
如何根据extent批量生成shp请参考R-如何基于并行计算根据extent生成shp,并将一个list的shp文件塌缩为一个shp?

setwd('L:\\JianShu\\20200101')
ex = extent(105,112,42,47)
shp = as(ex,'SpatialPolygons')
crs(shp) = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"

1.1 在示例区域边界范围内随机生成坐标点及对应位置的降水值

long = runif(20,105,112)
lat = runif(20,42,47)
pr = runif(20,0,15)
df = data.frame(long = long,lat = lat,pr = pr)
head(df)
   long      lat        pr
1 107.0188 45.48182 7.6899736
2 111.6168 44.08171 3.1733193
3 111.7310 46.96119 3.1563925
4 107.1516 46.35613 0.1777086
5 105.0868 42.40558 2.7821381
6 108.8859 44.23798 6.0884563

2. 生成插值目标精度的数据框(本实例以0.5°×0.5°为目标)

  long_shp = extent(shp)[1:2]
  lat_shp = extent(shp)[3:4]
  
  long_p = seq(min(long_shp),max(long_shp),by =resolution )
  lat_p = seq(min(lat_shp),max(lat_shp),by = resolution)

  s_p = expand.grid(long_p,lat_p)
  inusa = map.where(x = s_p[,1],y = s_p[,2])
  inusa = !is.na(inusa)
  s_p = s_p[inusa,]  
  colnames(s_p) = c('long','lat')
  coordinates(s_p) = ~ long + lat
  gridded(s_p) = T
  fullgrid(s_p) = F
  proj4string(s_p) = crs(shp)

3. 将样本点转化为坐标点并对降水NA值进行筛除

本篇示例数据不含NA值,但如果你的数据中有含有NA值,这一步将避免因NA值而报错的出现。

pr = as.numeric(df[,3])
  na_index = which(is.na(pr))
    
  df = data.frame(long=df[,1],lat=df[,2],pr=as.numeric(df[,3]))
  df2 = df
  if(length(na_index)>0){
    df = df[-na_index,] 
  }
  coordinates(df) = ~ long+lat
  proj4string(df) = crs(shp)
  print("Pass Phase 2")

4. 基于样本点进行克里金插值

在这一步,我们将完成克里金插值,并将插值结果输出为名为raster.tif 的栅格文件,并储存在(setwd('L:\JianShu\20200101'))路径下。

  f1 = as.formula(pr ~ long+lat)
    
  var.sampl = variogram(f1,df,cloud =F,
                        cutoff = 100000,
                        width = 89900)
  dat.fit = fit.variogram(var.sampl,fit.ranges = F,
                          fit.sills = F,
                          vgm(psill = 14,model = 'Sph',
                              range = 590000,
                              nugget = 0))
  
  
  dat.krig = krige(f1,df,s_p,dat.fit)
  dat.r = raster(dat.krig)
  writeRaster(dat.r,'raster.tif',format = 'GTiff',overwrite = T)

5.插值结果可视化并出图(图1)

在这一步,我们将完成插值结果的可视化与出图。图件存储路径与raster.tif 存储路径一致,同步骤4.

krg.res = as.data.frame(dat.r,xy = T)
  colnames(krg.res) = c('long','lat','pr')
  
  mycolor = colorRampPalette(brewer.pal(11,'Spectral'))(12)
  
  p = ggplot()+
    geom_tile(data = krg.res,aes(x = long,y = lat,fill = pr),
              color = 'transparent')+
    geom_point(data = df2,aes(x = long,y = lat),color = 'black',
               shape =1, size = 5)+
    scale_fill_gradientn(colours = mycolor)+
    theme_bw()+
    theme(
      axis.text =  element_text(face = 'bold',color = 'black',size = 12),
      axis.title =  element_text(face = 'bold',color = 'black',size = 14, hjust = .5),
      legend.text = element_text(face = 'bold',color = 'black',size = 12),
      legend.title = element_blank(),
      legend.position = 'bottom',
      legend.direction = 'horizontal',
      legend.key.width = unit(2,'cm')
    )+
    xlab('Longitude')+
    ylab('Latitude')
  
  png('krige.png',
      height = 20,
      width = 20,
      units = 'cm',
      res = 800)
  print(p)
  dev.off()
图1 克里金插值结果可视化

6. 总结

本篇主要解决了以下几个问题:

  1. 如何在R中根据点数据进行克里金插值?
  2. 如何将克里金插值结果在R中基于ggplot2进行可视化?

7. 本篇所使用的软件包(没有的需要通过install.packages('')进行安装)

  library(rgdal)
  library(tmap)
  library(raster)
  library(ggplot2)
  library(maptools)
  library(maps)
  library(gstat)
  library(RColorBrewer)

8. 致谢

首先,祝大家元旦快乐!感谢大家的持续关注,小编会继续努力,持续更新下去的!

大家如果觉得有用,还麻烦大家关注点赞,也可以扩散到朋友圈,多谢大家啦~

大家如果在使用本代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~

写在最后


本篇已完成克里金插值R函数的打包,只需要输入
1. 同篇头df相同的数据;
2. 插值边界的shp文件;
3. 设置好插值精度(默认为0.5°)。
即可完成插值,并输出
1. 插值结果的Tiff文件;
2. 插值结果的可视化图件。

使用举例:

setwd('L:\\JianShu\\20200101')
kriging(df,shp,0.5)

是不是瞬间简单多了,需要函数的朋友需要转发朋友圈并集够20个赞哈,然后微信私信我即可获取克里金插值打包函数文件。


小编联系方式

相关文章

网友评论

    本文标题:R-地理基础操作-基于空间点的克里金插值(Krige)文末附Kr

    本文链接:https://www.haomeiwen.com/subject/okzwoctx.html