如何在R中导入正弦投影遥感数据并转为规则栅格?
解决ESACCI海洋颜色正弦投影数据转规则网格问题
你读取的ESACCI CCI海洋颜色数据是**正弦投影(Sinusoidal)**下的一维有效像素数据(仅保留海洋区域),需要先恢复其空间属性,再投影到规则网格。以下是具体步骤:
步骤1:读取完整数据变量
除了叶绿素浓度(chlor_a),还需要读取对应经纬度变量,用于定位像素:
library(terra) # 数据文件路径 file_path <- "/vsicurl/https://dap.ceda.ac.uk/neodc/esacci/ocean_colour/data/v5.0-release/sinusoidal/netcdf/chlor_a/daily/v5.0/2007/ESACCI-OC-L3S-CHLOR_A-MERGED-1D_DAILY_4km_SIN_PML_OCx-20070104-fv5.0.nc?download=1" # 读取关键变量 r_chlor <- rast(file_path, lyrs = "chlor_a") r_lat <- rast(file_path, lyrs = "lat") r_lon <- rast(file_path, lyrs = "lon")
步骤2:转换为点矢量数据
将一维像素值转换为带坐标的点矢量,为后续栅格化做准备:
# 提取所有变量的值 chlor_vals <- values(r_chlor) lat_vals <- values(r_lat) lon_vals <- values(r_lon) # 创建WGS84经纬度投影的点矢量 pts <- vect(cbind(lon_vals, lat_vals), crs = "+proj=longlat +datum=WGS84") # 为点添加叶绿素浓度属性 values(pts) <- data.frame(chlor_a = chlor_vals)
步骤3:定义目标规则网格
根据需求设置目标投影、分辨率和范围(这里以常用的WGS84经纬度为例):
# 目标栅格参数:WGS84经纬度,0.04°分辨率(约4km,匹配原始数据精度),覆盖全球 target_crs <- "+proj=longlat +datum=WGS84" target_ext <- ext(-180, 180, -90, 90) target_res <- 0.04 # 创建空的目标栅格 target_rast <- rast(extent = target_ext, resolution = target_res, crs = target_crs)
步骤4:栅格化到目标规则网格
使用rasterize将点数据转换为规则栅格,选择最近邻插值适配离散海洋像素:
# 栅格化点数据 chlor_rast <- rasterize(pts, target_rast, field = "chlor_a", fun = "first") # 查看结果 chlor_rast
可选:先恢复原始正弦投影栅格再投影
如果需要先保留原始正弦投影的规则栅格,再投影到目标网格,可按以下操作:
- 读取原始正弦投影的x、y坐标变量(文件自带),创建正弦投影下的点矢量:
r_x <- rast(file_path, lyrs = "x") r_y <- rast(file_path, lyrs = "y") x_vals <- values(r_x) y_vals <- values(r_y) sinu_pts <- vect(cbind(x_vals, y_vals), crs = "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m") values(sinu_pts) <- data.frame(chlor_a = chlor_vals)
- 创建原始正弦投影的规则空栅格(参考ESACCI文档的4km分辨率全球范围):
sinu_rast <- rast(extent = ext(-17367530.45, 17367530.45, -7301427.63, 7301427.63), resolution = 4000, crs = "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m")
- 栅格化到正弦栅格后再投影到目标网格:
sinu_chlor <- rasterize(sinu_pts, sinu_rast, field = "chlor_a", fun = "first") chlor_proj <- project(sinu_chlor, target_rast, method = "bilinear")
内容的提问来源于stack exchange,提问作者Philippe Massicotte
相关产品推荐
相关产品推荐

