如何在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




