Background

The purpose of this analysis is to clearly document the rationale behind the calculation of the Europe and SEE RE programmes’ contribution towards TNC’s global 2030 goals. The calculation is intended to support the update of progress in TNC’s Shared Conservation Hub, and is meant to align with the available Lands Metrics and Climate Mitigation RE guidance documents.

Setup

library(tidyverse)
library(readxl)
library(sf)
library(countrycode)

Raw data for country projected capacity is obtained from Ember Clean Power Pathways in excel format. Data from the (still unpublished, submitted for publication) TNC “pan-Europe” study is provided by the Global Protect Science team in geopackage format.

ember <- read_excel("data-input/Ember_NewGeneration_Data.xlsx", sheet = 2) %>% 
  rename(country_code = Country) %>% 
  mutate(country_code = if_else(country_code == "UK", "GB", country_code)) %>% 
  mutate(country = countrycode(country_code, "iso2c", "country.name.en")) %>% 
  mutate(country = case_when(country == "Bosnia & Herzegovina" ~ "Bosnia and Herzegovina",
                             country == "Czechia" ~ "Czech Republic",
                             country == "Slovakia" ~ "Slovak Republic",
                             .default = country))
countries <- unique(select(ember, country_code, country))

pe_wind <- read_sf("data-input/panEUROPE_2030_v20230920.gpkg", layer = "wind2030")
pe_solar <- read_sf("data-input/panEUROPE_2030_v20230920.gpkg", layer = "solar2030")

The scope countries are defined per programme as follows:

  • see_active, europe_active: countries where an intervention was completed and the outputs are expected to be actively used.
  • see_planned, europe_planned: countries where an intervention is planned in the coming period, and which should be included in expected impact up to 2030.
  • see_programme, europe_programme: all other countries that fall within the geographical scope of the programmes, but where no intervention is planned yet.

It’s important to note that the input datasets do not include Kosovo, which was therefore not possible to include in this analysis despite being in the SEE programme scope.

see_programme <- c('AL', 'BA', 'ME', 'MK', 'RS', 'HR', 'SI')
europe_programme <- ember %>% 
  filter(!country_code %in% see_programme) %>% 
  .$country_code %>% 
  unique

see_active <- c("RS", "MK")
see_planned <- c("HR", "ME")

europe_active <- NA
europe_planned <- c("PT", "RO")

Ember Clean Power Pathways data is provided in 5-year intervals, therefore the target year is set as 2030. Power density estimates are taken from Bolinger & Bolinger 2022 for solar PV and Wu et al. 2017 for onshore wind.

target_year <- 2030

# in MW per km2
power_density_wind <- 5
power_density_solar <- 69

# converting to km2 per GW
km2_per_GW_wind <- 1000/power_density_wind
km2_per_GW_solar <- 1000/power_density_solar

# effectiveness factor
ef <- 0.7

Avoided land targets

The “opportunity space” is defined for the purpose of this exercise as potentially high-conflict land that is likely to be impacted by the deployment of solar and wind power projects up to 2030. The opportunity space per country is calculated from the unpublished pan-Europe study data by subtracting low-conflict areas from land expected to be developed under BAU scenarios. This value is multiplied by an assumed “effectiveness factor” which corresponds to the proportion of planned development that would happen on high-conflict land, which will be diverted to low-conflict land as a result of our intervention.

Assumptions:

Wind (onshore)

The opportunity space and avoided land calculations for wind are given in the following table (press ‘show’ to see the calculation):

pe_wind <- pe_wind %>% 
  mutate(bad_places_sp = (sp_bau > 0 & conflict_ >= 0.4),
         bad_area_sp = bad_places_sp * KM1000) %>% 
  mutate(bad_places_td = (td_bau > 0 & conflict_ >= 0.4),
         bad_area_td = bad_places_td * KM1000) %>% 
  mutate(bad_places_sc = (sc_bau > 0 & conflict_ >= 0.4),
         bad_area_sc = bad_places_sc * KM1000)

