The thermal infrared bands of Landsat-8 is permit to estimate land surface temperature. In this case we will calculate the land surface temperature in Kryvyi Rih and nearest areas. For calculation we will use 10th band of Landsat’s image. For this example I use image from July 15th 2016. In that day the sky was very clearly above the Kryvyi Rih. Also in that day the meteorologycal station near the Kryvyi Rih reported that air temperature is 33 Celsium degrees (in time of imaging). Where is practical examples of using similar methodics? For example post “Hell shopping areas” on my blog “DataStory”.

For image processing we will use raster and RStollbox packages. The Kryvyi Rih area polygon I get from OpenStreetMap shapefiles.

library(raster)
library(RStoolbox)
#set a temporary data directory for large graphical objects
rasterOptions(tmpdir = "/home/geka/TEMP_R/")
#! You must have a large free space on your hard disk
#because we will get several large raster objects
metaData <- readMeta("./LC81790272016197LGN00/LC81790272016197LGN00_MTL.txt")
lsat8 <- stackMeta("./LC81790272016197LGN00/LC81790272016197LGN00_MTL.txt")
hazeDN    <- estimateHaze(lsat8, hazeBands = c("B3_dn", "B4_dn"),
                          darkProp = 0.01)
lsat8_sdos <- radCor(lsat8, metaData = metaData,
                     hazeValues = hazeDN,
                     hazeBands = c("B3_dn", "B4_dn"),
                     method = "sdos")
lsat8_sdos
class       : RasterStack 
dimensions  : 7991, 7861, 62817251, 10  (nrow, ncol, ncell, nlayers)
resolution  : 30, 30  (x, y)
extent      : 359085, 594915, 5134785, 5374515  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=36 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
names       :   B1_sre,   B2_sre,   B3_sre,   B4_sre,   B5_sre,   B6_sre,   B7_sre,  B9_sre,   B10_bt,   B11_bt 
min values  :   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,       ?, 147.5171, 141.6706 
max values  :   1.0000,   1.0000,   1.0000,   1.0000,   1.0000,   1.0000,   1.0000,       ?, 368.0307, 366.6090 
KrR_shape <- shapefile("KrR_32636.shp")
plotRGB(lsat8_sdos, r = 4, g = 3, b = 2, stretch = "hist")
plot(KrR_shape, lwd = 2, col = "red", add = TRUE)

lsat8_sdos.KrR <- crop(lsat8_sdos, KrR_shape)
no non-missing arguments to min; returning Infno non-missing arguments to max; returning -Infno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Infno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Infno non-missing arguments to min; returning Infno non-missing arguments to max; returning -InfNAs introduced by coercionNAs introduced by coercion
plotRGB(lsat8_sdos.KrR, r = 4, g = 3, b = 2, stretch = "hist")
plot(KrR_shape, lwd = 2, col = "red", add = TRUE)

For calculating of surface temperature we use formula:

\(LST(°C) = Bt/[1 + (w * Bt/p) * ln(e)] - 273.15\)

Where:

\(e = 0.017 * PV + 0.963\)

In formula of electromagnetic emissivity \(PV\) is “Proportion of Vegetation”. For \(PV\) calculation is used the NDVI.

\(PV = [(NDVI - NDVI_{min}) / (NDVI_{max} - NDVI_{min})]^2\)
lsat8.ndvi <- spectralIndices(lsat8_sdos.KrR, red = "B4_sre", nir = "B5_sre", indices = "NDVI")
plot(lsat8.ndvi)

lsat8.ndvi
class       : RasterLayer 
dimensions  : 2029, 1139, 2311031  (nrow, ncol, ncell)
resolution  : 30, 30  (x, y)
extent      : 510465, 544635, 5277495, 5338365  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=36 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : in memory
names       : NDVI 
values      : -0.3736169, 0.9435266  (min, max)
lsat8.PV <- ((lsat8.ndvi - (-0.3736169)) / (0.9435266 + (-0.3736169)))^2
plot(lsat8.PV)

