You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中修正NetCDF转GeoTIFF后的倒置图像并保存为可用TIFF文件?

NetCDF转GeoTIFF后图像倒置的修复方案

问题描述

我已通过Python代码将NetCDF文件转换为GeoTIFF格式,但在显示生成的GeoTIFF文件时,发现图像呈现翻转或倒置状态。具体代码如下:

import xarray as xr
import rioxarray as rio
import rasterio
nc_file = xr.open_dataset('Africa_salinity.nc')
nc_file
sss = nc_file['sss']
sss
sss = sss.rio.set_spatial_dims(x_dim='lon', y_dim='lat')
sss.rio.crs
sss.rio.write_crs("epsg:4326", inplace=True)
sss.rio.to_raster(r"Africa_19.tiff")
ax = show((sss))

请问如何旋转该GeoTIFF文件并重新保存为TIFF格式,以便用于后续的分析工作?


解决方案

这问题我碰到过好多次!主要是NetCDF和GeoTIFF对纬度坐标的存储习惯不一样导致的:大部分气候类NetCDF的纬度是从北到南递减(也就是从高纬度往低纬度排),但GeoTIFF默认要求数据的纬度顺序是从南到北递增,直接导出就会出现倒置。给你两种简单的修复方法:

方法1:反转纬度维度(最直观推荐)

在导出GeoTIFF前,直接反转lat维度的顺序,就能让数据匹配GeoTIFF的坐标要求,修改后的代码如下:

import xarray as xr
import rioxarray as rio
from rioxarray.plot import show

# 读取NetCDF文件
nc_file = xr.open_dataset('Africa_salinity.nc')
sss = nc_file['sss']

# 设置空间维度与CRS
sss = sss.rio.set_spatial_dims(x_dim='lon', y_dim='lat')
sss.rio.write_crs("epsg:4326", inplace=True)

# 核心步骤:反转lat维度,修复倒置
sss_fixed = sss.reindex(lat=sss.lat[::-1])

# 导出修复后的GeoTIFF
sss_fixed.rio.to_raster(r"Africa_19_fixed.tiff")

# 显示验证效果
ax = show(sss_fixed)

方法2:用Rasterio直接修正已生成的TIFF

如果已经导出了倒置的TIFF,不想重新处理NetCDF,也可以用Rasterio打开后调整变换矩阵并翻转数据:

import rasterio
from rasterio.transform import Affine

# 打开之前生成的倒置TIFF文件
with rasterio.open("Africa_19.tiff") as src:
    tiff_data = src.read()
    profile = src.profile.copy()
    
    # 调整变换矩阵,反转y轴方向
    original_transform = profile['transform']
    new_transform = Affine(
        original_transform.a, original_transform.b, original_transform.c,
        original_transform.d, -original_transform.e, 
        original_transform.f + original_transform.e * (src.height - 1)
    )
    profile['transform'] = new_transform

# 写入修复后的TIFF
with rasterio.open("Africa_19_fixed.tiff", 'w', **profile) as dst:
    dst.write(tiff_data[::-1])  # 反转数据的y轴顺序

额外说明

你可以先检查下NetCDF里的纬度值是不是递减的——比如打印sss.lat.values,如果看到是从30°N到-30°N这样的顺序,那肯定会出现倒置问题,用方法1反转后就完美解决了,后续分析也能正常使用修复后的TIFF。

内容的提问来源于stack exchange,提问作者Nishita

火山引擎 最新活动