Skip to content

Latest commit

 

History

History
500 lines (466 loc) · 22.7 KB

File metadata and controls

500 lines (466 loc) · 22.7 KB

Saga-GIS toolchain for burned area mapping

header Shape of burned area in July 2022 on Kras (Slovenia, Italy) on pre-fire natural RGB

Imagery:

Input imagery are cloud free scenes before and after event. Level 2 data(surface reflectance) is default input. Level 1 can also be used;
the values of L1 are greather: cca: L2sr= 0.8 x L1 and L1= 1.25 x L2sr; so classified grids from L1 data are not in range, but the dynamics are the same and sometimes L2sr are not available in short time after post event so we can use L1 data(also L1...RT); adjusting dNBR threshold for vectorization(ex.:L1 dNBR_th2= 0.137). Using L1 data will not give accurate classes of dNBR; running tool with overridding exports with changed value of dNBR_th2 is recomended to retrive burned area shape.

Some links:

Importing toolchain into SAGA GIS

Toolchain SAGA-GIS-toolchain_Burned_area.xml can be downloaded from SourceForge or copied at the end of this readme and then droped into SAGA GIS GUI for GUI:

Importing imagery into SAGA GIS:

  • Geoprocessing-->File -->Satellite Imagery -->Import ... scene
    Tool for Importing Landsat scene(no calibration required), but if Radiometric calibration(radiance) is applied to level 1 data(L1) then Output Data Type should be "floating point numbers")
    For Sentinel-2 scenes opening individual bands manualy is advised

Preprocessing is not required, there is an option where Landsat L1 products can be processed to
Top of atmosphere Reflectance with options to apply different DOS(Dark Object Substraction)
methods to get parallel product to surface reflactance
- Geoprocessing-->File -->Imagery --> Landsat -->Top of Atmosphere Reflectance

Toolchain for Burned area mapping

Inputs

All bands must be in same grid system; ex.: Downscaling SWIR_2 from 20m to 10m resolution

  • Geoprocessing-->Grid -->Grid System -->Resampling :
    Downscaling = Nearest Neighbour; User defined Cell Size = 10m; default(SWIR_2) coordinates; Fit = nodes

- clipping all bands to prebound area


1 - pre fire bands (red, NIR, SWIR_2)
Optional(pre) QA_PIXEL input for Landsat imagery

2 - post fire bands (red, NIR, SWIR_2)
Optional(post) QA_PIXEL input for Landsat imagery

3 - output file name preappendix and postappendix

4 - Thresholds(=th) for dNBR classification and vectorization

Outputs

  • Indices(pre;post) collection...............pre post (NBR and NDVI and QA_pixel(optional)) 4 or(7) grids
  • dNBR(Normalized Burn Ratio)
  • dNBR USGS_classes
  • dNBR_classes_user_def dNBR_thx
  • RBR.....................................optional
  • dNDVI
  • Vectorized dNBR_th2

