Arcpy / Matlab / Arcgis处理CMIP6数据

2023-10-11 17:30

本文主要是介绍Arcpy / Matlab / Arcgis处理CMIP6数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目前找到了直接使用matlab处理的方法,关键是使用matlab的interp2或griddata函数,正在试验,目前结果还可以,待后续更新

本文主要是对下载的CMIP6数据进行重采样及区域裁剪。
对于CMIP6数据,看它的网格格式是什么样的,如果是gn格式,那就代表该数据不是等间距投影,不能直接用Arcgis的创建NetCDF栅格格式会报错,也不能直接用matlab提取,会存在投影误差(下文我会提到,如果不想看可以直接跳过)。如果是等间距投影可以直接用matlab编程提取(我感觉matlab提取比较方便。。下图是用matlab提取研究范围的思路,但不能用于gn格式的数据提取)
在这里插入图片描述

ncdisp([ncpath,ncname])
lon = ncread([ncpath,ncname],'lon');
lat = ncread([ncpath,ncname],'lat');
time = ncread([ncpath,ncname],'time');
[lat1,~] = find(lat >= 1.9 & lat <= 24.1);
lat_min = min(lat1); lat_max = max(lat1);  % 列的范围
[lon1,~] = find(lon >= 105 & lon <= 121);
lon_min = min(lon1); lon_max = max(lon1);  % 行的范围
start_loc = [lon_min,lat_min,1];
count = [numel(lon1),numel(lat1),numel(time)];
sst_data = ncread([ncpath,ncname],'sst',start_loc,count);
sst_3D = rot90(sst_data);

文章目录

  • gn格式的CMIP6数据存在的问题
  • arcgis处理CMIP6数据
  • arcpy批量处理

处理思路:Arcgis提供了创建NetCDF要素图层(Make NetCDF Feature Layer)的工具,这个工具可以处理gn格式的CMIP6数据。随后再用要素转栅格得到研究区域的数据。
为什么要用Arcpy呢?因为我的CMIP6数据是多时间段的(基本都是多时间),在Arcgis里做很麻烦我想批量化处理。

gn格式的CMIP6数据存在的问题

利用matlab读取下载的nc文件,查看一下这个数据的变量、经纬度等信息

clear all; clc
[ncname,ncpath] = uigetfile('*.*','请选择nc文件');
ncdisp([ncpath,ncname])
lat = ncread([ncpath,ncname],'latitude');
lon = ncread([ncpath,ncname],'longitude');

我下载的数据是SSP126情景下2100年1月1日起逐日全球海表温度数据,空间分辨率为25km(实际有投影误差,可以看到经纬度都是一个二维矩阵)
在这里插入图片描述
打开经纬度矩阵(lat和lon实际需要逆时针旋转90度才是正常的地理分布,但我这里没变所以lat看每列,lon看每行),可以发现,同一纬线下经度变形不大,而同一经线下纬度变化很大。如果我直接提取研究区范围(南海区域),可以看一下下图纬度的变形程度

在这里插入图片描述
可以看到同一经线下纬度已经不是0.25°了,在逐渐缩小,所以这样提取出来的区域要比实际0.25°等间距区域大。

arcgis处理CMIP6数据

我先尝试着用arcgis处理了一下这个数据,Make NetCDF Feature Layer,具体参数设置:
variables只选择我要的变量海温tos
row dimensions选择i和j
dimension value选择time
在这里插入图片描述
随后会出现巨多的点点,每个点代表了该位置的海温,空白区域即无数据。
在这里插入图片描述
这个数据默认显示的是第一天的,可以从该图层属性里修改你想看到的日期(但是感觉日期不对啊我是2100年的数据这里显示2096???,但是经过对比实际上还是从2100年1月1日开始的。研究了一下是因为arcgis不会读取nc文件time的日历calendar,后面arcpy批量操作那里可以看到我对时间time做了操作,times_true会计算出正确的时间)
在这里插入图片描述
随后我要对这个要素图层转栅格,使用Conversion Tools里的Feature to Raster
output cell size设置为0.25(也就是~25km)
注意这里可以直接设置我想要的区域,但是设置的前提是你已经有一个裁剪好的区域栅格数据了。
也就是说,第一次用要素转栅格,先做全区域的转,然后用clip裁剪出你想要的区域,后续再用要素转栅格,你就可以在Environments里Processing Extent设置研究区域,就不用再clip裁剪。
在这里插入图片描述
最后就能得到我研究区域的海温数据了
在这里插入图片描述