lsat8.emissiv <- 0.017 * lsat8.PV + 0.963
lsat8.emissiv
class       : RasterLayer 
dimensions  : 2029, 1139, 2311031  (nrow, ncol, ncell)
resolution  : 30, 30  (x, y)
extent      : 510465, 544635, 5277495, 5338365  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=36 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : in memory
names       : NDVI 
values      : 0.963, 1.053804  (min, max)
lsat8.LST <- lsat8_sdos.KrR$B10_bt / (1 + 10.8 * (lsat8_sdos.KrR$B10_bt/14388) * log(lsat8.emissiv)) - 273.15
lsat8.LST
class       : RasterLayer 
dimensions  : 2029, 1139, 2311031  (nrow, ncol, ncell)
resolution  : 30, 30  (x, y)
extent      : 510465, 544635, 5277495, 5338365  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=36 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : in memory
names       : layer 
values      : 22.11561, 53.92095  (min, max)
plot(lsat8.LST)

writeRaster(lsat8.LST$layer, "lsat8_LST.sdat", format = "SAGA", overwrite = TRUE)
class       : RasterLayer 
dimensions  : 2029, 1139, 2311031  (nrow, ncol, ncell)
resolution  : 30, 30  (x, y)
extent      : 510465, 544635, 5277495, 5338365  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : /home/geka/Documents/RPubs/UrbanWarm/lsat8_LST.sgrd 
names       : layer 
values      : 22.11561, 53.92095  (min, max)
LS0tCnRpdGxlOiAiU3VyZmFjZSB0ZW1wZXJhdHVyZSBlc3RpbWF0aW5nIHdpdGggTGFuZHNhdC04IGltYWdlcyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpUaGUgdGhlcm1hbCBpbmZyYXJlZCBiYW5kcyBvZiBMYW5kc2F0LTggaXMgcGVybWl0IHRvIGVzdGltYXRlIGxhbmQgc3VyZmFjZSB0ZW1wZXJhdHVyZS4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgY2FsY3VsYXRlIHRoZSBsYW5kIHN1cmZhY2UgdGVtcGVyYXR1cmUgaW4gW0tyeXZ5aSBSaWhdKGh0dHBzOi8vZ29vLmdsL21hcHMvZEVwWGk1alBDckcyKSBhbmQgbmVhcmVzdCBhcmVhcy4gRm9yIGNhbGN1bGF0aW9uIHdlIHdpbGwgdXNlIDEwdGggYmFuZCBvZiBMYW5kc2F0J3MgaW1hZ2UuCkZvciB0aGlzIGV4YW1wbGUgSSB1c2UgaW1hZ2UgZnJvbSBKdWx5IDE1dGggMjAxNi4gSW4gdGhhdCBkYXkgdGhlIHNreSB3YXMgdmVyeSBjbGVhcmx5IGFib3ZlIHRoZSBLcnl2eWkgUmloLiBBbHNvIGluIHRoYXQgZGF5IHRoZSBtZXRlb3JvbG9neWNhbCBzdGF0aW9uIG5lYXIgdGhlIEtyeXZ5aSBSaWggcmVwb3J0ZWQgIHRoYXQgYWlyIHRlbXBlcmF0dXJlIGlzIDMzIENlbHNpdW0gZGVncmVlcyAoaW4gdGltZSBvZiBpbWFnaW5nKS4gV2hlcmUgaXMgcHJhY3RpY2FsIGV4YW1wbGVzIG9mIHVzaW5nIHNpbWlsYXIgbWV0aG9kaWNzPyBGb3IgZXhhbXBsZSBwb3N0IFsiSGVsbCBzaG9wcGluZyBhcmVhcyJdKGh0dHA6Ly93d3cuZGF0YXN0b3J5Lm9yZy51YS8/cD0xMTY4KSBvbiBteSBibG9nIFsiRGF0YVN0b3J5Il0oaHR0cDovL3d3dy5kYXRhc3Rvcnkub3JnLnVhLykuCgpGb3IgaW1hZ2UgcHJvY2Vzc2luZyB3ZSB3aWxsIHVzZSAqKnJhc3RlcioqIGFuZCAqKlJTdG9sbGJveCoqIHBhY2thZ2VzLiBUaGUgS3J5dnlpIFJpaCBhcmVhIHBvbHlnb24gSSBnZXQgZnJvbSBPcGVuU3RyZWV0TWFwIHNoYXBlZmlsZXMuCgpgYGB7cn0KbGlicmFyeShyYXN0ZXIpCmxpYnJhcnkoUlN0b29sYm94KQojc2V0IGEgdGVtcG9yYXJ5IGRhdGEgZGlyZWN0b3J5IGZvciBsYXJnZSBncmFwaGljYWwgb2JqZWN0cwpyYXN0ZXJPcHRpb25zKHRtcGRpciA9ICIvaG9tZS9nZWthL1RFTVBfUi8iKQojISBZb3UgbXVzdCBoYXZlIGEgbGFyZ2UgZnJlZSBzcGFjZSBvbiB5b3VyIGhhcmQgZGlzawojYmVjYXVzZSB3ZSB3aWxsIGdldCBzZXZlcmFsIGxhcmdlIHJhc3RlciBvYmplY3RzCmBgYAoKYGBge3J9Cm1ldGFEYXRhIDwtIHJlYWRNZXRhKCIuL0xDODE3OTAyNzIwMTYxOTdMR04wMC9MQzgxNzkwMjcyMDE2MTk3TEdOMDBfTVRMLnR4dCIpCmxzYXQ4IDwtIHN0YWNrTWV0YSgiLi9MQzgxNzkwMjcyMDE2MTk3TEdOMDAvTEM4MTc5MDI3MjAxNjE5N0xHTjAwX01UTC50eHQiKQpgYGAKCmBgYHtyfQpoYXplRE4gICAgPC0gZXN0aW1hdGVIYXplKGxzYXQ4LCBoYXplQmFuZHMgPSBjKCJCM19kbiIsICJCNF9kbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhcmtQcm9wID0gMC4wMSkKYGBgCgpgYGB7cn0KbHNhdDhfc2RvcyA8LSByYWRDb3IobHNhdDgsIG1ldGFEYXRhID0gbWV0YURhdGEsCiAgICAgICAgICAgICAgICAgICAgIGhhemVWYWx1ZXMgPSBoYXplRE4sCiAgICAgICAgICAgICAgICAgICAgIGhhemVCYW5kcyA9IGMoIkIzX2RuIiwgIkI0X2RuIiksCiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJzZG9zIikKYGBgCgpgYGB7cn0KbHNhdDhfc2RvcwpgYGAKCmBgYHtyfQpLclJfc2hhcGUgPC0gc2hhcGVmaWxlKCJLclJfMzI2MzYuc2hwIikKYGBgCgpgYGB7cn0KcGxvdFJHQihsc2F0OF9zZG9zLCByID0gNCwgZyA9IDMsIGIgPSAyLCBzdHJldGNoID0gImhpc3QiKQpwbG90KEtyUl9zaGFwZSwgbHdkID0gMiwgY29sID0gInJlZCIsIGFkZCA9IFRSVUUpCmBgYAoKCgpgYGB7cn0KbHNhdDhfc2Rvcy5LclIgPC0gY3JvcChsc2F0OF9zZG9zLCBLclJfc2hhcGUpCmBgYAoKYGBge3J9CnBsb3RSR0IobHNhdDhfc2Rvcy5LclIsIHIgPSA0LCBnID0gMywgYiA9IDIsIHN0cmV0Y2ggPSAiaGlzdCIpCnBsb3QoS3JSX3NoYXBlLCBsd2QgPSAyLCBjb2wgPSAicmVkIiwgYWRkID0gVFJVRSkKYGBgCgpGb3IgY2FsY3VsYXRpbmcgb2Ygc3VyZmFjZSB0ZW1wZXJhdHVyZSB3ZSB1c2UgZm9ybXVsYToKCjxjZW50ZXI+JExTVCjCsEMpID0gQnQvWzEgKyAodyAqIEJ0L3ApICogbG4oZSldIC0gMjczLjE1JDwvY2VudGVyPgoKV2hlcmU6CgotICRCdCQgaXMgQXQgc2F0ZWxsaXRlIHRlbXBlcmF0dXJlCgotICR3JCBpcyB3YXZlbGVuZ3RoIG9mIGVtaXR0ZWQgcmFkaWFuY2UKCi0gJHAkIGlzICRoICogYy9zJCwgd2hlcmUgJGgkIGlzIFBsYW5jJ3MgY29uc3RhbnQsICRjJCBpcyB2ZWxvY2l0eSBvZiBsaWdodCwgJHMkIGlzIEJvbHR6bWFubiBjb25zdGFudC4gJHAkIGlzIGVxdWFsIHRvIDE0Mzg4CgotICRlJCBpcyBlbGVjdHJvbWFnbmV0aWMgZW1pc3Npdml0eS4gRm9yIHVyYmFuIGFyZWFzIEkgdXNlIGZvcm11bGEgZnJvbSBbU3RhdGhvcG9sb3UgKDIwMDcpXShodHRwOi8vZHguZG9pLm9yZy8xMC4xMDgwLzAxNDMxMTYwNjAwOTkzNDIxKToKCjxjZW50ZXI+JGUgPSAwLjAxNyAqIFBWICsgMC45NjMkPC9jZW50ZXI+CgpJbiBmb3JtdWxhIG9mIGVsZWN0cm9tYWduZXRpYyBlbWlzc2l2aXR5ICRQViQgaXMgIlByb3BvcnRpb24gb2YgVmVnZXRhdGlvbiIuIEZvciAkUFYkIGNhbGN1bGF0aW9uIGlzIHVzZWQgdGhlIE5EVkkuCgo8Y2VudGVyPiRQViA9IFsoTkRWSSAtIE5EVklfe21pbn0pIC8gKE5EVklfe21heH0gLSBORFZJX3ttaW59KV1eMiQ8L2NlbnRlcj4KCmBgYHtyfQpsc2F0OC5uZHZpIDwtIHNwZWN0cmFsSW5kaWNlcyhsc2F0OF9zZG9zLktyUiwgcmVkID0gIkI0X3NyZSIsIG5pciA9ICJCNV9zcmUiLCBpbmRpY2VzID0gIk5EVkkiKQpgYGAKCmBgYHtyfQpwbG90KGxzYXQ4Lm5kdmkpCmBgYAoKYGBge3J9CmxzYXQ4Lm5kdmkKYGBgCgpgYGB7cn0KbHNhdDguUFYgPC0gKChsc2F0OC5uZHZpIC0gKC0wLjM3MzYxNjkpKSAvICgwLjk0MzUyNjYgKyAoLTAuMzczNjE2OSkpKV4yCmBgYAoKYGBge3J9CnBsb3QobHNhdDguUFYpCmBgYAoKYGBge3J9CmxzYXQ4LmVtaXNzaXYgPC0gMC4wMTcgKiBsc2F0OC5QViArIDAuOTYzCmBgYAoKYGBge3J9CmxzYXQ4LmVtaXNzaXYKYGBgCgpgYGB7cn0KbHNhdDguTFNUIDwtIGxzYXQ4X3Nkb3MuS3JSJEIxMF9idCAvICgxICsgMTAuOCAqIChsc2F0OF9zZG9zLktyUiRCMTBfYnQvMTQzODgpICogbG9nKGxzYXQ4LmVtaXNzaXYpKSAtIDI3My4xNQpgYGAKCmBgYHtyfQpsc2F0OC5MU1QKYGBgCgpgYGB7cn0KcGxvdChsc2F0OC5MU1QpCmBgYAoKCmBgYHtyfQp3cml0ZVJhc3Rlcihsc2F0OC5MU1QkbGF5ZXIsICJsc2F0OF9MU1Quc2RhdCIsIGZvcm1hdCA9ICJTQUdBIiwgb3ZlcndyaXRlID0gVFJVRSkKYGBgCg==