You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

北极不规则网格:跨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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:50:18