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

使用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程序向元组添加元素的方法攻略: 1. 概述 在 Python 中,元组是一种不可变序列,即元组一旦被创建就不能更改它的内容。这表明在原有的元组上新增元素是不允许的,但是可以通过创建一个新元组,并在其中包含既有的元组和新元素来完成这一操作。 2. 如何向元组添加元素 2.1 通过 + 运算符 一种向元组添加元素的方式是…

    python-answer 2023年3月25日
    00
  • python+splinter自动刷新抢票功能

    Python+Splinter是一种快速而轻松实现自动化测试的解决方案,通过它我们可以实现一些有趣的应用。其中之一便是实现抢票功能。下面是这个功能的完整攻略: 1. 安装所需要的软件 为了实现Python+Splinter抢票功能,我们需要以下软件: Python编程语言 Chrome浏览器 Chromedriver驱动 Splinter包 安装这些软件的详…

    python 2023年5月19日
    00
  • 一篇文章搞懂Python程序流程控制结构

    一篇文章搞懂Python程序流程控制结构 在Python中,程序流程控制结构是非常重要的一环,它可以让我们灵活地控制程序的流程,从而实现我们想要的功能。本文将为大家讲解Python程序流程控制结构的完整攻略,帮助大家掌握这一重要知识点。 1. if语句 if语句是Python中最基本、也是最常用的流程控制结构之一。它可以根据条件来控制程序的执行流程。 以下是…

    python 2023年5月30日
    00
  • 解决python中无法自动补全代码的问题

    为解决在Python中无法自动补全代码的问题,需要进行以下步骤: 1. 安装jedi库 Jedi是一个用于Python的自动补全库,安装jedi可以提供Python代码自动补全的功能。可以使用pip命令安装jedi: pip install jedi 2. 配置编辑器 配置编辑器以正确使用jedi库,不同的编辑器设置方法可能有所不同。 VS Code: 在V…

    python 2023年5月19日
    00
  • 使用python在csv中更改分隔符

    【问题标题】:Delimiter change in csv using python使用python在csv中更改分隔符 【发布时间】:2023-04-03 12:35:02 【问题描述】: 我有一个大约 30000 行的 .csv 文件。实现的默认分隔符是分号。我用 python 创建了一个小脚本,它将分隔符转换为逗号并将其保存在同一个文件中。该脚本运行…

    Python开发 2023年4月8日
    00
  • 简单了解python元组tuple相关原理

    让我们来详细讲解一下“简单了解Python元组(tuple)相关原理”的完整攻略。 什么是元组(tuple) 元组(tuple)是Python中的一种序列类型,可以理解为是不可变的列表,其元素按照顺序排列。元组内的元素可以是任意数据类型,包括数字、字符串、列表、元组等等。元组一旦被创建,就不能再进行修改。 元组的创建 我们可以使用圆括号()创建一个元组,元素…

    python 2023年5月14日
    00
  • python按综合、销量排序抓取100页的淘宝商品列表信息

    Python按综合、销量排序抓取100页的淘宝商品列表信息 在本攻略中,我们将介绍如何使用Python按综合、销量排序抓取100页的淘宝商品列表信息,并提供一些示例。 步骤1:准备URL 在抓取淘宝商品列表信息之前,我们需要准备URL。我们可以使用requests库构造URL,也可以使用Selenium库模拟用户操作。 以下是一个示例,用于构造URL: im…

    python 2023年5月15日
    00
  • python的setattr函数实例用法

    如何使用 Python 的 setattr 函数动态设置对象属性呢?下面是一个完整攻略,从基础概念到实例用法,再到应用场景,一步步深入介绍。 概述 在 Python 中,你可以通过类来创建对象。在创建对象时,通常会将属性设置为固定的值,并在后续的使用中不再修改。但有时候,可能需要动态地修改对象的属性值,这时就需要使用 setattr 函数了。 setattr…

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