使用raster包extract函数提取Chelsa图层值结果异常求助
解答
问题大概率出在两个核心环节:投影坐标系不匹配,或未处理栅格的数值缩放规则,以下是具体分析和解决方法:
1. 投影坐标系不匹配(最可能的原因)
你的分布点是WGS84经纬度格式,但如果Chelsa图层采用的是其他投影(比如UTM或区域投影),而你没有给点数据nr指定CRS,raster包会默认假设点的CRS与栅格一致,导致提取的是错误位置的栅格值。
解决方法:
# 查看栅格的坐标系 print(crs(bio_layers[[1]])) # 给点数据设置正确的WGS84坐标系(EPSG:4326) proj4string(nr) <- CRS("+init=epsg:4326") # 如果栅格是其他投影,转换点数据到栅格的坐标系 nr_proj <- spTransform(nr, crs(bio_layers[[1]])) # 重新提取数值 ex_correct <- extract(bio_layers[[1]], nr_proj, df = TRUE)
2. 未处理Chelsa图层的数值缩放规则
Chelsa生物气候图层为了压缩存储空间,会将实际气候值进行缩放后存储为整数(比如bio1年平均温度以0.1℃为单位,即实际值=存储值×0.1)。QGIS会自动读取栅格元数据中的scale factor和offset完成转换,但raster包默认返回原始存储值。
解决方法:
# 获取栅格的缩放因子和偏移量(通常Chelsa的scale=0.1,offset=0) raster_attr <- bio_layers[[1]]@data@attributes[[1]] scale_val <- raster_attr$scale offset_val <- raster_attr$offset # 将提取的原始值转换为实际温度 ex$actual_temp <- ex[, 2] * scale_val + offset_val
验证步骤
- 先检查投影匹配问题:转换点CRS后提取的原始值,应与QGIS中提取的原始值一致;
- 再应用缩放规则:转换后的实际温度应符合采样点所在区域的气候特征。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

