有什么方法可以用来解析一个国家的 shapefile 并使用 R 在该国家/地区下载 MODIS 产品数据?
我尝试了使用MODIStsp
包(https://docs.ropensci.org/MODIStsp/)以及MODISTools
包( https://docs.ropensci.org/MODISTools/articles/modistools-vignette.html )的不同方法,它们都只允许我下载特定站点的 MODIS 产品数据,但不能下载国家/地区。
有什么方法可以用来解析一个国家的 shapefile 并使用 R 在该国家/地区下载 MODIS 产品数据?
我尝试了使用MODIStsp
包(https://docs.ropensci.org/MODIStsp/)以及MODISTools
包( https://docs.ropensci.org/MODISTools/articles/modistools-vignette.html )的不同方法,它们都只允许我下载特定站点的 MODIS 产品数据,但不能下载国家/地区。
这是一个如何实现这一目标的示例。
首先,下载你需要的 MODIS 数据,在这个例子中我使用的是 MCD12Q1.006
begin_year
end_year
格式为:Year.Month.Days
。shape_file
是您正在使用的 shapefile,大概 shapefile 的范围是您所追求的国家/地区。不过,我只是根据您提供的最少信息而离开。
library(MODIS)
tifs <- runGdal(product = "MCD12Q1", collection = "006", SDSstring = "01",
extent = shape_file %>% st_buffer(dist = 10000),
begin = begin_year, end = end_year,
outDirPath = "data", job = "modis",
MODISserverOrder = "LPDAAC") %>%
pluck("MCD12Q1.006") %>%
unlist()
# rename tifs to have more descriptive names
new_names <- format(as.Date(names(tifs)), "%Y") %>%
sprintf("modis_mcd12q1_umd_%s.tif", .) %>%
file.path(dirname(tifs), .)
file.rename(tifs, new_names)
landcover <- list.files("data/modis", "^modis_mcd12q1_umd",
full.names = TRUE) %>%
stack()
# label layers with year
landcover <- names(landcover) %>%
str_extract("(?<=modis_mcd12q1_umd_)[0-9]{4}") %>%
paste0("y", .) %>%
setNames(landcover, .)
此外,如果您需要特定的像元大小,则可以按照此过程获得 5x5 modis 像元大小。
neighborhood_radius <- 5 * ceiling(max(res(landcover))) / 2
agg_factor <- round(2 * neighborhood_radius / res(landcover))
r <- raster(landcover) %>%
aggregate(agg_factor)
r <- shape_file %>%
st_transform(crs = projection(r)) %>%
rasterize(r, field = 1) %>%
# remove any empty cells at edges
trim()
这是一个使用 MODISTools 自动下载该国家/地区的正确图块的示例。
首先让我们生成一个国家的多边形来演示(以卢森堡为例):
library(maptools)
library(sf)
data(wrld_simpl)
world = st_as_sf(wrld_simpl)
lux = world[world$NAME=='Luxembourg',]
现在我们找到国家的位置(质心)和大小:
#find centroid of polygon in long-lat decimal degrees
lux.cent = st_centroid(lux)
#find width and height of country in km
lux.proj = st_transform(lux,
"+proj=moll +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=km +no_defs")
lux.km_lr = diff(st_bbox(lux.proj)[c(1,3)])
lux.km_ab = diff(st_bbox(lux.proj)[c(2,4)])
使用此信息,我们可以下载正确的 Modis 数据(以叶面积索引 lai 为例):
#download the MODIS tiles for the area we defined
library(MODISTools)
lux_lai <- mt_subset(product = "MOD15A2H",
lat = lux.cent$LAT, lon = lux.cent$LON,
band = "Lai_500m",
start = "2004-01-01", end = "2004-01-01",
km_lr = lux.km_lr, km_ab = lux.km_ab,
site_name = "Luxembourg",
internal = TRUE, progress = TRUE)
# convert to a spatial raster
lux.rast = mt_to_raster(df = lux_lai, reproject = TRUE)
lux.rast = raster::mask(lux.rast, lux)
plot(lux.rast)
plot(st_geometry(lux),add=T)