QA_pixel export bands(3x) in Indices(pre;post) collection:(pre and post(range 0;1), united(range 0;2), value=0=good pixel

image RGB ( NBRpost, NBRpre, NDVIpost ) (c)NASA

Landsat 8(OLI) Level 1 vs. Level 2

Date Cloud free Imagery level
2022-07-04 LC08_L1TP_191028_20220704_20220708_02_T1 L1
2022-07-04 LC08_L2SP_191028_20220704_20220708_02_T1 L2
2022-08-05 LC08_L1TP_191028_20220805_20220818_02_T1 L1
2022-08-05 LC08_L2SP_191028_20220805_20220818_02_T1 L2
2022-08-05 LC08_L1TP_191028_20220805_20220805_02_RT L1 near Real Time


IndicScatt

Scatterplots of clipped indices


dNBR L2 and dNBR L1 are highly correlated
dNDVI L2 and dNBR L2 are less correlated (NDVI is calculated from bands nearer to VIS spectrum)

The main purpose is assesment of severity and to get trustful shapefile of burned area that can be used for future monitoring(GEE).

Feel free :

Burned area toolchain xml file

<?xml version="1.0" encoding="UTF-8"?>
<toolchain saga-version="8.1.1">
  <group>EO</group>
  <identifier>Rho_001</identifier>
  <name>Burned area mapping</name>
  <author>M. Žemva (c) 2022</author>
  <description>Calculating indices for mapping and analysing burned area
  ..........................{red..NIR.. SWIR_2.}
                    L8/L8 OLI..bands {.b4.. .b5.. .b7..}  ....._30m
                    ASTER......bands {.B2..   B3..   B6..}   ..._15m   ...._SWIR_2 ..30m             
                    S2/S2 MSI bands {.B4..   B8..   B12.}   .._10m   ...._SWIR_2 ..20m
                    Input bands must be on same Grid System(Resample/Nearest neighb./user def. Cellsize/fit nodes)

                        Normalized Burn Ratio:
                           ...NBR = (NIR - SWIR_2) / (NIR + SWIR_2 )

                           ...NDVI = (NIR - Red) / (NIR + Red) 

                  Estimating severity:

                    ...deltaINDEX = INDEX_pre-fire - INDEX_post-fire
                    Relativized Burned Ratio:     
                    ...RBR = dNBR / (NBRpre + 1.001)                       
                    
dNBR is classified by thresholds(=th) proposed by USGS and user

Delineating burned area:  ..Deleting polygons on vectorized dNBR_th2

Links :       https://www.researchgate.net/publication/228638145_Fire_intensity_fire_severity_and_burn_severity_A_brief_review_and_suggested_usage
             https://un-spider.org/advisory-support/recommended-practices/recommended-practice-burn-severity/in-detail/normalized-burn-ratio
             https://www.indexdatabase.de/db/i-single.php?id=53               
  </description>
 	<reference>
		<authors>Miha Žemva</authors>
		<year>2022</year>
		<title>Saga-gis toolchain for burned area mapping</title>
		<where>Bled, Slovenia</where>
		<link>https://github.com/RhoSpatial/Saga</link>
		<link_text>online</link_text>
	</reference> 
  <menu absolute="true">Imagery|EO</menu>
  <parameters>
    <option varname="GRID_SYSTEM" type="grid_system">
      <name>Grid System</name>
    </option>
    <input varname="REDpre" type="grid" parent="GRID_SYSTEM">
      <name>RED band  pre fire</name>
    </input>
    <input varname="NIRpre" type="grid" parent="GRID_SYSTEM">
      <name>NIR pre fire</name>
    </input> 
    <input varname="SWIR IIpre" type="grid" parent="GRID_SYSTEM">
      <name>SWIR_2 pre fire</name>
    </input>  
    <input varname="QA_PIXELpre" type="grid" parent="GRID_SYSTEM" optional="true">
      <name>QA_PIXEL pre</name><description>Only for Landsat imagery</description>
    </input>        
    <input varname="REDpost" type="grid" parent="GRID_SYSTEM">
      <name>RED band post fire</name>
    </input>
    <input varname="NIRpost" type="grid" parent="GRID_SYSTEM">
      <name>NIR  post fire</name>
    </input> 
    <input varname="SWIR IIpost" type="grid" parent="GRID_SYSTEM">
      <name>SWIR_2  post fire</name>
    </input>
    <input varname="QA_PIXELpost" type="grid" parent="GRID_SYSTEM" optional="true">
      <name>QA_PIXEL post</name><description>Only for Landsat imagery</description>
    </input>

    <output varname="Indices_coll" type="grids" parent="GRID_SYSTEM">
      <name>Indices(pre;post) collection</name>
    </output>
    <output varname="dNBR" type="grid" parent ="GRID_SYSTEM">
      <name>dNBR</name>
      <colours>1</colours>
    </output>
    <output varname="RECLASSnbr" type="grid" parent="GRID_SYSTEM">
      <name>dNBR USGS_classes </name>
    </output>
    <output varname="second" type="grid" parent="GRID_SYSTEM">
      <name>dNBR_classes_user_def dNBR_thx</name>
      <colours>12</colours>
    </output>       
    <output varname="RBR" type="grid" parent ="GRID_SYSTEM" optional="true">
      <name>RBR</name>
      <description>select //create//  for RBR(=RdNBR) calculation</description></output>
    <output varname="dNDVI" type="grid" parent="GRID_SYSTEM">
      <name>dNDVI</name>
      <colours>7</colours>
    </output>
	  <output varname="dNBR_vector_(class_dNBR_th2)" type="shapes">
			<name>Vectorized dNBR_th2</name><output_name>dNBR_class_gt_dNBR_th2</output_name>
      <description>Vectorize dNBR class greather than dNBR_th2 threshold value</description>
    </output>

    <option varname="preapp" type="text">
			   <name>name preappendix</name><value>Kras</value>
    </option>
    <option varname="postappsat" type="text">
			   <name>Sensor_Satellite input product</name><value>L8</value>
    </option> 
    <option varname="postapppreD" type="text">
			   <name>pre fire date</name><value>4_July_22</value>
    </option> 
    <option varname="postapppostD" type="text">
			   <name>post fire date</name><value>5_Avg_22</value>
    </option> 
    <option varname="dNBR_th1" type="double"><name>dNBR_th1</name>
                  <value min="-0.20000">0</value>
    </option>
    <option varname="dNBR_th2" type="double"><name>dNBR_th2 /also th for vectorization</name>
                  <value min="0.010000">0.11</value>
    </option>  
    <option varname="dNBR_th3" type="double"><name>dNBR_th3</name>
                  <value min="0.120000">0.3</value>
    </option>           
  </parameters>
  <tools>   
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">NBRpre</output>
      <option id="FORMULA">(g1 - g2) / (g1 + g2)</option>
      <option id="NAME">$(preapp)_NBRpre_$(postappsat)_$(postapppreD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">NIRpre</input>
      <input id="GRIDS">SWIR IIpre</input>
    </tool> 
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">NBRpost</output>
      <option id="FORMULA">(g1 - g2) / (g1 + g2)</option>
      <option id="NAME">$(preapp)_NBRpost_$(postappsat)_$(postapppostD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">NIRpost</input>
      <input id="GRIDS">SWIR IIpost</input>
    </tool>
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">NDVIpre</output>
      <option id="FORMULA">(g1 - g2) / (g1 + g2)</option>
      <option id="NAME">$(preapp)_NDVIpre_$(postappsat)_$(postapppreD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">NIRpre</input>
      <input id="GRIDS">REDpre</input>
    </tool> 
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">NDVIpost</output>
      <option id="FORMULA">(g1 - g2) / (g1 + g2)</option>
      <option id="NAME">$(preapp)_NDVIpost_$(postappsat)_$(postapppostD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">NIRpost</input>
      <input id="GRIDS">REDpost</input>
    </tool>   
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">dNDVI</output>
      <option id="FORMULA">g1 - g2</option>
      <option id="NAME">$(preapp)_dNDVI_$(postappsat)__$(postapppostD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">NDVIpre</input>
      <input id="GRIDS">NDVIpost</input>
    </tool>
  <condition type="exists" variable="QA_PIXELpre">
  <condition type="exists" variable="QA_PIXELpost">
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">qa_pre</output>
      <option id="FORMULA">ifelse(eq(g1,21824),0,1)</option>
      <option id="NAME">$(preapp)_QA_px_$(postappsat)_$(postapppreD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">QA_PIXELpre</input>
    </tool>
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">qa_post</output>
      <option id="FORMULA">ifelse(eq(g1,21824),0,1)</option>
      <option id="NAME">$(preapp)_QA_px_$(postappsat)_$(postapppostD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">QA_PIXELpost</input>
    </tool>
      <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">qa_united</output>
      <option id="FORMULA">g1+g2</option>
      <option id="NAME">$(preapp)_QA_px_$(postappsat)_United</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">qa_post</input>
      <input id="GRIDS">qa_pre</input>  
    </tool>
    <tool library="statistics_grid" tool="13" name="Save Grid Statistics to Table">
      <output id="STATS">tool__STATS</output>
      <option id="DATA_CELLS">false</option>
      <option id="NODATA_CELLS">false</option>
      <option id="CELLSIZE">false</option>
      <option id="MEAN">false</option>
      <option id="MIN">false</option>
      <option id="MAX">false</option>
      <option id="RANGE">false</option>
      <option id="SUM">false</option>
      <option id="SUM2">false</option>
      <option id="VAR">false</option>
      <option id="STDDEV">false</option>
      <option id="STDDEVLO">false</option>
      <option id="STDDEVHI">false</option>
      <option id="PCTL_VAL">5; 25; 50; 75; 95</option>
      <option id="PCTL_HST">false</option>
      <option id="SAMPLES">0</option>
      <input id="GRIDS">NBRpre</input>
      <input id="GRIDS">NBRpost</input>
      <input id="GRIDS">NDVIpre</input>
      <input id="GRIDS">NDVIpost</input>
      <input id="GRIDS">qa_pre</input>
      <input id="GRIDS">qa_post</input>
      <input id="GRIDS">qa_united</input>
    </tool>
    <tool library="grids_tools" tool="0" name="Create a Grid Collection">
      <output id="GRIDS">Indices_coll</output>
      <option id="NAME">$(preapp)_Indices_$(postappsat)_$(postapppostD)</option>
      <option id="DELETE">false</option>
      <option id="ATTRIBUTES">2</option>
      <option id="TABLE_Z">NAME</option>
      <option parms="FIELDS" id="NAME0">ID</option>
      <option parms="FIELDS" id="TYPE0">8</option>
      <option parms="FIELDS" id="NAME1">Value</option>
      <option parms="FIELDS" id="TYPE1">11</option>
      <input id="LIST">NBRpre</input>
      <input id="LIST">NBRpost</input>
      <input id="LIST">NDVIpre</input>
      <input id="LIST">NDVIpost</input>
      <input id="LIST">qa_pre</input>
      <input id="LIST">qa_post</input>
      <input id="LIST">qa_united</input>  
      <input id="TABLE">tool__STATS</input>
    </tool>  
  </condition>
  </condition>  
  <condition type="not_exists" variable="QA_PIXELpre">
  <condition type="not_exists" variable="QA_PIXELpost">
    <tool library="statistics_grid" tool="13" name="Save Grid Statistics to Table">
      <output id="STATS">tool__STATS</output>
      <option id="DATA_CELLS">false</option>
      <option id="NODATA_CELLS">false</option>
      <option id="CELLSIZE">false</option>
      <option id="MEAN">false</option>
      <option id="MIN">false</option>
      <option id="MAX">false</option>
      <option id="RANGE">false</option>
      <option id="SUM">false</option>
      <option id="SUM2">false</option>
      <option id="VAR">false</option>
      <option id="STDDEV">false</option>
      <option id="STDDEVLO">false</option>
      <option id="STDDEVHI">false</option>
      <option id="PCTL_VAL">5; 25; 50; 75; 95</option>
      <option id="PCTL_HST">false</option>
      <option id="SAMPLES">0</option>
      <input id="GRIDS">NBRpre</input>
      <input id="GRIDS">NBRpost</input>
      <input id="GRIDS">NDVIpre</input>
      <input id="GRIDS">NDVIpost</input>
    </tool>
    <tool library="grids_tools" tool="0" name="Create a Grid Collection">
      <output id="GRIDS">Indices_coll</output>
      <option id="NAME">$(preapp)_Indices_$(postappsat)_$(postapppostD)</option>
      <option id="DELETE">false</option>
      <option id="ATTRIBUTES">2</option>
      <option id="TABLE_Z">NAME</option>
      <option parms="FIELDS" id="NAME0">ID</option>
      <option parms="FIELDS" id="TYPE0">8</option>
      <option parms="FIELDS" id="NAME1">Value</option>
      <option parms="FIELDS" id="TYPE1">11</option>
      <input id="LIST">NBRpre</input>
      <input id="LIST">NBRpost</input>
      <input id="LIST">NDVIpre</input>
      <input id="LIST">NDVIpost</input>
      <input id="TABLE">tool__STATS</input>
    </tool>
  </condition>
  </condition>
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">dNBR</output>
      <option id="FORMULA">g1 - g2</option>
      <option id="NAME">$(preapp)_dNBR_$(postappsat)_$(postapppostD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">NBRpre</input>
      <input id="GRIDS">NBRpost</input>
    </tool>
    <tool library="grid_tools" tool="15" name="Reclassify Grid Values">
			<input  id="INPUT">dNBR</input>
			<output id="RESULT">RECLASSnbrP</output>
			<option id="METHOD">2</option>
			<option id="SOPERATOR">0</option>
			<option id="RETAB">
				<OPTION type="static_table" id="RETAB" name="Lookup Table">
					<FIELDS>
						<FIELD type="DOUBLE">min</FIELD>
						<FIELD type="DOUBLE">max</FIELD>
						<FIELD type="DOUBLE">new</FIELD>
					</FIELDS>
					<RECORDS>
						<RECORD><FIELD>-0.5</FIELD><FIELD>-0.25</FIELD><FIELD>1.0</FIELD></RECORD>
						<RECORD><FIELD>-0.25</FIELD><FIELD>-0.1</FIELD><FIELD>2.0</FIELD></RECORD>
						<RECORD><FIELD>-0.1</FIELD><FIELD>0.1</FIELD><FIELD>3.0</FIELD></RECORD>
            <RECORD><FIELD>0.1</FIELD><FIELD>0.27</FIELD><FIELD>4.0</FIELD></RECORD>
						<RECORD><FIELD>0.27</FIELD><FIELD>0.44</FIELD><FIELD>5.0</FIELD></RECORD>
						<RECORD><FIELD>0.44</FIELD><FIELD>0.66</FIELD><FIELD>6.0</FIELD></RECORD>
            <RECORD><FIELD>0.66</FIELD><FIELD>1.3</FIELD><FIELD>7.0</FIELD></RECORD>
					</RECORDS>
        </OPTION>
      </option>
    </tool>
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
        <output id="RESULT">RECLASSnbr</output>
        <option id="FORMULA">g1</option>
        <option id="NAME">$(preapp)_dNBRclassesUSGS_$(postappsat)_$(postapppostD)</option>
        <option id="FNAME">false</option>
        <option id="USE_NODATA">false</option>
        <option id="TYPE">7</option>
        <input id="GRIDS">RECLASSnbrP</input>
    </tool>
    <tool library="grid_visualisation" tool="11" name="Create a Table from Look-up Table">
			<output id="TABLE">CLASS_DEF</output>
			<option id="LUT">
        <OPTION type="static_table" id="LUT" name="Lookup Table">
					<FIELDS>
						<FIELD type="COLOR" >Color</FIELD>
						<FIELD type="STRING">Name</FIELD>
						<FIELD type="STRING">Description</FIELD>
						<FIELD type="DOUBLE">Minimum</FIELD>
						<FIELD type="DOUBLE">Maximum</FIELD>
					</FIELDS>
          <RECORDS>
          	<RECORD><FIELD> -3000</FIELD><FIELD >Enhanced Regrowth, High</FIELD><FIELD>Enhanced Regrowth, High</FIELD><FIELD>  1</FIELD><FIELD>  1</FIELD></RECORD>
						<RECORD><FIELD> -2400</FIELD><FIELD >Enhanced Regrowth, Low</FIELD><FIELD>Enhanced Regrowth, Low</FIELD><FIELD>2</FIELD><FIELD>2</FIELD></RECORD>
						<RECORD><FIELD> -1400</FIELD><FIELD >Unburned</FIELD><FIELD>Unburned</FIELD><FIELD>  3</FIELD><FIELD>  3</FIELD></RECORD>
						<RECORD><FIELD>   200</FIELD><FIELD >Low Severity</FIELD><FIELD>Low Severity</FIELD><FIELD>  4</FIELD><FIELD>  4</FIELD></RECORD>
						<RECORD><FIELD>  2400</FIELD><FIELD >Moderate-low Severity</FIELD><FIELD>Moderate-low Severity</FIELD><FIELD>  5</FIELD><FIELD>  5</FIELD></RECORD>
						<RECORD><FIELD>  4000</FIELD><FIELD >Moderate-high Severity</FIELD><FIELD>Moderate-high Severity</FIELD><FIELD>  6</FIELD><FIELD>  6</FIELD></RECORD>
						<RECORD><FIELD> 10000</FIELD><FIELD >High Severity</FIELD><FIELD>High Severity</FIELD><FIELD>  7</FIELD><FIELD>7</FIELD></RECORD>
					</RECORDS>
        </OPTION>
      </option>
		</tool>
    <tool library="grid_visualisation" tool="10" name="Select Look-up Table for Grid Visualization">
				<input id="GRID">RECLASSnbr</input>
				<input id="LUT">CLASS_DEF</input>
		</tool>
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">first</output>
      <option id="FORMULA">ifelse(lt(g1,$(dNBR_th1)),1,2)</option>
      <option id="NAME">first</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">dNBR</input>
    </tool> 
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">second</output>
      <option id="FORMULA">ifelse(gt(g1,$(dNBR_th2)),3,g2)</option>
      <option id="NAME">$(preapp)_dNBR_gt$(dNBR_th2)_$(postappsat)_$(postapppostD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">dNBR</input>
      <input id="GRIDS">first</input>
    </tool>
    <tool library="shapes_grid" tool="6" name="Vectorising Grid Classes">
      <output id="POLYGONS">dNBR_vector_(class_dNBR_th2)</output>
      <option id="CLASS_ALL">0</option>
      <option id="CLASS_ID">3</option>
      <option id="SPLIT">1</option>
      <option id="ALLVERTICES">false</option>
      <input id="GRID">second</input>
    </tool>
    <tool library="grid_calculus" tool="1" name="Grid Calculator">
      <output id="RESULT">RBR</output>
      <option id="FORMULA">g1 / (g2 + 1.001)</option>
      <option id="NAME">$(preapp)_RBR_$(postappsat)_$(postapppostD)</option>
      <option id="FNAME">false</option>
      <option id="USE_NODATA">false</option>
      <option id="TYPE">7</option>
      <input id="GRIDS">dNBR</input>
      <input id="GRIDS">NBRpre</input>  
    </tool>
  </tools>
</toolchain>