Benny Istanto Logo Benny Istanto Logo
  • Home
  • About
  • CSR
  • Blog
    • All Posts
    • Archive by Year
  • Works
    • Overview
    • Experiences
    • Projects
    • Consulting
    • Maps & Infographics
  • CV

30-minutes rainfall and landslide research

Remote Sensing
Climate
GIS
Research
Jemblung Landslide - Banjarnegara 2014 Landslide occured on 12 Dec 2014 in Jemblung of Sampang village, Karangkobar sub-district, Banjarnegara district, Central Java
Author

Benny Istanto

Published

May 5, 2020

Jemblung Landslide - Banjarnegara 2014

Landslide occured on 12 Dec 2014 in Jemblung of Sampang village, Karangkobar sub-district, Banjarnegara district, Central Java (109.719792, -7.279643) at about 5:30 pm. The event affected settlement area with more than 300 population (53 households). Victims recorded including 15 injured, 108 death (95 bodies found and 13 lost).

Two days prior to the landslide (10–11 Dec), rainfall intensity in the area had been very high, but as the area isnt located near ground weather station, records aren’t available.

Recent development in opendata allows more access to high resolution climate/weather data and to computing platform that allows users to run geospatial analysis in the cloud. This leads to further exploration like never before.

Open access to 30 mins temporal rainfall data at Google Earth Engine platform provided detail information on rainfall intensity during 10–11 Dec 2014 prior to the landslide in Banjarnegara. Such information help advancing research on rainfall model or identification of threshold for extreme rainfall that could trigger a landslide.

The steps below describe how to extract 30-minute rainfall from NASA GPM-IMERG, based on point location and convert it into CSV file using Google Earth Engine code editor.

Step 1: Define a point of interest as a landslide location.

// Define a point of interest as a landslide location.
var POI = ee.Geometry.Point(109.719792, -7.279643); // Adjust the coordinate - Banjarnegara 12 Dec 2014
Map.centerObject(POI, 9);

Step 2: Choose date when landslide was occurred

// Date when landslide occurs
var lsevent = new Date('2014-12-12'); // Adjust date period with landslide event
var start = new Date(lsevent.getTime() - 10*24*60*60*1000); // 10-days before
var end = new Date(lsevent.getTime() + 1*24*60*60*1000); // 1-day after
print(start);
print(end);

Step 3: Import NASA GPM IMERG 30 minute data and calculate accumulation for 10days.

// Import NASA GPM IMERG 30 minute data and calculate accumulation for 10days.
var imerg = ee.ImageCollection('NASA/GPM_L3/IMERG_V06');
var imergHH = imerg.filterBounds(POI).filterDate(start, end).select('precipitationCal');
var precip = imergHH.select('precipitationCal').sum();

Step 4: Extract the rainfall value as time-series data

// Create a function that takes an image, calculates the mean over a geometry and returns the value and the corresponding date as a feature.

// Timeseries data
var timeSeries = imergHH.map(function (image) {
var imergdate1 = image.date().format('yyyy-MM-dd hh:mm');
var value = image.clip(POI).reduceRegion({reducer: ee.Reducer.mean(), scale: 30}).get('precipitationCal');
return ee.Feature(null, {value: value, date: imergdate1});
});

Figure 1. Chart of time series data generated using above script.

Figure 1. Chart of time series data generated using above script.

Step 5: Extract the rainfall value as accumulation data

// Based on input from Daniel Wiell via GIS StackExchange
// https://gis.stackexchange.com/questions/360611/extract-time-series-rainfall-from-multiple-point-with-date-information/
// Accumulation data
var days = ee.Date(end).difference(ee.Date(start), 'days');
var dayOffsets = ee.List.sequence(1, days);
var accumulation = dayOffsets.map(
function (dayOffset) {
var endDate = ee.Date(start).advance(ee.Number(dayOffset), 'days');
var image = imergHH.filterDate(start, endDate).sum();
var date = endDate.advance(-1, 'days').format('yyyy-MM-dd');
var value = image.clip(POI).reduceRegion({reducer: ee.Reducer.mean(), geometry: POI, scale: 30}).get('precipitationCal');
return ee.Feature(null, {value: value, date: date});
});

Figure 2. Chart of accumulation data generated using above script. 2 days before the event, the area receiving rainfall around 150mm.

Figure 2. Chart of accumulation data generated using above script. 2 days before the event, the area receiving rainfall around 150mm.

Step 6: Visualise time-series data as a chart

// Create a graph of the time-series.
var graphTS = ui.Chart.feature.byFeature(timeSeries,'date', ['value']);
print(graphTS.setChartType("LineChart")
.setOptions({title: 'NASA GPM IMERG 30-minute rainfall time-series',
vAxis: {title: 'Rainfall estimates (mm)'},
hAxis: {title: 'Date'}}));

Step 7: Visualise accumulation data as a chart

// Create a graph of the accumulation.
var graphAcc = ui.Chart.feature.byFeature(accumulation,'date', ['value']);
print(graphAcc.setChartType("LineChart")
 .setOptions({title: 'NASA GPM IMERG 30-minute rainfall accumulation',
 vAxis: {title: 'Rainfall estimates (mm)'},
 hAxis: {title: 'Date'}}));

Step 8: Create visualisation paramaters for rainfall and add it into canvas

// Rainfall vis parameter
var palette = [ '000096','0064ff', '00b4ff', '33db80', '9beb4a', 'ffeb00', 'ffb300', 'ff6400', 'eb1e00', 'af0000'];
var precipVis = {min: 0.0, max: 1000.0, palette: palette, opacity:0.5};

// Add layer into canvas
Map.addLayer(precip, precipVis, "10-days rainfall", false);
Map.addLayer(POI, {color: "#ff0000"}, "Landlside location", true);

Step 9: Export the data to Google Drive as a CSV file.

// Export the result to Google Drive as a CSV.
Export.table.toDrive({collection: timeSeries, description:'LS_69421', folder:'GEE', selectors: 'date, value', fileFormat: 'CSV'});

// End of script

Figure 3. Google Earth Engine user interface

Figure 3. Google Earth Engine user interface

Full script here

To do

  1. Get NASA Global Landslide Catalog from here
  2. Create Landslide list (OBJECTID, Lon, Lat, Date YYYY-MM-DD)
  3. Enhance the script to be able read Location (Lon and Lat) and Date information from CSV GEE assets, and loop Export.table.toDrive with description based on OBJECTID
Back to top
PreviousVulnerable groups in COVID-19 NextMonthly weather data from ERA5 and FLDAS

© 2026, Benny Istanto.

Exploring Climate with GIS and Data Science, solving old problems in new ways. Turning earth observation data into actionable, life-saving insights.

Built with Quarto

  • View source
  • Report an issue

Buy Me a Coffee