赞
踩
将NetCDF文件(.nc)转换为栅格(.tif)文件。
NetCDF数据的介绍可以参考:NetCDF数据介绍及python处理
这种数据格式常被用于存储气象科学数据,通常需要对nc文件中某时刻某个变量的数据进行提取,并转换为栅格文件。这可以利用arcgis中的 多维工具->创建 NetCDF 栅格图层->导出数据得到,具体的步骤可以参考:NetCDF数据在ArcMap中的使用,这篇文章关于处理步骤的描述十分详细,后面对于批量化转换nc到栅格也提供了相关代码。
本文章对以下两种nc文件的批处理代码分别进行阐述:
(a)单时间维度,多变量的nc文件
f(lon, lat, time)= variable_1
f(lon, lat, time)= variable_2
f(lon, lat, time)= variable_3
…
f(lon, lat, time)= variable_n
(b)多时间维度,多变量的nc文件
f(lon, lat, time1)= variable_1
f(lon, lat, time2)= variable_1
f(lon, lat, time3)= variable_1
…
在Panoply(一款nc文件查看器)中对变量绘制影像后的窗口如下:
在运行脚本工具前,了解待转换nc文件的变量名,和时间维度大小是必须的。可以在Panoply或者Arcgis中的创建 NetCDF 栅格图层查看。
对于单时间维度nc文件来说,使用该脚本工具前必须手动导入变量名
对于多时间维度来说,使用该脚本工具还必须在代码内修改时间维度的范围
变量名和时间维度的查看方式如下:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 功能:将in_folder文件夹(不含子文件夹)中的所有的.nc4文件中的variable变量导出为以"prefix+原文件名"为新文件名的栅格文件 # 提示:导入脚本前强烈建议将本代码中的所有中文字符删除!!! import os import time import arcpy from arcpy.sa import * in_folder = arcpy.GetParameterAsText(0) # folder of .nc4 files out_folder = arcpy.GetParameterAsText(1) # folder of output tiff files variable = arcpy.GetParameterAsText(2) # target variable name prefix = arcpy.GetParameterAsText(3) # the prefix string of output file's filename # Input data source arcpy.env.workspace = in_folder arcpy.env.overwriteOutput = True # Loop through a list of files in the workspace nc_files = [nc_file for nc_file in os.listdir(in_folder) if nc_file.endswith(".nc4")] nums = len(nc_files) for num, nc_file in enumerate(nc_files): s = time.time() inNCfiles = arcpy.env.workspace + "/" + nc_file fileroot = prefix + nc_file outRaster = out_folder + "/" + fileroot try: # Process1: Make NetCDF Raster Layer arcpy.MakeNetCDFRasterLayer_md(inNCfiles, variable, "lon", "lat", variable, "", "", "BY_VALUE") # Process2: Copy Raster arcpy.CopyRaster_management(variable, outRaster + ".tif", "", "", "", "NONE", "NONE", "") e = time.time() arcpy.AddMessage("{0}/{1} | {2} Completed, time used {3}s".format(num+1, nums, nc_file, e-s)) except: arcpy.AddMessage("{0}/{1} | {2} Errored".format(num+1, nums, nc_file))
这里我把variable属性的过滤器选为值列表,将常用的变量名提前手动录入到里面。如果想提取多个变量,用批处理工具就可以了,参考下图:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 功能:将nc文件(in_nc)中的目标时间维度(times)中的variable变量导出为以"原文件名+时间维度索引"为新文件名的栅格文件 # 提示:导入脚本前强烈建议将本代码中的所有中文字符删除!!! import os import time import arcpy from arcpy.sa import * in_nc = arcpy.GetParameterAsText(0) # input .nc file ("time" variable is multidimensional) out_folder = arcpy.GetParameterAsText(1) # folder of output tiff files variable = arcpy.GetParameterAsText(2) # name of target variable # Input data source in_folder, nc_file = os.path.split(in_nc) arcpy.env.workspace = in_folder arcpy.env.overwriteOutput = True # Loop through a list of times times = range(0, 187) # target time range nums = len(times) for num, t in enumerate(times): s = time.time() inNCfiles = in_nc fileroot = nc_file + "_" + str(num) outRaster = out_folder + "/" + fileroot try: temp = "time {0}".format(t) # Process1: Make NetCDF Raster Layer arcpy.MakeNetCDFRasterLayer_md(inNCfiles, variable, "lon", "lat", variable, "", temp, "BY_INDEX") # Process2: Copy Raster arcpy.CopyRaster_management(variable, outRaster + ".tif", "", "", "", "NONE", "NONE", "") e = time.time() arcpy.AddMessage("{0}/{1} | {2} Completed, time used {3}s".format(num+1, nums, t, e-s)) except: arcpy.AddMessage("{0}/{1} | {2} Errored".format(num+1, nums, t))
关于此脚本属性的设置:
对于此脚本如果要修改时间维度范围需要在代码内部进行修改,可参考下图:
脚本工具运行截图如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。