使用python进行nc转tif的3种情况解决

yizhihongxing

使用Python进行nc转tif的3种情况解决

本文将提供使用Python对nc文件进行tif格式转换的方法,分为以下3种情况:

  1. 转换单个nc文件
  2. 批量转换nc文件夹下所有文件
  3. 批量转换nc多级子文件夹下所有文件

在进行操作之前,请确保您的Python环境配置正确,并且已经安装了相关的库。

1.转换单个nc文件

这是最简单的情况,只需要用Python编写一个脚本来实现即可。代码如下:

from netCDF4 import Dataset
from osgeo import gdal

def nc2tif(nc_file, tif_file):
    dataset = Dataset(nc_file)
    var = dataset.variables[‘var_name’] # var_name是您要转换的变量名

    x = dataset.variables[‘longitude’][:]
    y = dataset.variables[‘latitude’][:]
    data = var[:]
    # 将地理经纬度转为投影坐标
    projection = gdal.osr.SpatialReference()
    projection.SetWellKnownGeogCS("WGS84")
    projection.SetUTM(30, True)
    projection.SetFalseEasting(500000)
    projection.SetFalseNorthing(10000000)
    projection.SetCentralMeridian(113)
    projection.SetScaleFactor(0.9996)

    # 定义栅格数据
    driver = gdal.GetDriverByName('GTiff')
    dst_ds = driver.Create(tif_file, len(x), len(y), 1, gdal.GDT_Float32)
    dst_ds.SetProjection(projection.ExportToWkt())
    dst_ds.SetGeoTransform((x[0], (x[1]-x[0]), 0, y[0], 0, (y[0]-y[1])))

    # 将数据写入栅格
    dst_ds.GetRasterBand(1).WriteArray(data)
    dst_ds = None

    print(nc_file, 'to', tif_file, 'success!')

if __name__ == '__main__':
    nc_file = 'path/to/nc_file'
    tif_file = 'path/to/tif_file'
    nc2tif(nc_file, tif_file)

2.批量转换nc文件夹下所有文件

有了第一步的实践,我们现在可以轻松地处理许多的nc文件,这里我们需要编写一个循环来完成。代码如下:

import os
from netCDF4 import Dataset
from osgeo import gdal

def nc2tif(nc_file, tif_file):
        dataset = Dataset(nc_file, 'r')
        var = dataset.variables[‘var_name’]  # var_name是您要转换的变量名。

        x = dataset.variables[‘longitude’][:]
        y = dataset.variables[‘latitude’][:]
        data = var[:]
        # 将地理经纬度转为投影坐标
        projection = gdal.osr.SpatialReference()
        projection.SetWellKnownGeogCS("WGS84")
        projection.SetUTM(30, True)
        projection.SetFalseEasting(500000)
        projection.SetFalseNorthing(10000000)
        projection.SetCentralMeridian(113)
        projection.SetScaleFactor(0.9996)

        # 定义栅格数据
        driver = gdal.GetDriverByName('GTiff')
        dst_ds = driver.Create(tif_file, len(x), len(y), 1, gdal.GDT_Float32)
        dst_ds.SetProjection(projection.ExportToWkt())
        dst_ds.SetGeoTransform((x[0], (x[1]-x[0]), 0, y[0], 0, (y[0]-y[1])))

        # 将数据写入栅格
        dst_ds.GetRasterBand(1).WriteArray(data)
        dst_ds = None
        print(nc_file, 'to', tif_file, '成功!')

if __name__ == '__main__':
    input_folder = 'path/to/nc/folder'
    output_folder = 'path/to/tif/folder'
    for filename in os.listdir(input_folder):
        if filename.endswith('.nc'):
            nc_file = os.path.join(input_folder, filename)
            tif_file = os.path.join(output_folder, filename.replace('.nc', '.tif'))
            nc2tif(nc_file, tif_file)

3.批量转换nc多级子文件夹下所有文件

针对这个情况,我们需要递归遍历每个子文件夹,并对其中的nc文件进行转换。代码如下:

import os
from netCDF4 import Dataset
from osgeo import gdal

