Skip to contents

This guide will explain how to use the radiant heat and firebrand (ember) impact models within the firekit R package developed by the UTAS Fire Centre. This process allows you to attribute houses with indices of risk of radiant heat impact (based on a threshold of 12.5 kwm^2) and ember impact (based on 95%ile distance), given suitable input spatial data layers and forest fuel load definitions.

The first step is to install the firekit package in R. This package has not yet been submitted to the CRAN archive, but it is available to install directly from Github using the devtools package. If you don’t have devtools installed, install it first using the install.packages() function:

install.packages("devtools")

After it has installed, use it to install firekit directly from the UTAS Fire Centre Github repository

devtools::install_github("Fire-Centre/firekit",force=TRUE)
library(firekit)

A few other R packages are required to run this demonstration exercise, the tidyverse package for general data manipulation, and the terra and sf packages for spatial data.

library(tidyverse)
library(terra)
library(sf)

Next we can load the data files required for this analysis. This are available in a ZIP file (data.zip) which is available in the root directory of the firekit package and on Github, which you can unzip into the data folder of your project directory.

First, a digital elevation model of the area surrounding our example properties.

dem <- rast("data/dem.tif")

Next, the locations of the houses themselves. This spatial database include a unique ID number for each house.

houses <- read_sf("data/houses.gpkg")

We also need a polygon vegetation map of the surrounding area. Our vegetation mapping is very simple in this example, it is derived from the TasVeg 4.0 mapping, incorporating the broad vegetation group, which is mostly Dry and Wet Eucalyptus Forest in our study area. In our example vegetation map, urban/modified land has been removed and only flammable vegetation is retained. However, this isn’t strictly necessary, as the property processing function can be told to ignore certain land use categories and regard them as urban. Note - the vegetation data input file should have a field called VEG_GROUP containing the vegetation classes that drive the modelling.

veg <- read_sf("data/veg.gpkg")

Finally, we have a database of fuel types and loads. In our example this is very simple, there are just a few broad, basic types defined. There are a few vital fields in this file.

  • Vegetation_Category - this selects the fuel model to use in the radiant heat simulation, and can contain one of four types;

    • Forest, Rainforest and Woodland

    • Shrub, Scrub and Heath

    • Grassland

    • Tussock Moorland

  • Vegetation_Community - this is the fine-scale vegetation class, each with unique fuel loads. Importantly, this joins with and should therefore contain the same names as the VEG_GROUP field in the vegetation spatial layer.

  • SFFL - Surface Fine Fuel Load in t/ha

  • OFFL - Overall Fine Fuel Load in t/ha

  • HGT - A specific field for shrubby/heath fuels, indicating the layer height in metres. For other fuel types (eg. forests) set this to -1.

Next, we use the generate_property_fields() function to supplement the house location data with geographic data required for the risk modelling - for example, nearby fuel typesa nd distances, slope, and slope type. The output table generated by this may contain multiple records for each house, if vegetation is identified nearby in multiple directions. Later functions will collate these multiple records and identify the one with the highest radiant heat risk.

In the function parameters, the “urb_types” parameter contains a list of VEG_GROUP categories that are considered urban/no fuel/no fire risk. The “urb_set” parameter then defines a single type those multiple no-fuel types should be combined into for simplicity. The “id_field” is the name of a unique ID field in the spatial data that can be used for later collation and joining, while the “fr_angle” is the direction to search for the maximum fire-run distance. In our case, we use the direction of typical extreme fire weatehr approach for the location (Hobart) which is north-west, 315 degrees.

sup_houses <- generate_property_fields(locations=houses,
                             dem=dem,
                             veg=veg,
                             urb_types=c("Other natural environments", 
                                         "Agricultural, urban and exotic vegetation", "Modified land"),
                             urb_set="Agricultural, urban and exotic vegetation",
                             id_field="UniquID",
                             fr_angle=315)

We need to add an additional field to the attribute table that has been geenrated which contains the fuel break class (see TFS fuel break width calculator documentation). Here we will set this to “class1” for all properties, indicating unmanaged fuel. Note that this field is not as important when we are modelling for an explicit forest fire danger index (FFDI) as we do in this example, because within the algorithm, the class type defines one of several fire danger levels, but here we set that fire danger ourselves.

sup_houses$fb_class <- "class1"

Next we use the calc_rad_risk_FFDI() function to calculate the radiant heat received under the conditions of interest. The output data frame contains a number of fields that have been added to the data:

  • FBW - required fuel break width to protect this property, in metres

  • FL - calculated fireline intensity for this property

  • DRisk - diferential radiant heat index. This is the difference between the required distance from the vegetation to be below 12.5 kwm2, and the actual distance. Negative values, therefore, mean house is further away than required and is therefore low risk, while positive values indicate the house is close enough to have radiant heat impact under these conditions.

We run this function using the fuel database, and a set FFDI of 50.

rad_output <- calc_rad_risk_FFDI(sup_houses,fuel,50)

Next we will add the ember model risk index. First, we need to join the fuel load data for this table, so we know the fuel load of the vegetation proximate to each house in the nearby vegetation.

rad_output <- left_join(rad_output,fuel,join_by(VEG_GROUP==Vegetation_Community))

We also need to reclassify the slope type to the “Flat/Hilly” definition used in the ember model.

rad_output <- rad_output %>% mutate(slope_emb = case_when(slope_type  == "downslope" ~ "Hilly",
                                                          slope_type == "flat" ~ "Flat",
                                                          slope_type == "level" ~ "Flat",
                                                          slope_type == "upslope" ~ "Flat"))

Finally, we can add a new field to the table to contain the outputs, and loop through each house to calculate the ember impact distance.

rad_output$ember_dist <- NA
for(i in 1:nrow(rad_output)){
  rad_output$ember_dist[i] <- predict_ember(50,rad_output$slope_emb[i], rad_output$SFFL[i])
}

The ember risk field can then be added by simple subtraction; this works the same as for radiant heat, if ember distance is greater than the distance to vegetation, then there is ember risk. Negative risk values indicate low risk, while positive risk values indicate high risk.

rad_output$ERisk = rad_output$ember_dist - rad_output$dist

We can then join that output back to the spatial data, and plot some maps of ember and radiant heat impact indices.

houses <- left_join(houses,rad_output,join_by(UniquID==id))
plot(houses["ERisk"])
plot(houses["DRisk"])