You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WorldClim生物气候数据提取结果异常问题求助

WorldClim生物气候数据提取结果异常问题求助

看起来你遇到的是WorldClim数据缩放解读、站点覆盖范围和变量对应上的问题,我来帮你一步步理清原因和解决方法:

1. 数值异常:原始值需要还原才能得到真实气候数据

WorldClim v2.1的生物气候数据为了节省存储空间,所有变量都做了缩放存储

  • 温度类变量(BIO1-BIO11):原始存储值 × 0.1 = 真实温度(单位:℃)
  • 降水类变量(BIO12-BIO19):原始存储值 × 0.1 = 真实降水量(单位:mm)

你看到的BIO19出现-2的情况,是原始缩放值,还原后是-0.2mm,属于数据插值过程中的微小噪声,直接当作0处理即可。

针对你的提取结果,添加还原代码:

# 还原真实数值
values_actual <- values
# 处理温度变量
values_actual[, 1:11] <- values_actual[, 1:11] * 0.1
# 处理降水变量,同时修正负数值
values_actual[, 12:19] <- values_actual[, 12:19] * 0.1
values_actual[, 12:19][values_actual[, 12:19] < 0] <- 0

2. BIO13与BIO14数值颠倒的排查方向

首先注意你提到的BIOL13/BIOL14应该是笔误,正确变量名是BIO13(最湿月降水)和BIO14(最干月降水),出现数值颠倒的可能原因有两个:

(1)站点不在下载的瓦片范围内

你用第一个站点的经纬度下载了瓦片tile_16,但第二个站点的坐标(lon=-89.96576, lat=35.07540)并不在这个瓦片的覆盖范围内(0.5分辨率的WorldClim瓦片是10×10度,tile_16覆盖lon:-80~-70, lat:30~40),第二个站点属于tile_15lon:-90~-80, lat:30~40)。

你可以先验证站点是否在瓦片范围内:

# 查看瓦片的经纬度范围
print(terra::ext(wc_data))
# 检查每个站点是否在瓦片内
point$in_tile <- terra::within(point, wc_data)
print(point)

如果第二个站点的in_tileFALSE,说明提取的是无效值,需要单独下载第二个站点对应的瓦片,或者用全局数据批量提取。

(2)变量对应关系错误

先确认下载的瓦片变量顺序是否正确:

# 查看所有图层的变量名
names(wc_data)
# 单独绘制BIO13和BIO14的图层,验证数值分布
plot(wc_data[["bio13"]], main = "BIO13 原始缩放值")
plot(wc_data[["bio14"]], main = "BIO14 原始缩放值")

如果图层名确实对应bio13bio14,但绘制后发现bio13数值普遍低于bio14,可以直接指定变量名提取,避免依赖顺序出错:

# 按变量名提取指定站点的BIO13和BIO14
bio13_vals <- terra::extract(wc_data[["bio13"]], point) * 0.1
bio14_vals <- terra::extract(wc_data[["bio14"]], point) * 0.1

3. 优化后的完整代码参考

library(terra)
library(geodata)

sites_coords <- data.frame(lon=c(-77.66588,-89.96576),lat=c(39.92275,35.07540))
savepath <- "./worldclim_data" # 替换为你的存储路径

# 定义批量提取函数:自动匹配站点对应的瓦片并还原数值
extract_worldclim <- function(lon, lat, savepath) {
  wc_tile <- worldclim_tile(var = "bio", res = 0.5, lat = lat, lon = lon, 
                            version = "2.1", path = savepath)
  point <- vect(data.frame(lon=lon, lat=lat), geom=c("lon","lat"), crs = "EPSG:4326")
  vals <- terra::extract(wc_tile, point)
  # 还原数值并修正异常
  vals[,1:11] <- vals[,1:11] * 0.1
  vals[,12:19] <- vals[,12:19] * 0.1
  vals[,12:19][vals[,12:19] < 0] <- 0
  return(vals)
}

# 批量提取所有站点数据
all_values <- do.call(rbind, lapply(1:nrow(sites_coords), function(i) {
  extract_worldclim(sites_coords$lon[i], sites_coords$lat[i], savepath)
}))
rownames(all_values) <- paste0("site_", 1:nrow(sites_coords))
print(all_values)

补充说明

  • 你使用的worldclim_tilegeodata包中的函数,下载的瓦片会自动匹配对应经纬度的10×10度区域;
  • 若站点数量不多,也可以直接用worldclim_global下载全局0.5分辨率的生物气候数据,再一次性提取所有站点,避免多次下载瓦片的麻烦。

火山引擎 最新活动