将一个NC文件里每一年中的每月均转出为TIF图像,并存为一个目录下。
import xarray as xr
import rasterio
from rasterio.transform import from_origin
import pandas as pd
# 读取您的NC文件
nc_file = "D:\\NC\\Surface-net-solar-radiation\\szjmean.nc"
ds = xr.open_dataset(nc_file)
# 获取数据变量名,这里假设变量名为"ssr"
variable_name = "ssr"
data = ds[variable_name]
# 设置TIFF图像的元数据
profile = {
"driver": "GTiff",
"height": data.shape[1],
"width": data.shape[2],
"count": 1,
"dtype": rasterio.float32,
"crs": "+proj=latlong",
"transform": from_origin(
ds.coords["longitude"].values[0], ds.coords["latitude"].values[0], 1, 1
),
"compress": "lzw",
}
# 遍历每个时间点的数据并将其导出为TIFF图像
for time_idx, time in enumerate(data.coords["time"].values):
timestamp = pd.Timestamp(time)
year = timestamp.year
month = timestamp.month
#下面是你要输出文件的目录,记得改好目录
output_file = f"D:\\NC\\Surface-net-solar-radiation\\tif\\_{year}_month_{month}.tif"
with rasterio.open(output_file, "w", **profile) as dst:
dst.write(data[time_idx].values.astype(rasterio.float32), 1)
# 关闭NetCDF数据集
ds.close()
-
"driver": "GTiff"
:指定输出文件的格式为GeoTIFF。 -
"height": data.shape[1]
:设置输出TIFF图像的高度(行数),从输入的NetCDF数据中获取。 -
"width": data.shape[2]
:设置输出TIFF图像的宽度(列数),从输入的NetCDF数据中获取。 -
"count": 1
:设置输出TIFF图像的波段数量。在这里,我们只输出一个波段,即NetCDF变量中的一个时间点的数据。 -
"dtype": rasterio.float32
:设置输出TIFF图像的数据类型。在这里,我们使用32位浮点数。你可以根据输入数据的类型相应地更改此设置。 -
"crs": "+proj=latlong"
:设置输出TIFF图像的坐标参考系统。这里我们使用经纬度坐标系。你可能需要根据输入数据的坐标系进行修改。 -
"transform": from_origin(ds.coords["longitude"].values[0], ds.coords["latitude"].values[-1], 1, 1)
:设置输出TIFF图像的仿射变换矩阵。from_origin()
函数会根据给定的左上角经纬度坐标(ds.coords["longitude"].values[0]
和ds.coords["latitude"].values[-1]
)以及像元大小(1 x 1)生成一个仿射变换矩阵。 -
"compress": "lzw"
:设置输出TIFF图像的压缩方式。在这里,我们使用Lempel-Ziv-Welch (LZW) 压缩算法,它是一种无损压缩算法,能有效地降低TIFF图像文件的大小,而不会损失任何数据。