arcpy批量处理

其实上面arcgis做那么多都是为了在arcpy里做批量处理打基础,因为acrpy那些函数的参数设置就是我们刚才设置的那些参数
强烈建议使用BY INDEX

import arcpy# Execute NetCDFtoFeatureLayer
arcpy.env.workspace = "F:/0TCLI/30_Years_Daily_SST/CMIP6/ncresample"
inNetCDFFile = "F:/0TCLI/30_Years_Daily_SST/CMIP6/tos_SSP_data/tos_Oday_HadGEM3-GC31-MM_ssp126_r1i1p1f3_gn_21000101-21001230.nc"
inVariables = "tos"
inXVariable = "longitude"
inYVariable = "latitude"
outFeatureLayer = "tos_layer1"
rowDimensions = ["i", "j"]
ZVariable = ""
MVariable = ""
dimensionValues = "time"
valueSelectionMethod = "BY_VALUE"# Execute MakeNetCDFFeatureLayer
arcpy.MakeNetCDFFeatureLayer_md(inNetCDFFile, inVariables, inXVariable,inYVariable, outFeatureLayer, rowDimensions,ZVariable, MVariable, dimensionValues,valueSelectionMethod)# Set local variables
inFeature = outFeatureLayer
outRaster = "F:/0TCLI/30_Years_Daily_SST/CMIP6/ncresample/SCS_tos_1_arcpy.tif"
cellSize = 0.25
field = "tos"
# Set Extent Range: Right Top Left Bottom
arcpy.env.extent = "121.125000 24.137497 104.875000 1.887497"# Execute FeatureToRaster
arcpy.FeatureToRaster_conversion(inFeature, field, outRaster, cellSize)

在这里插入图片描述用arcpy提取的和arcgis逐步操作结果一致

这里只做了一个时间的,其实可以用循环提取所有时间,等后续更新吧

2022-07-19更新:想不到啥好方法直接在python里计算平均值,主要是这个数据属是无语它是gn格式,然后arcpy这些函数生成的栅格图层只能导出不能放在工作空间里当作变量(或者是我不知道栅格变量在哪),所以我只能把每个月的数据给导出然后再在matlab里处理吧。。。。

import arcpy
import netCDF4 as nc# Calculate NetCDF data time
ncfilepath = "E:/2022_Summer/Marine_Environment_Data/CMIP6_data/"
ncfilename = "tos_Omon_GFDL-CM4_ssp585_r1i1p1f1_gn_203501-205412.nc"
ncfileid = ncfilepath + ncfilename
ncfile_obj = nc.Dataset(ncfileid)
time = ncfile_obj.variables['time']
times_true = nc.num2date(time[:], time.units, time.calendar)# Execute NetCDFtoFeatureLayer
for i in range(len(time)):outpath = "E:/2022_Summer/Marine_Environment_Data/CMIP6_data/NOAA_CMIP6_tos/"arcpy.env.workspace = ncfilepathinVariables = "tos"inXVariable = "lon"  # ATTENTION HEREinYVariable = "lat"  # ATTENTION HEREoutFeatureLayer = "tos_layer"rowDimensions = ["x", "y"]  # ATTENTION HEREZVariable = ""MVariable = ""dimensionValues = "time" + " " + str(i)valueSelectionMethod = "BY_INDEX"# Execute MakeNetCDF Feature Layerarcpy.MakeNetCDFFeatureLayer_md(ncfileid, inVariables, inXVariable,inYVariable, outFeatureLayer, rowDimensions,ZVariable, MVariable, dimensionValues,valueSelectionMethod)# Set local variablesinFeature = outFeatureLayerfiletime = times_true[i].strftime('%Y-%m-%d')outRaster = outpath + filetime + ".tif"cellSize = 0.25field = "tos"# Set Extent Rangereftif = r"E:\2022_Summer\Marine_Environment_Data\CMEMS_data\CHL_L4_test.tif"arcpy.env.extent = reftif# Execute FeatureToRasterarcpy.env.pyramid = "NONE"    # No Pyramidarcpy.FeatureToRaster_conversion(inFeature, field, outRaster, cellSize)print("Date: %s  No.%d / Total: %d" % (filetime, i, len(time)))arcpy.Delete_management(outFeatureLayer)

运行的时候可以看到还剩多少数据
在这里插入图片描述

这篇关于Arcpy / Matlab / Arcgis处理CMIP6数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/189687

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则