areas_wind <- pe_wind %>% 
  st_drop_geometry %>% 
  group_by(country) %>% 
  summarize(sp = sum(bad_area_sp), 
            td = sum(bad_area_td), 
            sc = sum(bad_area_sc)) %>% 
  left_join(countries, by = "country") %>% 
  mutate(intervention = case_when(country_code %in% see_active ~ "SEE active",
                                  country_code %in% see_planned ~ "SEE planned",
                                  # country_code %in% see_programme ~ "SEE scope",
                                  country_code %in% europe_active ~ "Europe active",
                                  country_code %in% europe_planned ~ "Europe planned",
                                  # country_code %in% europe_programme ~ "Europe scope",
                                  .default = NA))
         
t_wind <- areas_wind %>% group_by(intervention) %>% 
  summarize(opp_sp = sum(sp),
            opp_td = sum(td),
            opp_sc = sum(sc)) %>% 
  mutate(avoid_sp = opp_sp * ef,
         avoid_td = opp_td * ef,
         avoid_sc = opp_sc * ef) 
t_wind %>% knitr::kable()
intervention opp_sp opp_td opp_sc avoid_sp avoid_td avoid_sc
Europe planned 2245.5089 3000.174 4246.080 1571.8562 2100.1215 2972.256
SEE active 1094.5872 1079.784 2738.032 766.2110 755.8486 1916.623
SEE planned 353.0823 2366.475 2651.545 247.1576 1656.5326 1856.081
NA 36844.3405 73448.444 78197.211 25791.0384 51413.9109 54738.048

In conclusion, the results for onshore wind are the following:

  • the planned interventions in the Europe RE programme are estimated to lead to 2100.1214611 km2 avoided.
  • the completed interventions in the SEE RE programme are estimated to lead to 755.848571 km2 avoided.
  • the planned interventions in the SEE RE programme are estimated to lead to 1656.5325974 km2 avoided.

Solar (ground-mounted)

The opportunity space and avoided land calculations for ground-mounted solar PV are given in the following table (press ‘show’ to see the calculation):

pe_solar <- pe_solar %>% 
  mutate(bad_places_sp = (sp_bau > 0 & conflict_ >= 0.4),
         bad_area_sp = bad_places_sp * KM1000) %>% 
  mutate(bad_places_td = (td_bau > 0 & conflict_ >= 0.4),
         bad_area_td = bad_places_td * KM1000) %>% 
  mutate(bad_places_sc = (sc_bau > 0 & conflict_ >= 0.4),
         bad_area_sc = bad_places_sc * KM1000)

areas_solar <- pe_solar %>% 
  st_drop_geometry %>% 
  group_by(country) %>% 
  summarize(sp = sum(bad_area_sp), 
            td = sum(bad_area_td), 
            sc = sum(bad_area_sc)) %>% 
  left_join(countries, by = "country") %>% 
  mutate(intervention = case_when(country_code %in% see_active ~ "SEE active",
                                  country_code %in% see_planned ~ "SEE planned",
                                  # country_code %in% see_programme ~ "SEE scope",
                                  country_code %in% europe_active ~ "Europe active",
                                  country_code %in% europe_planned ~ "Europe planned",
                                  # country_code %in% europe_programme ~ "Europe scope",
                                  .default = NA))
         
t_solar <- areas_solar %>% group_by(intervention) %>% 
  summarize(opp_sp = sum(sp),
            opp_td = sum(td),
            opp_sc = sum(sc)) %>% 
  mutate(avoid_sp = opp_sp * ef,
         avoid_td = opp_td * ef,
         avoid_sc = opp_sc * ef) 
t_solar %>% knitr::kable()
intervention opp_sp opp_td opp_sc avoid_sp avoid_td avoid_sc
Europe planned 203.569432 869.61880 1307.7843 142.498602 608.73316 915.4490
SEE active 15.385048 42.72085 27.5700 10.769534 29.90459 19.2990
SEE planned 8.987952 139.85951 193.3215 6.291566 97.90166 135.3251
NA 2979.090348 8703.56846 18565.4953 2085.363244 6092.49792 12995.8467

In conclusion, the results for ground-mounted solar PV are the following:

  • the planned interventions in the Europe RE programme are estimated to lead to 608.7331578 km2 avoided.
  • the completed interventions in the SEE RE programme are estimated to lead to 29.9045938 km2 avoided.
  • the planned interventions in the SEE RE programme are estimated to lead to 97.9016556 km2 avoided.

CO2 emission reduction targets

