如何将Sentinel_5_L2级ncdf文件转换为GeoTIFF格式?
Sentinel-5P L2级NC文件转GeoTIFF实现方法
报错原因
触发unused arguments (xmin = ..., ymin = ...)报错的核心原因有两个:
- 构造raster对象时
ymin参数错误传入了完整的纬度数组,未取纬度最小值 CRS("+init=epsg:4326")的写法已被raster包废弃,会引发参数匹配异常
修正后可用代码
推荐使用raster包的官方替代包terra处理,兼容性和效率更高:
library(ncdf4) library(terra) # 读取NC文件变量 nc_data <- nc_open("TROPOSIF_L2B_2018-06-01.nc") lon <- ncvar_get(nc_data, "PRODUCT/longitude", verbose = TRUE) lat <- ncvar_get(nc_data, "PRODUCT/latitude", verbose = TRUE) SIF_743 <- ncvar_get(nc_data, "PRODUCT/SIF_743", verbose = TRUE) nc_close(nc_data) # 方案1:规则网格数据直接构造栅格 r <- rast(t(SIF_743), xmin = min(lon, na.rm = TRUE), xmax = max(lon, na.rm = TRUE), ymin = min(lat, na.rm = TRUE), ymax = max(lat, na.rm = TRUE), crs = "EPSG:4326") r <- flip(r, direction = "y") # 方案2:Sentinel-5 L2不规则条带数据使用点转栅格,避免坐标错位 # df <- data.frame( # lon = as.vector(lon), # lat = as.vector(lat), # sif = as.vector(SIF_743) # ) # df <- na.omit(df) # pts <- vect(df, geom = c("lon", "lat"), crs = "EPSG:4326") # r <- rasterize(pts, rast(res=0.05, ext(pts), crs="EPSG:4326"), field = "sif") # 可视化 plot(r, main = "SIF_743 2018-06-01") # 导出GeoTIFF writeRaster(r, "SIF_743_20180601.tif", overwrite = TRUE)
原有代码快速修复方案
如果要保留原raster包的写法,仅需修改raster构造行的两个参数即可:
# 把原来的构造行替换为以下内容即可 r <- raster(t(SIF_743), xmin=min(lon, na.rm = T), xmx=max(lon, na.rm = T), ymin=min(lat, na.rm = T), ymx=max(lat, na.rm = T), crs=CRS("+proj=longlat +datum=WGS84 +no_defs"))
内容的提问来源于stack exchange,提问作者Bryan Alemán
相关产品推荐
相关产品推荐

