Land Surface Temperature (LST) Data Extraction

Elian Wira Sena
5 min readJun 19


How to extract Land Surface Temperature ( LST ) data from Google Earth Engine using Google Colab

Temperature visualization

This notebook will guide you to extracting land surface temperature data from the Google Earth Engine. Google Colab is used to deal with this process.

The goal is to be able to provide temperature data for the next process, such as forecasting temperatures in the future, or to combine it with other data for other studies.

First step

Data understanding

We need to choose which remote sensing data we want to use. We could see all the details and descriptions of data from this Earth Engine data catalog.

to make it easier, we can write which data we are looking for. In this notebook, we will focus on Land Surface Temperature.

We will use MOD11A1.061 Terra Land Surface Temperature and Emissivity Daily Global 1km. This Data was provided by NASA LP DAAC at the USGS EROS Center, data available from 2000–02–24 to 2023–06–15.

The resolution for this data is 1000 meters, and the unit temperature is in Kelvin. We will take this band to get temperature information during the day. we could also combine with other bands to get full-day temperature, but in this notebook, we are focusing on daytime temperature.

Second step

Data Extraction

To work with the google earth engine, we need to initialize the API

import ee

# Trigger the authentication flow.

# Initialize the library.

The result of that will tell you how to use your account to give this notebook access to Earth Engine.

since we want to explore LST from Modis Terra Satelite, so we need to import the data.

you need the Earth engine snippet. it is like an id which data catalog from the Earth engine we want to work for.

you might see ee.ImageCollection and ee.Image in this snippet. The differences is :

Images that are like features but may include several bands.

Collections are groups of features or images.

now we import the data :

# Import the MODIS LST collection.
lst = ee.ImageCollection('MODIS/061/MOD11A1')

now we put our focus : (duration and band of interest)

we are focused only for 1 year from 2022 -2023

# Initial date of interest (inclusive).
i_date = '2022-01-01'

# Final date of interest (exclusive).
f_date = '2023-01-01'

# Selection of appropriate bands and dates for LST.
band ='LST_Day_1km', 'QC_Day').filterDate(i_date, f_date)

now we put our focus : (location of interest)

we can take a look at the coordinates on Google or google maps

# Define the urban location of interest as a point.
# We gonna use hamburg location
Hamburg_lon = 9.993682
Hamburg_lat = 53.551086
Hamburg_point = ee.Geometry.Point(Hamburg_lon, Hamburg_lat)

now time to extract the data :

we will try to calculate and print the mean value of the LST collection at our interest point and convert from kelvin to celcius.

scale = 1000  # scale in meters
lst_hamburg = band.mean().sample(Hamburg_point, scale).first().get('LST_Day_1km').getInfo()
print('Hamburg average daytime LST:', round(lst_hamburg*0.02 -273.15, 2), '°C')
# output is : Hamburg average daytime LST: 16.83 °C

now get whole interest data

lst_Hamburg_full = band.getRegion(Hamburg_point, scale).getInfo()
lst_Hamburg_full[:3] # Preview the output.

we can already see the data. We will transform the data into a pandas data frame to make it easier.

import pandas as pd
df = pd.DataFrame(lst_Hamburg_full) #Convert list to dataframe
headers = df.iloc[0] # Rearrange the header.
df = pd.DataFrame(df.values[1:], columns=headers) # Rearrange the header.
df = df[['longitude', 'latitude', 'time', "LST_Day_1km" ]].dropna() # Remove rows with null data.
df[ "LST_Day_1km"] = pd.to_numeric(df[ "LST_Day_1km"], errors='coerce') # Convert to numeric values.
df['datetime'] = pd.to_datetime(df['time'], unit='ms') # Convert datetime to datetime values.
df = df[['time','datetime', "LST_Day_1km" ]] # take interest part

I'm not familiar with kelvin, so I'm gonna convert the temperature to Celsius

def kelvin_to_celcius(t_kelvin):
t_celsius = t_kelvin*0.02 - 273.15
return t_celsius
df['LST_Day_1km'] = df['LST_Day_1km'].apply(kelvin_to_celcius)
output samples

basically, we have done the process. We extracted temperature data between 2022 to 2023 in Hamburg.

Visualization step

Data Visualization

With the help of Scipy library, we will fit the temperature curve in Hamburg.

import matplotlib.pyplot as plt
import numpy as np
from scipy import optimize

x_data_u = np.asanyarray(df['time'].apply(float))
y_data_u = np.asanyarray(df['LST_Day_1km'].apply(float))

fig, ax = plt.subplots(figsize=(14, 6))
ax.scatter(df['datetime'], df['LST_Day_1km'],
c='black', alpha=0.2, label='Hamburg (data)')

def fit_func(t, lst0, delta_lst, tau, phi):
return lst0 + (delta_lst/2)*np.sin(2*np.pi*t/tau + phi)

lst0 = 20
delta_lst = 40
tau = 365*24*3600*1000
phi = 2*np.pi*4*30.5*3600*1000/tau

params_u, params_covariance_u = optimize.curve_fit(
fit_func, x_data_u, y_data_u, p0=[lst0, delta_lst, tau, phi])

fit_func(x_data_u, params_u[0], params_u[1], params_u[2], params_u[3]),
label='Hamburg (fitted)', color='black', lw=2.5)

ax.set_title('Daytime Land Surface Temperature Hamburg', fontsize=16)
ax.set_xlabel('Date', fontsize=14)
ax.set_ylabel('Temperature [C]', fontsize=14)
ax.set_ylim(-0, 40)
ax.legend(fontsize=14, loc='lower right')


  1. Gorelick, N., Hancher, M., Dixon, M., Ilyushchenko, S., Thau, D., & Moore, R. (2017). Google Earth Engine: Planetary-scale geospatial analysis for everyone. Remote Sensing of Environment.
  2. MODIS Mount TERRA image from 2022 to 2023 was retrieved on 2023_19_06 from, maintained by the NASA EOSDIS Land Processes Distributed Active Archive Center (LP DAAC) at the USGS Earth Resources Observation and Science (EROS) Center, Sioux Falls, South Dakota. 2018.
  3. Guiattard. (n.d.). An intro to the Earth Engine Python API | google earth engine | google for developers. Google.



Elian Wira Sena

Geospatial Data Scientist and Artificial Intelligence Engineer. To get in touch: