【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)

文章目录

  • 一、功能介绍
  • 二、获取变量名和时间维度
  • 三、批量转换单时间维度多变量nc文件为tif文件
  • 四、批量转换多时间维度多变量nc文件为tif文件

系列文章目录: ArcGIS自定义脚本编程


一、功能介绍

将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
【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第1张图片
(b)多时间维度,多变量的nc文件
f(lon, lat, time1)= variable_1
f(lon, lat, time2)= variable_1
f(lon, lat, time3)= variable_1

【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第2张图片
在Panoply(一款nc文件查看器)中对变量绘制影像后的窗口如下:
【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第3张图片


二、获取变量名和时间维度

在运行脚本工具前,了解待转换nc文件的变量名,和时间维度大小是必须的。可以在Panoply或者Arcgis中的创建 NetCDF 栅格图层查看。
对于单时间维度nc文件来说,使用该脚本工具前必须手动导入变量名
对于多时间维度来说,使用该脚本工具还必须在代码内修改时间维度的范围
变量名和时间维度的查看方式如下:
【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第4张图片
【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第5张图片
【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第6张图片


三、批量转换单时间维度多变量nc文件为tif文件

#!/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))

关于此脚本属性的设置:

【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第7张图片
这里我把variable属性的过滤器选为值列表,将常用的变量名提前手动录入到里面。如果想提取多个变量,用批处理工具就可以了,参考下图:

【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第8张图片

四、批量转换多时间维度多变量nc文件为tif文件

#!/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))

关于此脚本属性的设置:
【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第9张图片
对于此脚本如果要修改时间维度范围需要在代码内部进行修改,可参考下图:
【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第10张图片
脚本工具运行截图如下:
【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_第11张图片


你可能感兴趣的:(ArcGIS自定义脚本编程,python,Arcgis自定义脚本,nc文件,NetCDF批量转换)