首页 > 其他分享 >NetCDF 文件批量转栅格并导出栅格各波段

NetCDF 文件批量转栅格并导出栅格各波段

时间:2024-08-12 12:51:42浏览次数:13  
标签:dimension 栅格 NetCDF file tif 文件批量 arcpy folder

两年前,我曾发布过一篇名为《导出 NetCDF 栅格图层的各个波段》的公众号推文,讲述了通过网络中的ArcGIS工具将单个 NetCDF 文件的各个波段分别导出为 tif 文件的方法。该工具提供了 arcpy 源代码,我们以该代码为基础,将其转换为 ArcGIS Pro 环境下的 Python 3 代码,并使程序可对多个文件进行批处理,本文将对该代码及其在 ArcGIS Pro 中的配置过程进行介绍。

1 数据来源及介绍

本文所使用的数据为国家青藏高原科学数据中心的 中国1km分辨率逐月降水量数据集。对下载得到的 nc 文件通过 Panoply 软件进行读取可知,其X、Y及波段维度名称分别为lon、lat、time,nc文件中共12个波段,分别存储该年度1-12月每个月份的降水量。

image

2 脚本配置及相关代码

2.1 NetCDF 转换为 tif

在 ArcGIS Pro 地图工程的默认工具箱中新建脚本工具,命名为 NetCDF to TIF,并仿照 ArcGIS 的 创建 NetCDF 栅格图层 工具设置其参数。该工具用于读取文件夹中的所有 NetCDF 文件,根据其 X、Y、波段等维度将其转换为 TIF 文件并逐一输出至 TIF 文件夹中。由于单波段 NetCDF 文件不存在波段维度,故该参数设置为可选类型。

image

image

右键单击脚本工具,在弹出菜单中单击编辑,将编辑窗口中的默认代码替换为下方 Python 代码:

import os
import arcpy

# 脚本工具核心代码
def script_tool(nc_folder, variable, x_dimension, y_dimension, band_dimension, tif_folder):
    # 基于工作空间为 tif_folder,后续输出文件都将存放在该文件夹中
    arcpy.env.workspace = tif_folder
    # 遍历文件夹中所有后缀名为 .nc 的文件,将其逐一转换为 tif 文件
    for file in os.listdir(nc_folder):
        if file[-3:] == ".nc":
            # 以原始文件名称为基础,得到不包含后缀名部分的 tif 文件名
            tif_file_name = file[:-3]
            # 判断 band_dimension 参数是否存在输入值,有值则在后续函数中指定 band_dimension 参数
            if band_dimension:
                # 基于 NetCDF 文件创建栅格图层
                arcpy.MakeNetCDFRasterLayer_md(f"{nc_folder}/{file}", variable, x_dimension, y_dimension, tif_file_name, band_dimension)
            else:
                arcpy.MakeNetCDFRasterLayer_md(f"{nc_folder}/{file}", variable, x_dimension, y_dimension, tif_file_name)
            # 基于栅格图层创建 tif 文件
            arcpy.CopyRaster_management(tif_file_name, tif_file_name + ".tif")
            arcpy.AddMessage(tif_file_name + " " + "conversion successful!")
    return

# 读取输入参数,执行程序
if __name__ == "__main__":
    # 获取 ArcGIS 脚本工具参数
    nc_folder = arcpy.GetParameterAsText(0)
    variable = arcpy.GetParameterAsText(1)
    x_dimension = arcpy.GetParameterAsText(2)
    y_dimension = arcpy.GetParameterAsText(3)
    band_dimension = arcpy.GetParameterAsText(4)
    tif_folder = arcpy.GetParameterAsText(5)
    # 执行脚本工具核心代码
    script_tool(nc_folder, variable, x_dimension, y_dimension, band_dimension, tif_folder)

保存后可在右键菜单的工具属性中看到下方界面:

image

配置完成后,将 Panoply 读取到的参数输入脚本,如下图所示:

image

程序运行完成后输出的栅格数据如下图所示:

image

2.2 遍历并导出栅格各波段

新建脚本工具,命名为 Band Split,并设置参数。

image

image

将脚本工具的默认代码替换为下方 Python 代码:

import os
import arcpy

def script_tool(input_folder, output_folder):
    # 遍历文件夹中所有 tif 文件
    for file in os.listdir(input_folder):
        if file[-4:] == ".tif":
            # 根据文件名称获取对应年份,此处为倒数第5位至倒数第8位,可根据实际情况调整
            year = file[-8:-4]
            # 创建循环,遍历各月份对应波段,将波段逐一导出为单独的 tif 文件并保存到输出文件夹
            for i in range(12):
                input_band = f"{input_folder}/{file}/Band_{i+1}"
                output_raster = f"{output_folder}/Pre_{year}_{i + 1}.tif"
                arcpy.CopyRaster_management(input_band, output_raster)
                arcpy.AddMessage(f"Pre_{year}_{i+1} conversion successful!")
    return

