遇到的问题: NetCDF 文件具有旋转的网格坐标(rlon、rlat),这增加了将其与 shapefile 对齐的复杂性。 当我尝试使用 shapefile 剪辑 NetCDF 数据时,我收到错误。我怀疑这与处理旋转的网格坐标或 CRS 不匹配有关。
问题: 如何正确处理 NetCDF 文件中的旋转网格坐标并将其与包含 EPSG:3003 的 shapefile 对齐?我应该采取哪些步骤来确保正确分配 CRS 并确保裁剪操作无错误地进行? 另一个问题是 nc 文件的属性,我尝试了一些代码来重新旋转回正常的纬度广告,但根本不起作用。
任何指导或建议,我们将不胜感激!
我已经上传了我正在使用的 NetCDF 和 shapefile。您可以从以下链接下载它们:
任何有关如何正确处理 CRS 和裁剪的帮助将不胜感激!
import xarray
import xarray as xr
import geopandas as gpd
from pyproj import CRS
# Load shapefile and NetCDF dataset
gdf = gpd.read_file('path/to/your/shapefile.shp')
ds = xr.open_dataset('path/to/your/data.nc')
# Check CRS of shapefile and NetCDF
shapefile_crs = gdf.crs
netcdf_crs = CRS.from_user_input(ds.rio.crs) if ds.rio.crs else
None
print("Shapefile CRS:", shapefile_crs)
print("NetCDF CRS:", netcdf_crs)
# Assign CRS if missing
if not shapefile_crs:
gdf = gdf.set_crs(netcdf_crs)
elif not netcdf_crs:
ds = ds.rio.write_crs(shapefile_crs, inplace=True)
# Attempt to clip NetCDF with shapefile
clipped_ds = ds.rio.clip(gdf.geometry, from_disk=True)
据我所知,您只能使用 cf-python 包处理旋转经纬网格中带有变量的数据集。该包是由一些活跃于 CF 元数据约定的人开发的,您的数据集显然遵守该约定,并且它被标记为 Python 中 CF 的参考实现。
在 CRS 上,这通常不包含在 netCDF 文件中,特别是如果它遵循 CF,因为默认值是未定义球体上的经度-纬度(通常可以假设 WGS-84)。在您的情况下,它实际上已包含在内,但它描述了旋转网格(因此使其成为强制性的),因此没有多大用处。根据 CF 建议,有辅助坐标变量“lon”和“lat”给出数据变量中每个像素的经度和纬度,在本例中为“TOT_PREC”。虽然我自己没用过,但我很确定
cf-python
可以应付。
除此之外,您的 netCDF 文件中存在错误(可能与您在此处询问的错误有关)。 “时间”维度中有 24 个时间步长,它们的间隔都是 3600 秒。在关联的“time_bounds”bounds 变量中,这些界限在 0-24 小时内指定,但它们应该以秒为单位(“时间”维度的单位)并包含“时间”值(即第一个界限是
time[0] - 1800, time[0] + 1800
等)。