如何在R语言中提取栅格图层同一纬度的像素值?
提取栅格中指定纬度的像素值(R语言实现)
以下分别用terra和raster包实现提取北纬30°附近的NDVI像素值,假设你的栅格对象为地理坐标系(如WGS84,EPSG:4326),若为投影坐标系需先转换。
一、使用terra包(推荐,raster包的替代工具)
- 获取栅格每行对应的纬度值:
library(terra) # 假设你的NDVI栅格对象名为ndvi_rast y_vals <- yFromRow(ndvi_rast)
- 找到与北纬30°最接近的行索引(若栅格存在精确30°纬度,可直接用
which(y_vals == 30)):
target_row <- which.min(abs(y_vals - 30))
- 提取该行的所有像素值:
# 提取为向量 ndvi_30n <- as.vector(slice(ndvi_rast, target_row)) # 或保留栅格格式 ndvi_30n_rast <- slice(ndvi_rast, target_row)
二、使用raster包
- 获取栅格每行对应的纬度值:
library(raster) # 假设你的NDVI栅格对象名为ndvi_raster y_vals <- yFromRow(ndvi_raster)
- 定位目标行:
target_row <- which.min(abs(y_vals - 30))
- 提取像素值:
# 提取为数据框,可转成向量 ndvi_30n_df <- extract(ndvi_raster, target_row) ndvi_30n <- as.vector(ndvi_30n_df)
注意事项
- 若栅格为投影坐标系(如UTM),需先转换为地理坐标系:
- terra包:
ndvi_geo <- project(ndvi_rast, "EPSG:4326") - raster包:
ndvi_geo <- projectRaster(ndvi_raster, crs = "+proj=longlat +datum=WGS84")
- terra包:
- 若需要提取的是精确纬度线而非栅格行(当栅格行不严格对应单一纬度时),可创建一条横跨栅格经度范围的线要素,再用
extract函数提取线上的像素值:
# terra包示例 library(terra) # 创建北纬30°的线,覆盖栅格经度范围 lon_range <- ext(ndvi_rast)[c(1,2)] line <- vect(paste0("LINESTRING(", lon_range[1], " 30, ", lon_range[2], " 30)"), crs = crs(ndvi_rast)) # 提取线上的NDVI值 ndvi_30n_line <- extract(ndvi_rast, line)
内容的提问来源于stack exchange,提问作者shuaige C
相关产品推荐
相关产品推荐

