使用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 3的数据库?

    【问题标题】:A database for python 3?python 3的数据库? 【发布时间】:2023-04-05 10:36:01 【问题描述】: 我正在编写一个供多个用户个人使用的服务器软件。不是数百个,也不是数千个,但一次可能有 3-10 个。 因为它是一个线程服务器,所以 SQLite 不能工作。它抱怨这样的线程: ProgrammingE…

    Python开发 2023年4月5日
    00
  • Python使用django框架实现多人在线匿名聊天的小程序

    下面是详细的攻略: 1. 安装和配置 django 在开始编写聊天应用程序前,需要先安装和配置 django。在命令行中执行以下命令安装 django: pip install django 安装完成后,可以通过以下命令创建一个新的 django 项目: django-admin startproject project_name 其中 project_na…

    python 2023年5月23日
    00
  • Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式

    Python3之乱码无法处理方式 在Python3中,由于编码方式的变化,有时会出现乱码的问题,这给程序的开发和维护带来了一定的困难。本文将详细讲解Python3处理乱码的完整攻略。 什么是乱码 乱码是指由于字符编码方式不一致或编码方式错误等原因,导致文本显示出现乱码的情况。在Python3中,通常会出现如下的乱码表现: UnicodeEncodeError…

    python 2023年5月20日
    00
  • Python根据指定日期计算后n天,前n天是哪一天的方法

    根据指定日期计算后n天、前n天是Python中常用的日期操作之一,下面将给出一份完整的攻略。 步骤1:导入相关的库 在Python中,处理日期相关的操作最常用的库莫过于datetime库。因此在代码中要使用到相关的函数,就需要先导入datetime库。 import datetime 步骤2:定义指定日期 定义指定日期可以采用两种方式。 第一种方式是定义字符…

    python 2023年6月2日
    00
  • Python 3.7新功能之dataclass装饰器详解

    下面是“Python 3.7新功能之dataclass装饰器详解”的完整攻略。 什么是dataclass装饰器? 在Python 3.7中,新增了一个装饰器dataclass,它帮助开发者简化了类的定义和实例化,并且还为开发者提供了一种方便的方式来定义类的属性和默认值。使用dataclass装饰器,开发者可以轻松产生只具有数据属性的类。 下面是如何使用dat…

    python 2023年6月3日
    00
  • 使用Python实现tail的示例代码

    使用Python实现tail命令的功能,就是实时查看文件的末尾几行。下面是实现这个功能的示例代码和攻略。 Step 1:打开文件 首先,我们需要先打开文件,以便后面读取文件内容。在Python中,可以使用open()函数打开文件。这个函数需要指定文件名和打开文件的模式,比如只读模式(’r’)、二进制只读模式(’rb’)等。 with open(‘file.t…

    python 2023年5月19日
    00
  • 在Python中生成具有给定根的Legendre级数

    生成具有给定根的Legendre级数可以使用Python中的SciPy库中的scipy.special模块来完成。下面是生成Legendre级数的完整攻略: 1.导入必要的库 from scipy import special import numpy as np 2.设置输入参数 n = 3 # Legendre级数中的项数 x0 = 0.5 # Lege…

    python-answer 2023年3月25日
    00
  • python执行等待程序直到第二天零点的方法

    要实现在Python程序中等待到明天的零点,可以使用 Python datetime 和 time 模块来计算距离当前时间到第二天零时还有多长时间,然后使用time.sleep()函数来让程序挂起。下面是具体的代码实现步骤: 导入 datetime 和 time 模块: import datetime import time 获取当前时间: now = da…

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