伊迩 2025-05-30 09:45 采纳率: 66.7%
浏览 8
已结题

最近邻插值重采样问题

GPM.nc数据的经纬度范围是:
纬度范围: 27.049999237060547 到 31.149999618530273
经度范围: 118.04999542236328 到 123.14999389648438Coordinates:

lat (lat) float32 168B 27.05 27.15 27.25 27.35 ... 30.95 31.05 31.15
lon (lon) float32 208B 118.0 118.1 118.2 118.3 ... 122.9 123.0 123.1
time (time) object 8B 2022-05-01 00:00:00
Himawari.nc数据的经纬度范围是:
纬度范围: 31.200000762939453 到 27.0
经度范围: 118.0 到 123.19999694824219
Coordinates:
latitude (latitude) float32 844B 31.2 31.18 31.16 ... 27.04 27.02 27.0
longitude (longitude) float32 1kB 118.0 118.0 118.0 ... 123.2 123.2 123.2
虽然两个nc格式数据都按研究区的经纬度范围裁剪了,表示的区域一样,但他两的纬度顺序不一样,一个是从小到大,一个是从大到小。GPM的空间分辨率是0.1°,Himawari的空间分辨率是2km

问题:我打算使用最近邻插值法,来将GPM重采样到Himawari数据的分辨率,将两者对齐以便将GPM上的强降水区域在Himawari打上标签
请问我是直接以nc数据进行插值,还是先将GPM的降水波段和Himawari所需的波段提取成tif再重采样

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-05-30 09:53
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你的问题是关于如何将GPM数据重采样到Himawari数据的分辨率,并且使用最近邻插值法。以下是解决问题的步骤和建议:


    分析问题

    1. 数据特点

      • GPM数据的经纬度范围和Himawari数据的经纬度范围一致。
      • GPM数据的空间分辨率为0.1°(约11公里),而Himawari数据的空间分辨率为2公里。
      • GPM数据的纬度顺序是从小到大,而Himawari数据的纬度顺序是从大到小。
    2. 目标

      • 使用最近邻插值法将GPM数据重采样到Himawari数据的分辨率。
      • 将GPM的强降水区域与Himawari数据对齐。
    3. 选择工具

      • 可以使用Python中的xarray库处理NetCDF文件。
      • 如果需要更高精度的栅格操作,可以考虑使用GDAL或rasterio库。

    解决方案

    方法1:直接使用NetCDF文件进行插值

    优点:直接基于NetCDF文件操作,避免额外的格式转换。 缺点:可能需要更多的计算资源和时间。

    步骤

    1. 读取数据: 使用xarray读取GPM和Himawari的NetCDF文件。

      import xarray as xr
      
      # 读取GPM数据
      gpm_data = xr.open_dataset('GPM.nc')
      gpm_lat = gpm_data['lat'].values
      gpm_lon = gpm_data['lon'].values
      gpm_precipitation = gpm_data['precipitation'].values  # 假设降水数据名为'precipitation'
      
      # 读取Himawari数据
      himawari_data = xr.open_dataset('Himawari.nc')
      himawari_lat = himawari_data['latitude'].values
      himawari_lon = himawari_data['longitude'].values
      
    2. 调整纬度顺序: 将GPM数据的纬度从从小到大调整为从大到小。

      gpm_lat = gpm_lat[::-1]  # 反转纬度顺序
      gpm_precipitation = gpm_precipitation[::-1, :]  # 同时反转降水数据的纬度维度
      
    3. 重采样: 使用最近邻插值法将GPM数据重采样到Himawari的分辨率。

      from scipy.interpolate import griddata
      
      # 构造网格点
      gpm_points = np.vstack((gpm_lat.ravel(), gpm_lon.ravel())).T
      himawari_points = np.vstack((himawari_lat.ravel(), himawari_lon.ravel())).T
      
      # 进行最近邻插值
      interpolated_precipitation = griddata(gpm_points, gpm_precipitation.ravel(), himawari_points, method='nearest')
      
    4. 保存结果: 将插值后的降水数据保存回NetCDF文件。

      himawari_data['interpolated_precipitation'] = (('latitude', 'longitude'), interpolated_precipitation.reshape(himawari_lat.shape))
      himawari_data.to_netcdf('output.nc')
      

    方法2:先提取为TIFF文件再重采样

    优点:适合需要更高精度栅格操作的场景。 缺点:需要额外的格式转换。

    步骤

    1. 提取为TIFF文件: 使用rasterio将NetCDF文件中的降水数据提取为TIFF文件。

      import rasterio
      from rasterio.warp import reproject, Resampling
      
      # 打开GPM数据
      with rasterio.open('GPM.nc') as src:
          gpm_data = src.read(1)  # 假设降水数据是第一波段
          gpm_transform = src.transform
          gpm_crs = src.crs
      
      # 写入TIFF文件
      with rasterio.open(
          'gpm.tif',
          'w',
          driver='GTiff',
          height=gpm_data.shape[0],
          width=gpm_data.shape[1],
          count=1,
          dtype=gpm_data.dtype,
          crs=gpm_crs,
          transform=gpm_transform,
      ) as dst:
          dst.write(gpm_data, 1)
      
    2. 提取Himawari数据为TIFF文件: 类似地,将Himawari数据也提取为TIFF文件。

      with rasterio.open('Himawari.nc') as src:
          himawari_data = src.read(1)  # 假设Himawari数据也是第一波段
          himawari_transform = src.transform
          himawari_crs = src.crs
      
      with rasterio.open(
          'himawari.tif',
          'w',
          driver='GTiff',
          height=himawari_data.shape[0],
          width=himawari_data.shape[1],
          count=1,
          dtype=himawari_data.dtype,
          crs=himawari_crs,
          transform=himawari_transform,
      ) as dst:
          dst.write(himawari_data, 1)
      
    3. 重采样: 使用gdalrasterio进行最近邻插值。

      gdal_reproject -r nearest -t_srs EPSG:4326 -te <min_lon> <min_lat> <max_lon> <max_lat> \
                     -ts <new_width> <new_height> gpm.tif gpm_resampled.tif
      

      或者在Python中使用rasterio

      with rasterio.open('gpm_resampled.tif', 'w', ...) as dst:
          reproject(
              source=rasterio.band(src_gpm, 1),
              destination=rasterio.band(dst, 1),
              src_transform=src_gpm.transform,
              src_crs=src_gpm.crs,
              dst_transform=dst_transform,
              dst_crs=dst_crs,
              resampling=Resampling.nearest,
          )
      
    4. 对齐数据: 将重采样的GPM数据与Himawari数据对齐。


    推荐方案

    如果数据量较小且主要在Python环境中操作,推荐方法1(直接使用NetCDF文件进行插值)。这种方法更高效,不需要额外的格式转换。

    如果数据量较大或需要更高的栅格操作精度,推荐方法2(先提取为TIFF文件再重采样)。


    总结

    无论选择哪种方法,最终目标都是将GPM数据重采样到Himawari的分辨率,并使用最近邻插值法对齐数据。推荐使用xarrayrasterio库进行操作,具体实现可以根据实际需求调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月9日
  • 已采纳回答 6月1日
  • 创建了问题 5月30日