def nc2tif(nc_file, tif_file):
    dataset = Dataset(nc_file, 'r')
    var = dataset.variables[‘var_name’]  # var_name是您要转换的变量名。

    x = dataset.variables[‘longitude’][:]
    y = dataset.variables[‘latitude’][:]
    data = var[:]
    # 将地理经纬度转为投影坐标
    projection = gdal.osr.SpatialReference()
    projection.SetWellKnownGeogCS("WGS84")
    projection.SetUTM(30, True)
    projection.SetFalseEasting(500000)
    projection.SetFalseNorthing(10000000)
    projection.SetCentralMeridian(113)
    projection.SetScaleFactor(0.9996)

    # 定义栅格数据
    driver = gdal.GetDriverByName('GTiff')
    dst_ds = driver.Create(tif_file, len(x), len(y), 1, gdal.GDT_Float32)
    dst_ds.SetProjection(projection.ExportToWkt())
    dst_ds.SetGeoTransform((x[0], (x[1]-x[0]), 0, y[0], 0, (y[0]-y[1])))

    # 将数据写入栅格
    dst_ds.GetRasterBand(1).WriteArray(data)
    dst_ds = None
    print(nc_file, 'to', tif_file, 'success!')

def nc_folder2tif_folder(input_folder, output_folder):
    for root, dirs, files in os.walk(input_folder):
        for filename in files:
            if filename.endswith('.nc'):
                nc_file = os.path.join(root, filename)
                tif_file = os.path.join(output_folder, os.path.relpath(nc_file, input_folder).replace('.nc', '.tif'))
                os.makedirs(os.path.dirname(tif_file), exist_ok=True)
                nc2tif(nc_file, tif_file)

if __name__ == '__main__':
    input_folder = 'path/to/nc/folder'
    output_folder = 'path/to/tif/folder'
    nc_folder2tif_folder(input_folder, output_folder)

以上就是使用Python进行nc转tif的3种情况解决的完整攻略。下面给出两个使用示例。

示例一:使用第二种方法,将文件夹内所有的nc文件转换成tif

import os
from netCDF4 import Dataset
from osgeo import gdal

def nc2tif(nc_file, tif_file):
        dataset = Dataset(nc_file, 'r')
        var = dataset.variables[‘var_name’]  # var_name是您要转换的变量名。

        x = dataset.variables[‘longitude’][:]
        y = dataset.variables[‘latitude’][:]
        data = var[:]
        # 将地理经纬度转为投影坐标
        projection = gdal.osr.SpatialReference()
        projection.SetWellKnownGeogCS("WGS84")
        projection.SetUTM(30, True)
        projection.SetFalseEasting(500000)
        projection.SetFalseNorthing(10000000)
        projection.SetCentralMeridian(113)
        projection.SetScaleFactor(0.9996)

        # 定义栅格数据
        driver = gdal.GetDriverByName('GTiff')
        dst_ds = driver.Create(tif_file, len(x), len(y), 1, gdal.GDT_Float32)
        dst_ds.SetProjection(projection.ExportToWkt())
        dst_ds.SetGeoTransform((x[0], (x[1]-x[0]), 0, y[0], 0, (y[0]-y[1])))

        # 将数据写入栅格
        dst_ds.GetRasterBand(1).WriteArray(data)
        dst_ds = None
        print(nc_file, 'to', tif_file, '成功!')

if __name__ == '__main__':
    input_folder = 'path/to/nc/folder'
    output_folder = 'path/to/tif/folder'
    for filename in os.listdir(input_folder):
        if filename.endswith('.nc'):
            nc_file = os.path.join(input_folder, filename)
            tif_file = os.path.join(output_folder, filename.replace('.nc', '.tif'))
            nc2tif(nc_file, tif_file)

示例二:使用第三种方法,将多级子文件夹下的所有nc文件转换成tif

import os
from netCDF4 import Dataset
from osgeo import gdal

def nc2tif(nc_file, tif_file):
    dataset = Dataset(nc_file, 'r')
    var = dataset.variables[‘var_name’]  # var_name是您要转换的变量名。

    x = dataset.variables[‘longitude’][:]
    y = dataset.variables[‘latitude’][:]
    data = var[:]
    # 将地理经纬度转为投影坐标
    projection = gdal.osr.SpatialReference()
    projection.SetWellKnownGeogCS("WGS84")
    projection.SetUTM(30, True)
    projection.SetFalseEasting(500000)
    projection.SetFalseNorthing(10000000)
    projection.SetCentralMeridian(113)
    projection.SetScaleFactor(0.9996)

    # 定义栅格数据
    driver = gdal.GetDriverByName('GTiff')
    dst_ds = driver.Create(tif_file, len(x), len(y), 1, gdal.GDT_Float32)
    dst_ds.SetProjection(projection.ExportToWkt())
    dst_ds.SetGeoTransform((x[0], (x[1]-x[0]), 0, y[0], 0, (y[0]-y[1])))

    # 将数据写入栅格
    dst_ds.GetRasterBand(1).WriteArray(data)
    dst_ds = None
    print(nc_file, 'to', tif_file, 'success!')

