• Matlab求取geotiff不同排放国家均值、总量


    一、Matlab区域统计

    1、求取0.5°栅格面积(R语言)

    这个求取全球0.5°栅格像元面积matlab可能也可以计算,但是比较麻烦,R语言有自带的包可以计算,输出成geotiff

    library(maptools)
    library(raster)
    library(marmap)


    s <- raster(nrow=360, ncol=720) extent(s) <-c(-180,180,-90,90) crs(s) <- CRS("+proj=longlat +datum=WGS84") AREA=area(s)*1e6 # km to m2

    writeRaster(AREA,paste('F:/Dataset/GC/area/AREA_0dot5.tif',sep=""),options=c('TFW=YES'), overwrite=TRUE)

    2.读取geotiff图像、计算全球排放的budget(from kg N ha-1 yr-1 to Tg N yr-1

    R=georasterref('RasterSize',[360 720],'RasterInterpretation','cells',...
       'Latlim',[-90 90],'Lonlim',[-180 180],'ColumnsStartFrom','north');
    
    Area=imread('F:/Dataset/GC/area/AREA_0dot5.tif');
    
    %%这个是全球不同国家栅格图,1-204
    str_WORLD='F:\Dataset\shp\worldtif\world_0dot5.tif';   
    WORLD=double(imread(str_WORLD));
    WORLD(WORLD>=255)=nan;
    mmCoun=max(max(WORLD))
    
    %%  crop NH3 emi,from 0.083 deg to 0.5 deg
    CropNH3=imread(['F:\program\R\Ndep_Yield\data\raster\' 'CropNH3emi' num2str(2010) '.tif']);
    CropNH3(isnan(CropNH3)|CropNH3<0)=0;
    CropNH3=imresize(CropNH3,[360 720],'bilinear');
    CropNH3(isnan(CropNH3)|CropNH3<0)=0;
    geotiffwrite(['F:/program/R/Farmsize/data/' 'CropNH3emi' num2str(2010) '.tif'],CropNH3,R); 
    
    %%  calc buget
    CropNH3_bug=CropNH3.*Area*1e-7;
    sum(sum(CropNH3_bug))
    geotiffwrite(['F:/program/R/Farmsize/data/' 'CropNH3emi' num2str(2010) 'bug.tif'],CropNH3_bug,R); 
    
    %% summary by different country,矩阵思维
    WORLD2=WORLD;
    for ii=0:mmCoun
    if(sum(sum(WORLD==ii))>0)
    WORLD2(WORLD==ii)=nansum(CropNH3_bug(WORLD==ii));
    end
    end
    geotiffwrite(strcat('F:/program/R/Farmsize/data/','CropNH3emi',num2str(2010),'bug_country.tif'),(WORLD2),R);

    二、使用R语言也可实现区域、国家统计

    library(plyr)
    library(rgeos)
    library(rgdal)
    library(raster)
    library(rasterVis)
    library(csvread)
    library(viridis)
    library(scales)
    library(spatialEco)
    library(Rcpp)
    library(fasterize)
    library(sf)
    
    #############   stat  ratio NHx/NOy
    shp_world=readOGR('K:/Dataset/shp/wordmap.shp')
    shp_world_df=as.data.frame(shp_world,xy=TRUE)
    bug_NH3=raster(paste('data/ratioNHx2NOy',2010,'.tif',sep="")) 
    
    #summary by country to csv
    sum_bug_NH3=zonal.stats(shp_world, bug_NH3, stats="mean")##sum
    colnames(sum_bug_NH3)="sum_bug_NH3"
    shp_world_df2=cbind(shp_world_df,sum_bug_NH3)
    write.csv(shp_world_df2,paste("data/raster/sum_ratioNHx2NOy",2010,".csv",sep=""))
    
    #summary by country to tif
    shp_world@data$sum_bug_NH3=sum_bug_NH3$sum_bug_NH3 ###should be double
    ext <- extent(-180,180,-90,90)
    r <- raster(ext, res=0.083333333) 
    
    shp_world2=st_as_sf(shp_world) #change to sf
    r <- fasterize(shp_world2, r, field="sum_bug_NH3")
    writeRaster(r,paste('data/raster/',"ratioNHx2NOy",2010,'_country.tif',sep=""),
                options=c('TFW=YES'), overwrite=TRUE)

    注意zonal.stats不够精确(速度很快),与Arcgis统计结果差别大,R语言的优势是统计分析(csv数据分析、统计函数分析等等),对空间栅格数据分析不够精确

    extract与arcgis、matlab的方法计算结果基本一致,但是速度较慢,本方法也可使用(如对速度要求不高)

    bug_NH3=raster(paste('F:/program/R/Ndep_sat/data/yr/Buget_NHx',yr,'.tif',sep="")) 
      #summary by country to csv
      sum_bug_NH3=extract(bug_NH3,shp_world, fun=sum)
      colnames(sum_bug_NH3)="sum_bug_NH3"
      shp_world_df2=cbind(shp_world_df,sum_bug_NH3)
      write.csv(shp_world_df2,paste("F:/program/R/Ndep_sat/data/yr/sum_bug_NHx",yr,".csv",sep=""))

    三、用Arcpy区域统计,然后用Matlab或者R对dbf文件进项合并,分析等操作,强烈推荐!计算结果准确

    import sys, string, os, arcgisscripting
    gp = arcgisscripting.create()
    gp.CheckOutExtension("spatial")
    gp.AddToolbox(r"C:\Program Files (x86)\ArcGIS\Desktop10.2\ArcToolbox\Toolboxes\Spatial Analyst Tools.tbx")
    gp.overwriteOutput=1
    import arcpy
    from arcpy.sa import *
    from arcpy import env as myEnv

    # Set environment settings
    myEnv.workspace = r"F:/program/R/Ndep_sat/data"


    inZoneData = r"F:/Dataset/shp/wordmap.shp"
    zoneField = "NAME"


    inValueRaster = r"F:/program/R/Ndep_sat/data/yr/Buget_NHx2010.tif"
    outTable=str(r"F:/program/R/Ndep_sat/data/yr"+"/" + "sum_bug_NHx_2010.dbf")
    outZSaT = ZonalStatisticsAsTable(inZoneData, zoneField, inValueRaster, outTable, "NODATA", "SUM")

    outZSaT = ZonalStatistics(inZoneData, zoneField, inValueRaster, "SUM","NODATA",)
    outZSaT.save(r"F:/program/R/Ndep_sat/data/yr"+"/" + "sum_bug_NHx_2010v2.tif")

  • 相关阅读:
    Python注释
    RSA算法知识
    Ubuntu 14.04安装QQ2012
    学习Linux的好网站
    Linux编程学习笔记 -- Process
    Python urllib2 模块学习笔记
    Django Tutorial 学习笔记
    Java学习笔记:语言基础
    Python中的正则表达式
    读书笔记:黑客与画家
  • 原文地址:https://www.cnblogs.com/rockman/p/16367887.html
Copyright © 2020-2023  润新知