从卫星影像文件名提取日期并匹配提取NDVI值的技术需求
从卫星影像文件名提取日期并匹配NDVI值的R代码补充方案
需求说明
现有一批卫星影像文件,文件名格式为mosaic_NDVI_YYYY_MM_DD.tif,需从文件名中提取日期,与数据集里的记录匹配最近日期的影像,提取对应坐标的NDVI值。以下是补充提取日期的代码段及完整修正后的代码。
提取日期的代码实现
可以通过正则表达式或字符串分割两种方式提取日期,以下是两种可行方案:
方案1:正则表达式(推荐,更简洁)
利用正则表达式捕获文件名中的年、月、日部分,直接转换为YYYY-MM-DD格式:
# 提取日期并转换格式 filename_dates <- sub("mosaic_NDVI_(\\d{4})_(\\d{1,2})_(\\d{1,2})\\.tif", "\\1-\\2-\\3", filenames)
方案2:字符串分割
通过拆分文件名获取日期部分,再拼接成目标格式:
# 按下划线拆分文件名,提取年、月、日部分 split_names <- strsplit(filenames, "_") # 拼接为YYYY-MM-DD格式并去除.tif后缀 filename_dates <- sapply(split_names, function(x) paste(x[3], x[4], sub("\\.tif$", "", x[5]), collapse = "-"))
完整修正后的代码
注意:原代码中循环内创建point_vec时错误使用了df[1,],应改为df[i,]才能匹配当前行的坐标,已修正:
# 示例数据 df <- data.frame(date = c("2000-7-26", "2000-10-20", "2000-12-10"), lon = c(23.05, 23.12, 23.08), lat = c(-32.56, -32.61, -32.53)) df$date <- lubridate::as_date(df$date) filenames <- c("mosaic_NDVI_2000_10_15.tif", "mosaic_NDVI_2000_10_31.tif", "mosaic_NDVI_2000_11_16.tif", "mosaic_NDVI_2000_12_18.tif", "mosaic_NDVI_2000_12_2.tif", "mosaic_NDVI_2000_7_27.tif") # --- 补充的提取日期代码 --- filename_dates <- sub("mosaic_NDVI_(\\d{4})_(\\d{1,2})_(\\d{1,2})\\.tif", "\\1-\\2-\\3", filenames) # -------------------------- filename_dates <- lubridate::as_date(filename_dates) for(i in 1:nrow(df)){ date <- df$date[i] # 找到日期差最小的影像索引 index <- which(abs(filename_dates - date) == min(abs(filename_dates - date))) extraction_filename <- filenames[index] # 修正:使用当前行的坐标创建矢量点 point_vec <- vect(df[i,], geom=c("lon", "lat"), crs="+proj=longlat +datum=WGS84", keepgeom=FALSE) NDVI <- rast(extraction_filename) crs(NDVI) <- crs(point_vec) value <- terra::extract(x=NDVI, y=point_vec, df=TRUE) df$NDVI[i] <- value[2] }
说明
- 正则表达式方案更高效,适合处理大量文件名(400+文件);
- 若存在多个日期差相同的影像,
which会返回所有匹配索引,可根据需求调整(如取第一个); - 确保
terra包已正确安装加载,用于影像读取和坐标提取。
内容的提问来源于stack exchange,提问作者JDK
相关产品推荐
相关产品推荐