def nc_folder2tif_folder(input_folder, output_folder):
    for root, dirs, files in os.walk(input_folder):
        for filename in files:
            if filename.endswith('.nc'):
                nc_file = os.path.join(root, filename)
                tif_file = os.path.join(output_folder, os.path.relpath(nc_file, input_folder).replace('.nc', '.tif'))
                os.makedirs(os.path.dirname(tif_file), exist_ok=True)
                nc2tif(nc_file, tif_file)

if __name__ == '__main__':
    input_folder = 'path/to/nc/folder'
    output_folder = 'path/to/tif/folder'
    nc_folder2tif_folder(input_folder, output_folder)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用python进行nc转tif的3种情况解决 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • python 显示数组全部元素的方法

    当我们想要显示 Python 中的数组全部元素时,通常使用如下两种方法: 方法一:使用 for 循环 arr = [1, 2, 3, 4, 5] for i in arr: print(i, end=" ") 上面的代码中,我们将 arr 列表中的全部元素一个一个取出,然后使用 print() 函数将它们打印出来。这里注意,我们使用 en…

    python 2023年6月5日
    00
  • Python3.6笔记之将程序运行结果输出到文件的方法

    下面是详细讲解“Python3.6笔记之将程序运行结果输出到文件的方法”的完整攻略: 1.方法介绍 在Python中,我们可以使用open()方法将运行结果输出到文件中,open()方法会返回一个文件对象,该对象拥有写入、读取和关闭文件等功能。我们可以使用该对象的write()方法输入结果到文件中。 2.方法使用 下面是使用Python输出运行结果到文件的基…

    python 2023年6月5日
    00
  • 执行Django数据迁移时报 1091错误及解决方法

    一、背景介绍 在进行Django项目开发时,经常会使用到数据迁移(migration)功能,它能够方便地将模型中的数据结构更改同步到数据库。但有时在进行数据迁移时,会遇到错误反馈,比如报1091错误。本文将详细讲解这种错误的原因和解决方法。 二、错误原因 1091错误的报错信息为: django.db.utils.OperationalError: (109…

    python 2023年5月13日
    00
  • python深度学习人工智能BackPropagation链式法则

    Python深度学习人工智能BackPropagation链式法则 BackPropagation(反向传播)是深度学习中最常用的优化算法之一,它主要作用是通过代的方式,不断调整神经网络的权重和偏置,使得神经网络的损失函数最小化。本文将详细讲解BackPropagation的原理及Python实现,以及两个示例说明。 BackPropagation原理 Ba…

    python 2023年5月14日
    00
  • Python 正则表达式操作指南

    Python正则表达式操作指南 正则表达式是一种强大的文本处理工具,可以用于各种文本处理任务,如数据清洗、文本分析、信息提取等。在Python中,可以使用re模块来操作正则表达式。本攻略详细讲解Python正则表达式的基本语法、常用函数和应技巧,帮助读者快速掌握正则达的用法。 正则表达式的基本语法 正则表达式是由普通字符和元字符组成的字符串,用于配文本中的模…

    python 2023年5月14日
    00
  • python调用pyaudio使用麦克风录制wav声音文件的教程

    这里是关于“python调用pyaudio使用麦克风录制wav声音文件的教程”的完整攻略,按照以下步骤进行操作: 安装pyaudio 使用以下命令在linux或macOS上安装pyaudio: pip install pyaudio 如果在Windows上安装时遇到错误提示,可以手动下载对应版本的pyaudio的whl文件进行安装。这里可以下载到对应的whl…

    python 2023年6月2日
    00
  • 使用python解析json字段的3种方式实例

    下面我将为你详细讲解“使用python解析json字段的3种方式实例”的完整攻略。 1. 什么是JSON? JSON(JavaScript Object Notation,JavaScript对象表示法) 是一种轻量级的数据交换格式。它是基于JavaScript的语法来描述数据的,因此可以被各种不同的编程语言所支持。 JSON将数据表示为键值对的形式,键必须…

    python 2023年6月3日
    00
  • Python 25行代码实现的RSA算法详解

    Python25行代码实现的RSA算法详解 RSA算法是一种常见的非对称加密算法,它可以用于保护数据的安全性。在本文中,我们将讲RSA算法的原理Python实现以及两个示例说明。 RSA算法原理 RSA算法是一种非对称加密算法,它的核心思想是使用两个密钥:公钥和私钥。公钥可以公开,任何人都可以使用它来加密数据;私钥只有拥有者才能使用,于解密数据。 具体来说,…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部