美文网首页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