python将nc文件转成tif

DataAssassin

全网同号,数据免费获取请关注公众号「DataAssassin」,如有问题请添加公众号联系作者。感谢您的关注。

之前我们学习了如何从国家青藏高原科学数据中心下载数据,但我们会发现下载下来的气象数据是nc格式。今天我们就来学习用python将nc数据转成tif数据。

nc数据

「NetCDF」全称为Network Common Data Format,即网络通用数据格式,它是由美国大学大气研究协会的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据描述和编码标准,特别适用于包含多维数组和元数据的数据集。NetCDF 文件可以存储各种类型的数据,如气象数据、海洋数据、地理信息系统数据等。它可以在不同平台上进行读取和写入,因此非常适合用于交换和共享科学数据。

数据组成

NetCDF 文件通常具有以下组成部分:

  • 维度(Dimensions): 描述数据的不同维度,例如时间、经度、纬度等。
  • 变量(Variables): 存储实际数据的多维数组,这些数组与维度相关联。
  • 属性(Attributes): 与数据集或变量相关联的元数据信息,用于描述数据的含义、单位等。

python查看nc数据

import netCDF4 as nc

# 打开NetCDF文件
file_path = 'path_to_your_file.nc'
dataset = nc.Dataset(file_path, 'r')

# 获取维度和变量
latitudes = dataset.variables['lat'][:]
longitudes = dataset.variables['lon'][:]
pm25_data = dataset.variables['PM2.5'][:]

# 关闭文件
dataset.close()

在上述示例中,假设你的NetCDF文件包含名为'lat'、'lon'和'PM2.5'的变量,分别表示纬度、经度和PM2.5数据。你可以通过variables属性从数据集中提取这些变量的数据。

通过打印latitudes、longitudes和pm25_data,你可以查看这些变量的数据。latitudes和longitudes将是数组,而pm25_data也将是一个数组,其中存储了对应的PM2.5数据。

nc转tif

下面就看看用python怎么实现nc转tif

导入必要的库

import os
from osgeo import gdal
import netCDF4 as nc
import numpy as np
from glob import glob
from osgeo import osr

# 导入所需库
# os 用于基本操作系统操作
# gdal 用于处理地理空间数据
# netCDF4 用于读取 netCDF 文件
# numpy 用于数值操作
# glob 用于文件路径匹配
# osr 用于处理空间参考信息

设置参数

# 定义工作路径和输出路径
file_path = r'.\data\2021_NO2.nc'
OutPath = r'.\data\'

# 指定空气污染物类型
AP = 'PM2.5'

# 定义空间分辨率
SP = 0.01  # 度

# 如果输出路径不存在,则创建
if not os.path.exists(OutPath):
    os.makedirs(OutPath)

转换格式

f = nc.Dataset(file_path)  # 打开 netCDF 文件

data = np.array(f[AP][:])  # 提取空气污染物数据
data[data == 65535] = np.nan  # 将值为 65535 的数据替换为 NaN

lon = np.array(f['lon'][:])  # 提取经度数据
lat = np.array(f['lat'][:])  # 提取纬度数据
LonMin, LatMax, LonMax, LatMin = lon.min(), lat.max(), lon.max(), lat.min()  # 计算范围和极值
N_Lat = len(lat)
N_Lon = len(lon)
Lon_Res = SP
Lat_Res = SP

# 提取文件名并构建输出路径
fname = os.path.basename(file_path).split('.nc')[0]
outfile = OutPath + '/{}.tif'.format(fname)

driver = gdal.GetDriverByName('GTiff')  # 获取 GeoTIFF 驱动
# 创建输出 GeoTIFF 文件
outRaster = driver.Create(outfile, N_Lon, N_Lat, 1, gdal.GDT_Float32)
# 设置地理变换参数
outRaster.SetGeoTransform([LonMin - Lon_Res / 2, Lon_Res, 0, LatMax + Lat_Res / 2, 0, -Lat_Res])
sr = osr.SpatialReference()
sr.SetWellKnownGeogCS('WGS84')  # 使用 WGS84 坐标系
outRaster.SetProjection(sr.ExportToWkt())  # 设置投影信息
outRaster.GetRasterBand(1).WriteArray(data)  # 将数据写入栅格波段
print(fname + '.tif''处理完成')

# 释放内存
del outRaster
f.close()

总结

转换完成后就能得到nc文件的tif格式啦。感兴趣的可以下载数据自己试试。下面是批量处理nc转tif的python代码。

获取方法

如有需要,请关注微信公众号「DataAssassin」后,后台回复「016」领取。

资料收集不易,请及时保存,如有侵权请第一时间联系作者。切勿用作商业用途,谢谢大家的支持。感兴趣的请「关注、点赞、收藏」哦!

本文由 mdnice 多平台发布

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要批量将多个 `.nc` 文件换为 `.tif` 文件,你可以使用 Python 的 `os` 模块来获取文件列表,然后循环读取每个 `.nc` 文件并将其换为 `.tif` 文件。以下是一个示例代码: ```python import netCDF4 import gdal import os # 设置输入输出文件夹路径 input_folder = 'your_input_folder' output_folder = 'your_output_folder' # 获取 .nc 文件列表 nc_files = [f for f in os.listdir(input_folder) if f.endswith('.nc')] # 循环处理每个 .nc 文件 for nc_file in nc_files: # 打开 .nc 文件 ds = netCDF4.Dataset(os.path.join(input_folder, nc_file)) # 读取数据 data = ds.variables['variable_name'][:] # 获取元数据信息 geo_transform = (0.0, 0.01, 0.0, 0.0, 0.0, -0.01) # 示例数据,需要根据实际情况修改 projection = 'WGS84' # 示例数据,需要根据实际情况修改 # 将数据写入 .tif 文件 driver = gdal.GetDriverByName("GTiff") out_data_set = driver.Create(os.path.join(output_folder, os.path.splitext(nc_file)[0] + '.tif'), data.shape[1], data.shape[0], 1, gdal.GDT_Float32) out_data_set.SetGeoTransform(geo_transform) out_data_set.SetProjection(projection) out_data_set.GetRasterBand(1).WriteArray(data) out_data_set.FlushCache() out_data_set = None ``` 在上面的代码中,你需要将 `your_input_folder` 和 `your_output_folder` 替换为你要读取 `.nc` 文件文件夹和保存 `.tif` 文件文件夹的路径。你还需要将 `variable_name` 替换为你要提取的变量名。代码将在输出文件夹中生成与输入文件夹中每个 `.nc` 文件对应的 `.tif` 文件。 希望这可以帮助到你。如果你遇到任何问题,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DataAssassin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值