将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))
关于此脚本属性的设置:
对于此脚本如果要修改时间维度范围需要在代码内部进行修改,可参考下图:
脚本工具运行截图如下: