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.
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
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:
ref * 100`% (% value of the
effectiveness factor).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 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:
!!! 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 |