Land Surface Temperature with ArcGIS Pro & Google Earth Engine (JavaScript)

☁️ Ümit Eroğlu 🌍🛰
Earth Observation Today
6 min readFeb 27, 2024
Land Surface Temperature — Çanakkale / Türkiye

Examination of Land Surface Temperature Changes

Çanakkale / Türkiye (2013 & 2023)

In this study, the surface temperature changes in Çanakkale province for the years 2013 & 2023 were examined using Landsat thermal data through various methods. Formulas such as NDVI, Top of Atmosphere, Brightness Temperature, Proportional Vegetation, & Land Surface Temperature were utilized. The findings indicate that the data derived from thermal images, especially Land Surface Temperature (LST), is a significant resource for land interpretation.

Study Area: Çanakkale — Türkiye (Turkey)
Method/Approach: Satellite image analysis from different seasons using ArcGIS program & Google Earth Engine.
Source: Landsat, 8–9 OLI/TIRS C2 L2 — Satellite Images obtained from the USGS Earth Explorer Website.

USGS Earth Explorer
Landsat 8

Geographical Location & General Information

Çanakkale, located in the southern part of the Marmara Region, holds a strategic geographical position with its proximity to metropolises such as Istanbul, Bursa, and Izmir. It is situated on both sides of the Çanakkale Strait, a key point connecting the continents of Asia & Europe, and possesses transit routes between these two continents, making it strategically important. With coastlines on both the Marmara and Aegean Seas, Çanakkale is among the six provinces in Turkey that have access to two seas.

Location
Landsat Satellite Image

Downloading USGS Data

Downloading USGS Data

We download USGS Data (Band 4, Band 5 & Band 10) for our selected Area Of Interest. (AOI)

Raw Landsat Data Band 4 (Contrast changed for better view)

Raster Calculation with ArcGIS Pro’s Geoprocessing Tool

ArcGIS Pro

https://pro.arcgis.com

Calculation of Land Surface Temperature Data

1 — Normalized Difference Vegetation Index (NDVI)
2 — Top of Atmosphere & Brightness Temperature (TOA & BT)
3 — Proportional Vegetation (Pv)
4 — Emissivity (e)
5 — Land Surface Temperature (LST / YYS)

Formulas

The formulas were calculated individually using the raster calculation method in ArcGIS Pro’s Geoprocessing tool & then combined.

NDVI, Top of Atmosphere, Brightness Temperature, Proportional Vegetation, & Land Surface Temperature
ArcGIS Pro’s Geoprocessing Tool

Maps

Normalized Difference Vegetation Index (NDVI)

NDVI / July–2013
NDVI / October–2013
NDVI / July–2023
NDVI / November–2023

Land Surface Temperature (LST)

LST / July–2013
LST / October–2013
LST / July–2023
LST / November–2023

Calculation with Google Earth Engine Application

Google Earth Engine

The formulas were recalculated using the Google Earth Engine application with the JavaScript programming language. This method requires separate code for each layer & operation, including:

1 — Entering the coordinates of the study area.
2 — Cloud removal.
3 — Filtering Landsat data based on date & area.
4 — Calculating NDVI statistics.
5 — Calculating Vegetation Ratio, Urban Heat Island, & Surface Temperature.

Google Earth Engine Application

JavaScript Code For The Calculation

Coordinates

// Area Of Interest 

var aoi = ee.Geometry.Polygon(
[[[26.380920, 40.159207],
[26.380920, 40.159207],
[26.404817, 40.154990],
[26.404817, 40.154990]]]);
var startDate = '2023-05-01'
var endDate = '2023-12-31'

Scale Factors

// Applies scaling factors 

function applyScaleFactors(image) {
var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
return image.addBands(opticalBands, null, true)
.addBands(thermalBands, null, true);
}

Mask Clouds & Cloud Shadows

// Cloud mask 

function maskL8sr(col) {
// Bits 3 and 5 are cloud shadow and cloud, respectively.
var cloudShadowBitMask = (1 << 3);
var cloudsBitMask = (1 << 5);
// Get the pixel QA band.
var qa = col.select('QA_PIXEL');
// Both flags should be set to zero, indicating clear conditions.
var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
.and(qa.bitwiseAnd(cloudsBitMask).eq(0));
return col.updateMask(mask);
}

Filter Landsat Image Collection

// Filter the collection, first by the aoi, and then by date.

var image = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterDate(startDate, endDate)
.filterBounds(aoi)
.map(applyScaleFactors)
.map(maskL8sr)
.median();