!!! This part is still a work-in-progress !!! The current version of the calculation is given below:

# approach 1: 
# assume shorter permitting times / deployment as a result of our activities
# calculate average YoY increase in GWh between 2025 and 2035? for each country separately
# convert to increase in MtCO2 saved per year overall
# multiply this by expected shortening of permitting times & deployment in intervention countries

# co2 <- ember %>% filter(KPI == "CO2 emissions",
#                         Scenario == "Stated Policy") %>% 
#   pivot_wider(names_from = `Trajectory year`, values_from = Result)
# 
# co2$diff_35_25_yoy <- (co2$`2035` - co2$`2025`) / 10

co2 <- ember %>% 
  filter(Technology %in% c("Wind onshore fleet", "Solar fleet"),
         KPI == "Power generation (by technology)",
         Scenario == "Technology Driven") %>%  
  group_by(`Trajectory year`, Scenario, country, country_code) %>% 
  summarize(Result = sum(Result)) %>% 
  pivot_wider(values_from = Result, names_from = `Trajectory year`, names_prefix = "gwh") %>% 
  mutate(gwh_yoy = (gwh2035-gwh2025) / 10)
## `summarise()` has grouped output by 'Trajectory year', 'Scenario', 'country'.
## You can override using the `.groups` argument.
shorter_permitting_factor <- 0.1 # crucial element, still looking for a reference to back this up

x <- co2 %>% select(Scenario, country, gwh_yoy) %>% 
  mutate(tco2_yoy = gwh_yoy * 709) %>% 
  mutate(Mtco2_saved_yr = (tco2_yoy * shorter_permitting_factor)/1000000)

knitr::kable(x)
Scenario country gwh_yoy tco2_yoy Mtco2_saved_yr
Technology Driven Albania 255.15270 180903.26 0.0180903
Technology Driven Austria 3397.12463 2408561.37 0.2408561
Technology Driven Belgium 811.70293 575497.38 0.0575497
Technology Driven Bosnia and Herzegovina 3303.67066 2342302.49 0.2342302
Technology Driven Bulgaria 2596.47117 1840898.06 0.1840898
Technology Driven Croatia 1368.58004 970323.25 0.0970323
Technology Driven Cyprus 187.33973 132823.87 0.0132824
Technology Driven Czech Republic 1723.55934 1222003.57 0.1222004
Technology Driven Denmark 182.21280 129188.88 0.0129189
Technology Driven Estonia 659.15118 467338.18 0.0467338
Technology Driven Finland 2568.60281 1821139.39 0.1821139
Technology Driven France 26417.77520 18730202.61 1.8730203
Technology Driven Germany 18100.87930 12833523.42 1.2833523
Technology Driven Greece 6977.93384 4947355.09 0.4947355
Technology Driven Hungary 2069.57897 1467331.49 0.1467331
Technology Driven Ireland 4794.47160 3399280.37 0.3399280
Technology Driven Italy 15960.03574 11315665.34 1.1315665
Technology Driven Latvia 175.86334 124687.11 0.0124687
Technology Driven Lithuania 123.37947 87476.05 0.0087476
Technology Driven Luxembourg 113.02147 80132.23 0.0080132
Technology Driven Malta 32.06697 22735.48 0.0022735
Technology Driven Montenegro 782.68666 554924.84 0.0554925
Technology Driven Netherlands 2012.03792 1426534.88 0.1426535
Technology Driven North Macedonia 97.55985 69169.94 0.0069170
Technology Driven Norway 5349.16476 3792557.82 0.3792558
Technology Driven Poland 4672.80618 3313019.58 0.3313020
Technology Driven Portugal 5459.09775 3870500.31 0.3870500
Technology Driven Romania 1603.04021 1136555.51 0.1136556
Technology Driven Serbia 204.55311 145028.15 0.0145028
Technology Driven Slovak Republic 1275.07545 904028.49 0.0904028
Technology Driven Slovenia 176.98309 125481.01 0.0125481
Technology Driven Spain 36035.89297 25549448.11 2.5549448
Technology Driven Sweden 1975.46886 1400607.42 0.1400607
Technology Driven Switzerland 160.03526 113465.00 0.0113465
Technology Driven United Kingdom 8029.40000 5692844.60 0.5692845