{"id":390,"date":"2012-02-18T23:44:07","date_gmt":"2012-02-19T03:44:07","guid":{"rendered":"http:\/\/web.colby.edu\/mgimond\/?p=390"},"modified":"2012-02-18T23:45:17","modified_gmt":"2012-02-19T03:45:17","slug":"r-compute-ndvi-from-landsat-images","status":"publish","type":"post","link":"https:\/\/web.colby.edu\/mgimond\/2012\/02\/18\/r-compute-ndvi-from-landsat-images\/","title":{"rendered":"R: Compute NDVI from Landsat images"},"content":{"rendered":"<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n# PURPOSE: Automate the computation of NDVI values from Landsat images\r\n# retrieved from \u00a0http:\/\/earthexplorer.usgs.gov.\r\n# Radiance and reflectance formulas provided by the Landsat Handbook\r\n# (http:\/\/landsathandbook.gsfc.nasa.gov\/data_prod\/prog_sect11_3.html)\r\n#\r\nlibrary(raster)\r\n\r\n### Function computes fraction of mean distance to sun (adopted from 'Landsat' R package)\r\nSdist = function (adate)\r\n {\r\n edist &lt;- julian(as.Date(adate), origin = as.Date(paste(substring(adate,\r\n 1, 4), &quot;12&quot;, &quot;31&quot;, sep = &quot;-&quot;)))[[1]]\r\n edist &lt;- 1 - 0.016729 * cos((2 * pi) * (0.9856 * (edist -\r\n 4)\/360))\r\n edist\r\n }\r\n### End function\r\n\r\n# Some constants\r\nE.red = 1551 # Red solar spectral irradiance\r\nE.nir = 1044 # NIR solar spectral irradiance\r\n\r\n# Get list of landsat metadata files in directory\r\nflist &lt;- list.files(pattern = &quot;MTL\\\\.txt$&quot;)\r\n\r\n# Loop through each file in list\r\nfor (i in 1:length(flist) ){\r\n\r\n# Open metadata file\r\n inFile = read.delim(flist[i],header=F,sep=&quot;=&quot;, stringsAsFactors=F)\r\n inFile$V1 = gsub(' +', '', inFile$V1) # Remove spaces from 1st column\r\n\r\n# Extract parameters from metadata file\r\n sun.elev = as.numeric(inFile$V2[inFile$V1 == &quot;SUN_ELEVATION&quot;]) * pi \/ 180 # Solar elevation in radians\r\n lmax.red = as.numeric(inFile$V2[inFile$V1 == &quot;LMAX_BAND3&quot;])\r\n lmin.red = as.numeric(inFile$V2[inFile$V1 == &quot;LMIN_BAND3&quot;])\r\n lmax.nir = as.numeric(inFile$V2[inFile$V1 == &quot;LMAX_BAND4&quot;])\r\n lmin.nir = as.numeric(inFile$V2[inFile$V1 == &quot;LMIN_BAND4&quot;])\r\n Qmax.red = as.numeric(inFile$V2[inFile$V1 == &quot;QCALMAX_BAND3&quot;])\r\n Qmin.red = as.numeric(inFile$V2[inFile$V1 == &quot;QCALMIN_BAND3&quot;])\r\n Qmax.nir = as.numeric(inFile$V2[inFile$V1 == &quot;QCALMAX_BAND4&quot;])\r\n Qmin.nir = as.numeric(inFile$V2[inFile$V1 == &quot;QCALMIN_BAND4&quot;])\r\n L.date = inFile$V2[inFile$V1 == &quot;ACQUISITION_DATE&quot;]\r\n L.date = gsub(' +', '', L.date) # Remove leading space\r\n file.red = inFile$V2[inFile$V1 == &quot;BAND3_FILE_NAME&quot;]\r\n file.nir = inFile$V2[inFile$V1 == &quot;BAND4_FILE_NAME&quot;]\r\n\r\n# Open raster layers\r\n red = raster(file.red)\r\n nir = raster(file.nir)\r\n\r\n# Compute Radiance (L)\r\n red.L = (lmax.red - lmin.red)\/(Qmax.red - Qmin.red) * (red - Qmin.red) + lmin.red\r\n nir.L = (lmax.nir - lmin.nir)\/(Qmax.nir - Qmin.nir) * (nir - Qmin.nir) + lmin.nir\r\n\r\n# Compute Reflectance (R)\r\n red.R = (pi * red.L * Sdist(L.date)^2) \/ (E.red * cos(sun.elev))\r\n nir.R = (pi * nir.L * Sdist(L.date)^2) \/ (E.nir * cos(sun.elev))\r\n\r\n# Compute NDVI\r\n NDVI = (nir.R - red.R) \/ (nir.R + red.R)\r\n\r\n# Save NDVI raster to file\r\n outFile = paste(&quot;NDVI_&quot;,L.date,&quot;.img&quot;,sep=&quot;&quot;)\r\n writeRaster(NDVI,filename=outFile,format=&quot;HFA&quot;, overwrite=F)\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1199,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[12807,12812,12808],"tags":[12810],"_links":{"self":[{"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/posts\/390"}],"collection":[{"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/users\/1199"}],"replies":[{"embeddable":true,"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/comments?post=390"}],"version-history":[{"count":7,"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/posts\/390\/revisions"}],"predecessor-version":[{"id":396,"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/posts\/390\/revisions\/396"}],"wp:attachment":[{"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/media?parent=390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/categories?post=390"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/web.colby.edu\/mgimond\/wp-json\/wp\/v2\/tags?post=390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}