var visualization = {
bands: ['SR_B4', 'SR_B3', 'SR_B2'],
min: 0.0,
max: 0.3,
};

Map.addLayer(image, visualization, 'True Color (432)', false);

NDVI Layer

// NDVI

var ndvi = image.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI')
Map.addLayer(ndvi, {min:-1, max:1, palette: ['blue', 'white', 'green']}, 'ndvi', false)

NDVI Statistics

// ndvi statistics

var ndvi_min = ee.Number(ndvi.reduceRegion({
reducer: ee.Reducer.min(),
geometry: aoi,
scale: 30,
maxPixels: 1e9
}).values().get(0))

var ndvi_max = ee.Number(ndvi.reduceRegion({
reducer: ee.Reducer.max(),
geometry: aoi,
scale: 30,
maxPixels: 1e9
}).values().get(0))

Thermal Bands, Land Surface Temperature & Color Palette

var fv = (ndvi.subtract(ndvi_min).divide(ndvi_max.subtract(ndvi_min))).pow(ee.Number(2))
.rename('FV')

var em = fv.multiply(ee.Number(0.004)).add(ee.Number(0.986)).rename('EM')

var thermal = image.select('ST_B10').rename('thermal')

var lst = thermal.expression(
'(tb / (1 + (0.00115 * (tb/0.48359547432)) * log(em))) - 273.15',
{'tb':thermal.select('thermal'),
'em': em}).rename('LST')

var lst_vis = {
min: 25,
max: 50,
palette: [
'040274', '040281', '0502a3', '0502b8', '0502ce', '0502e6',
'0602ff', '235cb1', '307ef3', '269db1', '30c8e2', '32d3ef',
'3be285', '3ff38f', '86e26f', '3ae237', 'b5e22e', 'd6e21f',
'fff705', 'ffd611', 'ffb613', 'ff8b13', 'ff6e08', 'ff500d',
'ff0000', 'de0101', 'c21301', 'a71001', '911003']
}

Map.addLayer(lst, lst_vis, 'LST AOI')
Map.centerObject(aoi, 10)

UHI — Urban Heat Island

// Urban Heat Island 

//1. Normalized UHI

var lst_mean = ee.Number(lst.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: aoi,
scale: 30,
maxPixels: 1e9
}).values().get(0))

var lst_std = ee.Number(lst.reduceRegion({
reducer: ee.Reducer.stdDev(),
geometry: aoi,
scale: 30,
maxPixels: 1e9
}).values().get(0))

print('Mean LST in AOI', lst_mean)
print('STD LST in AOI', lst_std)

var uhi = lst.subtract(lst_mean).divide(lst_std).rename('UHI')

var uhi_vis = {
min: -4,
max: 4,
palette:['313695', '74add1', 'fed976', 'feb24c', 'fd8d3c', 'fc4e2a', 'e31a1c',
'b10026']
}
Map.addLayer(uhi, uhi_vis, 'UHI AOI')

// Urban Thermal Field variance Index (UTFVI)

var utfvi = lst.subtract(lst_mean).divide(lst).rename('UTFVI')
var utfvi_vis = {
min: -1,
max: 0.3,
palette:['313695', '74add1', 'fed976', 'feb24c', 'fd8d3c', 'fc4e2a', 'e31a1c',
'b10026']
}
Map.addLayer(utfvi, utfvi_vis, 'UTFVI AOI')

Maps

Satellite
NDVI
Land Surface Temperature
Urban Heat Island

Conclusion

Generally, where NDVI index increases, Land Surface Temperature decreases. Areas with increased green vegetation absorb heat, resulting in lower temperatures compared to non-vegetated areas.

Especially, Urban Heat Island formation is dependent on factors beyond temperature alone, making it difficult to reach a conclusive result solely through satellite observations. Combining local station & satellite data leads to better results in research.

High urbanization in certain areas and the intertwining of land cover density negatively impact the overall success of the analyses.

The obtained thermal data & the resulting Land Surface Temperature values are crucial sources for interpreting temporal changes.

The use of Landsat satellite data is possible in land surface temperature studies (such as risk analyses, urban heat island effects, global warming effects, etc.).

References:

ArcGIS Pro 3 Software
Google Earth Engine Software
Google Earth Engine Landsat Data Set
Earth Explorer, Usgs Website Landsat Data
Index Database Website
Landsat 8 (L8) Data Handbook

--

--