当前位置:   article > 正文

【ArcGIS自定义脚本工具】批量NetCDF文件至tif文件(以GLDAS和GRACE为例)_arcgis批量将netcdf转点数据

arcgis批量将netcdf转点数据


系列文章目录: 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
在这里插入图片描述
(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文件来说,使用该脚本工具前必须手动导入变量名
对于多时间维度来说,使用该脚本工具还必须在代码内修改时间维度的范围
变量名和时间维度的查看方式如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


三、批量转换单时间维度多变量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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

关于此脚本属性的设置:


这里我把variable属性的过滤器选为值列表,将常用的变量名提前手动录入到里面。如果想提取多个变量,用批处理工具就可以了,参考下图:

在这里插入图片描述

四、批量转换多时间维度多变量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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

关于此脚本属性的设置:
在这里插入图片描述
对于此脚本如果要修改时间维度范围需要在代码内部进行修改,可参考下图:
在这里插入图片描述
脚本工具运行截图如下:
在这里插入图片描述


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/310589
推荐阅读
相关标签
  

闽ICP备14008679号