[R-sig-Geo] Pixel reference location?
Lyndon Estes
lestes at princeton.edu
Sun Nov 14 05:54:01 CET 2010
Hi Robert,
Many thanks for helping further with this.
To send you files I produced, I setup a shared folder for you on our
webspace, which will have generated an email notification with a link
in it. This should work for downloading. This contains the image
that served as "to.crop" (MOD13Q1.A2005225.h20v11.mosaic.NDVI.tif) and
"crop.img" (MOD250m_extenttemplate).
The original MODIS images can be obtained here.
f1 <- "ftp://e4ftl01.cr.usgs.gov/MOLT/MOD13Q1.005/2005.08.13/MOD13Q1.A2005225.h20v11.005.2008213005356.hdf"
f2 <- "ftp://e4ftl01.cr.usgs.gov/MOLT/MOD13Q1.005/2005.08.13/MOD13Q1.A2005225.h20v12.005.2008213055406.hdf"
download.file(f1, destfile = paste(testpath, BLOCK1, sep = ""))
download.file(f2, destfile = paste(testpath, BLOCK2, sep = ""))
If you want to try and recreate what I have done, the HEGtool for
MODIS is here:
# Download for HEGtool, should you want to use it
http://newsroom.gsfc.nasa.gov/sdptoolkit/HEG/HEGDownload.html
And then the code I used to process the data together with the HEGtool
follows.
# Conversion code
#ModStitch <- function(hegpath, modnames, cropimage) {
ModStitch <- function(hegpath, modnames) {
# Uses the HEGtool from MODIS LPDAAC to read in, stitch, and reproject
the MODIS NDVI and VI quality bands
# References: http://spatial-analyst.net/book/MODIS_download_HR.R
# Args:
# modpath: Path to directory holding MODIS data
# hegpath: Path to the HEGtool installation
# modnames: Vector containing MODIS image names to process
# ###crop image: A raster defining the extent to which the images
should be resized
# Returns:
# Separate stitched MODIS NDVI and VI Quality bands, reprojected to
Albers Equal Area conic (for South
# Africa), saved as a GEOtiff
library(raster)
# Set tool and environment variables
hegtool <- paste(hegpath, "/heg/bin/hegtool", sep = "")
grd.stitch.tool <- paste(hegpath, "/heg/bin/subset_stitch_grid", sep = "")
pgs.loc <- paste(hegpath, "/heg/TOOLKIT_MTD", sep = "")
mrt.data.loc <- paste(hegpath, "/heg/data", sep = "")
Sys.setenv(PGSHOME = pgs.loc) # Environment variable for HEGtool
Sys.setenv(MRTDATADIR = mrt.data.loc) # Environment variable for HEGtool
# Set path to MODIS data directory
#setwd(modpath)
# And process the specified MODIS images using hegtool to capture
header file information
mod.list <- vector("list", length(modnames)) # List to capture
header file output
# Call crop image
#crop.img <- raster(cropimage)
# Create and capture HegHdr.hdr files
for (i in 1:length(mod.list)) {
system(paste(hegtool, "-h", modnames[i]), intern = FALSE, wait = TRUE)
mod.list[[i]] <- scan("HegHdr.hdr", what = "character", sep = "\n",)
names(mod.list)[i] <- modnames[i]
}
# Then stitch and reproject both the NDVI layers and the error flag layers
# Set up a couple of variables
which.var <- c("250m 16 days NDVI|", "250m 16 days VI Quality|")
which.abb <- c("NDVI", "qual")
for(k in 1:length(which.var)) { # Loop through NDVI, then VI
# First write the stitch parameters file
# Stitch parameter file name
pr.name <- paste("stitch_", k, ".prm", sep = "") # 1 = stitch
for NDVI, 2 for VI quality
out.name <- paste(substr(modnames[1], 1, 23), ".mosaic.",
which.abb[k],".tif", sep = "")
# Open connection to write stitch file
filename <- file(pr.name, open = "wt")
write("", filename, append = TRUE)
write("NUM_RUNS = 1", filename, append = TRUE) # Not sure if this
needs to be a variable
write("", filename, append = TRUE)
write("BEGIN", filename, append = TRUE)
write("NUMBER_INPUTFILES = 2",filename, append = TRUE) # Alter
this if more than 1 file is to be stitched
write(paste("INPUT_FILENAMES = ", modnames[1], "|", modnames[2],
sep = ""), filename, append = TRUE)
write("OBJECT_NAME = MODIS_Grid_16DAY_250m_500m_VI|", filename,
append = TRUE)
write(paste("FIELD_NAME = ", which.var[k], sep = ""), filename,
append = TRUE)
write("BAND_NUMBER = 1", filename, append = TRUE)
# Pulls coordinates for upper left from first header file (turn on
if want the whole image)
write(paste("SPATIAL_SUBSET_UL_CORNER = ", "( ",
substr(mod.list[[1]][grep("GRID_UL_CORNER_LATLON=",
mod.list[[1]])], 23, 48), " )", sep = ""),
filename, append = TRUE)
# Specified upper left corner pair (UL -21.74814913, 22.82538048)
#write("SPATIAL_SUBSET_UL_CORNER = ( -21.74814913 22.82538048 )",
filename, append = TRUE)
# Pulls coordinates for lower right from last header file (turn
this on if you want entire image)
write(paste("SPATIAL_SUBSET_LR_CORNER = ", "( ",
substr(mod.list[[length(mod.list)]][grep("GRID_LR_CORNER_LATLON=",
mod.list[[length(mod.list)]])], 23, 48), " )", sep = ""),
filename, append = TRUE)
# Specified lower right coordinate pair (LR -34.22328403, 33.19532794)
#write("SPATIAL_SUBSET_LR_CORNER = ( -34.22328403 33.19532794 )",
filename, append = TRUE)
write("OUTPUT_OBJECT_NAME = MODIS_Grid_16DAY_250m_500m_VI|",
filename, append = TRUE)
write(paste("OUTGRID_X_PIXELSIZE = ",
substr(mod.list[[1]][grep("GRID_PIXEL_SIZE=",
mod.list[[1]])], 17, 26), sep = ""),
filename, append = TRUE)
write(paste("OUTGRID_Y_PIXELSIZE = ",
substr(mod.list[[1]][grep("GRID_PIXEL_SIZE=",
mod.list[[1]])], 17, 26), sep = ""),
filename, append = TRUE)
write(paste("OUTPUT_FILENAME = ", out.name, sep = ""), filename,
append = TRUE)
write("SAVE_STITCHED_FILE = NO", filename, append = TRUE)
write(paste("OUTPUT_STITCHED_FILENAME = sasquatch", k, ".hdf", sep
= ""), filename, append = TRUE)
write("OUTPUT_TYPE = GEO", filename, append = TRUE)
write("RESAMPLING_TYPE = NN", filename, append = TRUE)
write("OUTPUT_PROJECTION_TYPE = ALBERS", filename, append = TRUE)
write("OUTPUT_PROJECTION_PARAMETERS = ( 0.0 0.0 -18.0 -32.0 24.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 )",
filename, append = TRUE)
write("END", filename, append = TRUE)
write("", filename, append = TRUE)
close(filename)
# Then call the stitch tool and process it
stitch.com <- paste(grd.stitch.tool, "-P", pr.name)
system(stitch.com) # Works
# Turning this off for now because it appears to be shifting the
output image by referencing the center of
# the pixel.
# Then use Raster function to resize because subsetting with MODIS
tool results in offset
#to.crop <- raster(out.name)
#cropped <- crop(to.crop, crop.img, filename = out.name, overwrite
= TRUE) # Overwrites existing images
# Try trim the image instead (doesn't work')
#to.trim <- raster(out.name)
#NAvalue(to.trim) <- -1 # Define NA values as less than 0
#print(paste("Starting raster trim for", which.var[k]))
#out.name2 <- paste("trim", out.name, sep = "")
#trim(to.trim, filename = out.name2, overwrite = TRUE, format = "GTiff")
#print(paste("Finished raster trim for", which.var[k]))
} # Close loop
} # End function
setwd(testpath) # Set to directory where MODIS imagery is.
ModStitch(hegpath = hegpath, modnames = modnames) # Crop component turned off
Many thanks, and I look forward to hearing what you find.
Cheers, Lyndon
--
Lyndon Estes
Research Associate
Woodrow Wilson School
Princeton University
+1-609-258-2392 (o)
+1-609-258-6082 (f)
+1-202-431-0496 (m)
lestes at princeton.edu
More information about the R-sig-Geo
mailing list