if __name__ == "__main__":
    # 获取 ArcGIS 脚本工具参数
    input_folder = arcpy.GetParameterAsText(0)
    output_folder = arcpy.GetParameterAsText(1)
    # 执行脚本工具核心代码
    script_tool(input_folder, output_folder)

配置完成后,将上一步得到的 tif 文件夹作为输入文件夹参数输入脚本,如下图所示:

image

程序运行完成后输出的栅格数据如下图所示:

image

标签:dimension,栅格,NetCDF,file,tif,文件批量,arcpy,folder
From: https://www.cnblogs.com/qsgeo/p/18354723

相关文章

  • GeoServer+Postgis发布存储在Postgis中的栅格数据(二)--pgraster插件使用
    这一篇是前面一篇的续集,前一篇链接GeoServer+Postgis发布存储在Postgis中的栅格数据前期准备pgraster插件下载:还是提供一个maven地址,直接搜索pgraster即可,版本的话因为插件是gs-开头选择和GeoServer版本一致即可,前一篇使用的GeoServer版本为2.19.6,所以这里也选择2.19.6即......
  • 【智能算法应用】A*和改进A*求解大规模栅格地图路径规划问题
    目录1.算法原理2.二值图像构建大规模栅格地图3.结果展示4.代码获取1.算法原理精准导航:用A*算法优化栅格地图的路径规划【附Matlab代码】改进A*算法通过删除必要的拐点或简化路径来减少路径长度,使得路径更为直观和高效。2.二值图像构建大规模栅格地图给定一幅二......
  • 【MATLAB源码-第159期】基于matlab的胡桃夹子优化算法(NOA)机器人栅格路径规划,输出做短
    操作环境:MATLAB2022a1、算法描述胡桃夹子优化算法(NutcrackerOptimizationAlgorithm,NOA)是一个灵感来源于胡桃夹子的故事的元启发式优化算法。这个故事中,胡桃夹子是一个能够将坚果壳轻易地破开以获取内部果仁的工具。在优化算法的语境下,这个过程被比喻为寻找问题解决方案......
  • 如何重构这个netCDF?
    更新:我将文件上传到dropbox,可以通过此链接下载(我希望这有效,我不经常使用dropbox):https://www.dropbox.com/scl/fi/vd0s9g080m8h9fxh7rn9l/IASISND02_20240702161759Z_20240702175655Z_epct_d9f95b34_F.nc?rlkey=isrwelpr9abbqswr91unrhpkp&st=6hkb5u2l&dl=0我已经......
  • 栅格地图
    在ROS中,地图是非常基本的元素,特别对于2D激光SLAM而言,栅格地图可以说是必不可少的元素。机器人在需要前往目标点时,需要在栅格地图中找到一条合适的路径从当前点到达目标点,这部分内容在move_base中有了详细的接口,可以直接调用并返回路径。但是作为一名工程师,不仅要知其然更要知其所......
  • netCDF 多边形是固定大小的光栅图像
    我正在尝试从netCDF文件转换数据;数据包含多边形和甲烷浓度值。frommatplotlib.patchesimportPolygonimportcartopy.crsasccrsimportcartopy.featureascfeature#%%Plottingthepolygonsfig,ax=plt.subplots(figsize=(10,10),subplot_kw={'projection':c......
  • 【智能算法应用】人工兔优化算法求解二维栅格路径规划问题
    目录1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取1.算法原理【智能算法】人工兔优化算法(ARO)原理及实现2.二维路径规划数学模型栅格法模型最早由W.E.Howden于1968年提出,障碍物的栅格用黑色表示,可通过的自由栅格用白色表示。求解二维路......
  • 文件批量转UTF8
    源代码:https://github.com/qianqiu10000/toUTF8.git使用QtCreator开发时经常会碰到乱码的头文件,这个小工具可以将.h/.cpp文件批量转成UTF8格式。使用时将exe文件复制到要转换的文件目录,会在该目录下生成一个UTF8文件夹,转换后的文件都在这里。上一版测试后有点问题,现在增加......
  • 9.7 栅格图层符号化轮廓渲染
    文章目录前言轮廓QGis设置为轮廓二次开发代码实现轮廓总结前言介绍栅格图层数据渲染之轮廓渲染说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps轮廓以“3420C_2010_327_RGB_LATLNG.tif”数据为例,在QGis中加载默认显示为多波段彩色如下图QGis设置为轮廓在......
  • ArcTs布局入门05——栅格布局(GridRow/GridCol)
    如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧扫描下面的二维码关注公众号。1、概述栅格布局是一种通用的辅助定位工具,对移动设备的界面设计有较好的借鉴作用。主要优势包括:提供可循的规律:栅格布局可以为布局提供规律性的结构,解决多尺寸多设备的动态布局问题。通过将......