北极不规则网格:跨NetCDF文件坐标的NetCDF转TIFF方法
解决北极不规则网格NetCDF转TIFF的配准问题
问题根源分析
原代码存在三个核心问题:
- 坐标赋值错误:仅提取了坐标文件中单行/单列的经纬度(
xdc.mp_lon[1,:]/xdc.mp_lat[:,1]),而非每个网格点对应的二维全量坐标,导致地理配准完全错误。 - 维度与坐标混淆:
rename_dims仅修改了维度名称,但未将二维经纬度关联到对应网格点,无法反映不规则网格的空间位置。 - 未适配不规则网格:EPSG:4326下的北极不规则网格无法用常规仿射变换配准,必须使用**地面控制点(GCPs)**来定义每个网格的地理坐标。
修正代码实现
以下是适配不规则网格的完整处理流程,假设主数据维度为(r, c),坐标文件中mp_lon/mp_lat为对应大小的二维数组:
import xarray as xr import rioxarray as rio from rasterio.transform import from_gcps from rasterio.control import GroundControlPoint as GCP import numpy as np # 打开数据集 xds = xr.open_dataset(r'path_to_netdfc') xdc = xr.open_dataset(r"path_to_netcdf_with_coordinates") # 确保主数据与坐标数据维度匹配(检查r、c的大小是否一致) assert xds.dims['r'] == xdc.dims['r'] and xds.dims['c'] == xdc.dims['c'], "维度不匹配" # 提取目标变量 df = xds['daily_fraction'].squeeze() # 生成地面控制点(GCPs):遍历每个网格点,关联经纬度与像素坐标 gcps = [] for r in range(df.shape[0]): for c in range(df.shape[1]): lon = xdc.mp_lon[r, c].item() lat = xdc.mp_lat[r, c].item() # GCP参数:(像素x, 像素y, 经度, 纬度) gcps.append(GCP(c, r, lon, lat)) # 基于GCPs生成地理变换 transform = from_gcps(gcps) # 写入CRS与地理变换 df = df.rio.write_crs('EPSG:4326') df.rio.set_transform(transform, inplace=True) # 导出为TIFF df.rio.to_raster(r"C:\PHD\name_of_output.tiff")
关键说明
- GCPs的必要性:不规则网格没有统一的行/列间隔,必须为每个像素点指定经纬度,才能让GIS软件正确识别空间位置。
- 维度匹配检查:提前验证主数据与坐标数据的维度一致性,避免因维度错位导致的坐标关联错误。
- 像素坐标对应:GCP中的像素坐标
(c, r)对应数据的列/行索引,与NetCDF的维度顺序保持一致。
内容的提问来源于stack exchange,提问作者SNunes
相关产品推荐
相关产品推荐

