Ziel dieses 12 Stunden Mikro-Forschungsprojektes, im Rahmen des HACK AND HARVEST 2021, war die Berechnung der elementaren CO2-Bilanz für Konstanz, die Differenz von CO2-Erzeugung von Konstanzer:innen durch Atmung auf der einen und der CO2-Aufnahme der konstanzer Vegetation auf der anderen Seite. Beschränkt habe ich mich hier, aufgrund der Datenlage, auf erwachsene Konstanzer einerseits und Bäume der Stadt Konstanz andererseits.
Sys.setlocale("LC_ALL","de_DE")
## [1] "de_DE/de_DE/de_DE/C/de_DE/en_US.UTF-8"
rm(list=ls())
library(forcats)
library(ggplot2)
library(ggmap)
library(dplyr)
library(kableExtra)
library(osmdata)
library(tidyr)
raw <- read.csv('data/KN_Baumkataster_2020.csv', strip.white=TRUE) %>%
rename(x = X.X) %>%
rename(y = Y) %>%
rename(hoehe = hoeheM) %>%
rename(kronendurchmesser = kronendurchmesserM) %>%
rename(stammumfang = stammumfangCM) %>%
rename(name_de = Name_dt) %>%
rename(name_la = Name_lat) %>%
rename(standort = location)
Das Baumkataster der Stadt Konstanzer enthält in Summe 15711 Bäume.
Das Baumkataster der Stadt Konstanz enthält 68 verschiedene Gattungen, 131 Einträge haben hier keinen gültigen Wert.
N <- 50
data <- kataster %>%
filter(!is.na(gattung)) %>%
group_by(gattung) %>%
summarize(n = n()) %>%
filter(n > N) %>%
arrange(desc(n))
ggplot(data) +
geom_bar(aes(x=reorder(gattung, -n), y=n), stat = "identity") +
labs(title=paste0('Bäume der Stadt Konstanz (Gattungen), Anzahl > ', N), x='Gattung', y='Anzahl Bäume') +
theme_bw() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Abbildung: Verteilung der Bäume der Stadt Konstanz für Gattungen mit mehr als 50 Bäumen.
N <- 10
#bb <- c(9.08, 47.65, 9.22, 47.75)
#map <- get_stamenmap(bb, maptype="terrain", zoom=14)
bb <- c(9.12, 47.65, 9.22, 47.70)
map <- get_stamenmap(bb, maptype="terrain", zoom=15)
df <- kataster %>%
filter(!is.na(gattung)) %>%
filter(x >= bb[1] & x <= bb[3]) %>%
filter(y >= bb[2] & y <= bb[4]) %>%
group_by(gattung) %>%
summarize(n=n()) %>%
arrange(desc(n)) %>%
top_n(N)
data <- kataster %>%
filter(gattung %in% df$gattung) %>%
filter(x >= bb[1] & x <= bb[3]) %>%
filter(y >= bb[2] & y <= bb[4])
ggmap(map) +
geom_point(data=data, aes(x=x, y=y, color=gattung), size=0.5, alpha=0.25) +
labs(title=paste0('Bäume der Stadt Konstanz (Gattungen, Top ', N, ')')) +
theme_void() +
theme(legend.position="bottom") +
scale_color_discrete(name='Gattung') +
guides(color=guide_legend(override.aes=list(alpha=1, size=1)))
Abbildung: Verteilung der Bäume der Stadt Konstanz über das Stadtgebiet für Gattungen mit mehr als 10 Bäumen.
df <- kataster %>% filter(!is.na(stammumfang)) %>% filter(!is.na(hoehe))
V <- (df$stammumfang / 100)**2 / (4*pi) * df$hoehe # m^3
m <- V * 600 # kg
C <- m / 2
sum(C)/1000
## [1] 12509.73
Das Baumkataster der Stadt Konstanz enthält 289 verschiedene Arten, 0 Einträge haben hier keinen gültigen Wert.
N <- 100
data <- kataster %>%
filter(!is.na(name_de)) %>%
group_by(name_de) %>%
summarize(n = n()) %>%
filter(n > N) %>%
arrange(desc(n))
ggplot(data) +
geom_bar(aes(x=reorder(name_de, -n), y=n), stat = "identity") +
labs(title=paste0('Bäume der Stadt Konstanz (Arten), Anzahl > ', N), x='Art', y='Anzahl Bäume') +
theme_bw() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Abbildung: Verteilung der Bäume der Stadt Konstanz für Arten mit mehr als 100 Bäumen.
N <- 10
#bb <- c(9.08, 47.65, 9.22, 47.75)
#map <- get_stamenmap(bb, maptype="terrain", zoom=14)
bb <- c(9.12, 47.65, 9.22, 47.70)
map <- get_stamenmap(bb, maptype="terrain", zoom=15)
df <- kataster %>%
filter(!is.na(gattung)) %>%
filter(x >= bb[1] & x <= bb[3]) %>%
filter(y >= bb[2] & y <= bb[4]) %>%
group_by(name_de) %>%
summarize(n=n()) %>%
arrange(desc(n)) %>%
top_n(N)
data <- kataster %>%
filter(name_de %in% df$name_de) %>%
filter(x >= bb[1] & x <= bb[3]) %>%
filter(y >= bb[2] & y <= bb[4])
ggmap(map) +
geom_point(data=data, aes(x=x, y=y, color=name_de), size=0.5, alpha=0.25) +
labs(title=paste0('Bäume der Stadt Konstanz (Art, Top ', N, ')')) +
theme_void() +
theme(legend.position="bottom") +
scale_color_discrete(name='Art') +
guides(color=guide_legend(override.aes=list(alpha=1, size=1)))
Abbildung: Verteilung der Bäume der Stadt Konstanz für Arten mit mehr als 10 Bäumen.
Das Baumkataster der Stadt Konstanz enthält 7 Bäume ohne einen gültigen Wert für den Stammumfang.
ggplot(kataster %>% filter(!is.na(stammumfang))) +
geom_histogram(aes(x=stammumfang), binwidth=25) +
labs(title='Bäume der Stadt Konstanz (Stammumfang)', x='Stammumfang [cm]', y='Anzahl Bäume') +
theme_bw()
Abbildung: Verteilung des Stammumfangs der Bäume der Stadt Konstanz.
bb <- c(9.12, 47.65, 9.22, 47.70)
map <- get_stamenmap(bb, maptype="terrain", zoom=15)
data <- kataster %>%
filter(!is.na(stammumfang)) %>%
filter(x >= bb[1] & x <= bb[3]) %>%
filter(y >= bb[2] & y <= bb[4]) %>%
arrange(stammumfang)
size <- data$stammumfang / 250
ggmap(map) +
geom_point(data=data, aes(x=x, y=y, color=stammumfang), size=size, alpha=0.5) +
labs(title='Bäume der Stadt Konstanz (Stammumfang)') +
theme_void() +
theme(legend.position="bottom") +
scale_color_continuous(name='Stammumfang in Zentimeter')
Abbildung: Verteilung der Bäume der Stadt Konstanz über das Stadtgebiet, hervorgehoben ist der Stammumfang der eingezeichneten Bäume.
Das Baumkataster der Stadt Konstanzer enthält 5 Einträge ohne einen gültigen Wert für die Höhe.
ggplot(kataster %>% filter(!is.na(hoehe))) +
geom_histogram(aes(x=hoehe), binwidth=1) +
labs(title='Bäume der Stadt Konstanz (Höhe)', x='Höhe [m]', y='Anzahl Bäume') +
theme_bw()
Abbildung: Verteilung der Höhe der Bäume der Stadt Konstanz.
bb <- c(9.12, 47.65, 9.22, 47.70)
map <- get_stamenmap(bb, maptype="terrain", zoom=15)
data <- kataster %>%
filter(!is.na(hoehe)) %>%
filter(x >= bb[1] & x <= bb[3]) %>%
filter(y >= bb[2] & y <= bb[4]) %>%
arrange(hoehe)
size <- data$hoehe / 10
ggmap(map) +
geom_point(data=data, aes(x=x, y=y, color=hoehe), size=size, alpha=0.5) +
labs(title='Bäume der Stadt Konstanz (Höhe)') +
theme_void() +
theme(legend.position="bottom") +
scale_color_continuous(name='Höhe in Meter')
Abbildung: Verteilung der Bäume der Stadt Konstanz über das Stadtgebiet, hervorgehoben ist die Höhe der eingezeichneten Bäume.
Das Baumkataster der Stadt Konstanzer enthält 0 Einträge ohne einen gültigen Wert für den Kronendurchmesser.
ggplot(kataster %>% filter(!is.na(kronendurchmesser))) +
geom_histogram(aes(x=kronendurchmesser), binwidth=1) +
labs(title='Bäume der Stadt Konstanz (Kronendurchmesser)', x='Kronendurchmesser [m]', y='Anzahl Bäume') +
theme_bw()
Abbildung: Verteilung des Kronendurchmessers der Bäume der Stadt Konstanz.
bb <- c(9.12, 47.65, 9.22, 47.70)
map <- get_stamenmap(bb, maptype="terrain", zoom=15)
data <- kataster %>%
filter(!is.na(kronendurchmesser)) %>%
filter(x >= bb[1] & x <= bb[3]) %>%
filter(y >= bb[2] & y <= bb[4]) %>%
arrange(kronendurchmesser)
size <- data$kronendurchmesser / 10
ggmap(map) +
geom_point(data=data, aes(x=x, y=y, color=kronendurchmesser), size=size, alpha=0.5) +
labs(title='Bäume der Stadt Konstanz (Kronendurchmesser)') +
theme_void() +
theme(legend.position="bottom") +
scale_color_continuous(name='Kronendurchmesser in Meter')
Abbildung: Verteilung der Bäume der Stadt Konstanz über das Stadtgebiet, hervorgehoben ist der Kronendurchmesser der eingezeichneten Bäume.
Der Standort mit den mit Abstand meisten Bäumen ist der Hauptfriedhof. Dort lebt es sich offensichtöich am gesündesten. Das Baumkataster der Stadt Konstanzer enthält 0 Einträge ohne einen gültigen Wert für den Standort.
N <- 75
data <- kataster %>%
filter(!is.na(name_de)) %>%
group_by(standort) %>%
summarize(n = n()) %>%
filter(n > N) %>%
arrange(desc(n))
ggplot(data) +
geom_bar(aes(x=reorder(standort, -n), y=n), stat = "identity") +
labs(title=paste0('Bäume der Stadt Konstanz (Standort), Anzahl > ', N), x='Standort', y='Anzahl Bäume') +
theme_bw() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Abbildung: Verteilung der Standorte der Bäume der Stadt Konstanz im Stadtgebiet für Standorte mit mehr als 75 Bäumen.
bb <- c(9.08, 47.65, 9.22, 47.75)
map <- get_stamenmap(bb, maptype="terrain", zoom=14)
data <- kataster %>%
filter(!is.na(y))
ggmap(map) +
geom_point(data=data, aes(x=x, y=y), size=0.25, alpha=0.25) +
labs(title='Bäume der Stadt Konstanz (Standorte)') +
theme_void() +
theme(legend.position="bottom")
Abbildung: Verteilung der Bäume der Stadt Konstanz über das Stadtgebiet.
Die Sauerstoffproduktion eines Baums ist proportional zu seinem Druchmesser in Brusthöhe (Novak 2007b). Mit einem Durchmesser von 2.54–7.62 cm produzieren Bäume ≈2.9 kg O2/Jahr; mit 22.86–30.48 cm: 22.6 kg O2/Jahr; 45.72–53.34 cm: 45.6 kg O2/Jahr; 68.58–76.2 cm: 91.1 kg O2/Jahr; und mit mehr als 76.2 cm: 110.3 kg O2/Jahr. Zwischenwerte habe ich gemittelt.
# O2 Produktion in Kilogram pro Jahr.
dfs = list(
# Novak (2007b)
kataster %>%
filter(stammumfang/pi <= to_centimeter(3)) %>%
mutate(o2_produktion = 2.9),
#
kataster %>%
filter((stammumfang/pi > to_centimeter(3)) & (stammumfang/pi < to_centimeter(9))) %>%
mutate(o2_produktion = (2.9 + 22.6)/2),
# Novak (2007b)
kataster %>%
filter((stammumfang/pi >= to_centimeter(9)) & (stammumfang/pi <= to_centimeter(12))) %>%
mutate(o2_produktion = 22.6),
#
kataster %>%
filter((stammumfang/pi > to_centimeter(12)) & (stammumfang/pi < to_centimeter(18))) %>%
mutate(o2_produktion = (22.6 + 45.6)/2),
# Novak (2007b)
kataster %>%
filter((stammumfang/pi >= to_centimeter(18)) & (stammumfang/pi <= to_centimeter(21) )) %>%
mutate(o2_produktion = 45.6),
#
kataster %>%
filter((stammumfang/pi > to_centimeter(21)) & (stammumfang/pi < to_centimeter(27))) %>%
mutate(o2_produktion = (45.6 + 91.1)/2),
# Novak (2007b)
kataster %>%
filter((stammumfang/pi >= to_centimeter(27)) & (stammumfang/pi <= to_centimeter(30) )) %>%
mutate(o2_produktion = 91.1),
# Novak (2007b)
kataster %>% filter(stammumfang/pi > to_centimeter(30)) %>%
mutate(o2_produktion = 110.3)
)
kataster <- do.call('rbind', dfs)
o2_produktion = sum(kataster$o2_produktion)/1000
Die Bäume der Stadt Konstanz erzeugen somit pro Jahr 562.9328 Tonnen O2.
bb <- c(9.08, 47.65, 9.22, 47.75)
map <- get_stamenmap(bb, maptype="terrain", zoom=14)
data <- kataster %>%
filter(!is.na(o2_produktion)) %>%
filter(x >= bb[1] & x <= bb[3]) %>%
filter(y >= bb[2] & y <= bb[4]) %>%
arrange(o2_produktion)
size <- data$o2_produktion / 75
ggmap(map) +
geom_point(data=data, aes(x=x, y=y, color=o2_produktion), size=size, alpha=0.25) +
labs(title=expression('Bäume der Stadt Konstanz ('*O[2]*'-Produktion)')) +
theme_void() +
theme(legend.position="bottom") +
scale_color_continuous(name=expression('Kilogramm '*O[2]*' pro Jahr'), low = "black", high = "green")
Abbildung: Verteilung der Bäume der Stadt Konstanz im Stadtgebiet, hervorgehoben ist die O2-Produktion der eingezeichneten Bäume.
Die Kohlendioxidaufnahme eines Baums ist proportional zu seinem Druchmesser in Brusthöhe (Novak 2007a). Mit einem Durchmesser von 2.54–7.62 cm nehmen Bäume ≈0.091172 kg CO2/Jahr auf; mit 7.62–15.24 cm: 2.5854744 kg CO2/Jahr; 15.24–22.86 cm: 4.6719976 kg CO2/Jahr; 68.58–76.2 cm: 91.1 kg O2/Jahr; und mit mehr als 76.2 cm: 110.3 kg O2/Jahr. Zwischenwerte habe ich gemittelt.
# CO2 Aufnahme in Kilogram pro Jahr.
dfs = list(
# Novak (2007a)
# kataster %>%
# filter(stammumfang/pi <= to_centimeter(3)) %>%
# mutate(co2_aufnahme = ),
# Novak (2007a)
kataster %>%
filter((stammumfang/pi > to_centimeter(3)) & (stammumfang/pi <= to_centimeter(6))) %>%
mutate(co2_aufnahme = to_kilogram(5.7)),
# Novak (2007a)
kataster %>%
filter((stammumfang/pi > to_centimeter(6)) & (stammumfang/pi <= to_centimeter(9))) %>%
mutate(co2_aufnahme = to_kilogram(10.3)),
# Novak (2007a)
kataster %>%
filter((stammumfang/pi > to_centimeter(9)) & (stammumfang/pi <= to_centimeter(12))) %>%
mutate(co2_aufnahme = to_kilogram(16.8)),
# Novak (2007a)
kataster %>%
filter((stammumfang/pi > to_centimeter(12)) & (stammumfang/pi <= to_centimeter(15) )) %>%
mutate(co2_aufnahme = to_kilogram(21.2)),
# Novak (2007a)
kataster %>%
filter((stammumfang/pi > to_centimeter(15)) & (stammumfang/pi <= to_centimeter(18))) %>%
mutate(co2_aufnahme = to_kilogram(31.4)),
# Novak (2007a)
kataster %>%
filter((stammumfang/pi > to_centimeter(18)) & (stammumfang/pi <= to_centimeter(21) )) %>%
mutate(co2_aufnahme = 42.7),
# Novak (2007a)
kataster %>%
filter((stammumfang/pi > to_centimeter(21)) & (stammumfang/pi <= to_centimeter(24) )) %>%
mutate(co2_aufnahme = 45.6),
# Novak (2007a)
kataster %>%
filter((stammumfang/pi > to_centimeter(24)) & (stammumfang/pi <= to_centimeter(27) )) %>%
mutate(co2_aufnahme = 64.1),
# Novak (2007a)
kataster %>%
filter((stammumfang/pi > to_centimeter(27)) & (stammumfang/pi <= to_centimeter(30) )) %>%
mutate(co2_aufnahme = 65.3),
# Novak (2007a)
kataster %>% filter(stammumfang/pi > to_centimeter(30)) %>%
mutate(co2_aufnahme = 96.9)
)
kataster <- do.call('rbind', dfs)
co2_aufnahme = sum(kataster$co2_aufnahme)/1000
Die Bäume der Stadt Konstanz nehmen somit pro Jahr 360.3572753 Tonnen CO2 auf.
bb <- c(9.08, 47.65, 9.22, 47.75)
map <- get_stamenmap(bb, maptype="terrain", zoom=14)
data <- kataster %>%
filter(!is.na(co2_aufnahme)) %>%
filter(x >= bb[1] & x <= bb[3]) %>%
filter(y >= bb[2] & y <= bb[4]) %>%
arrange(co2_aufnahme)
size <- data$co2_aufnahme / 75
ggmap(map) +
geom_point(data=data, aes(x=x, y=y, color=co2_aufnahme), size=size, alpha=0.25) +
labs(title=expression('Bäume in Konstanz ('*CO[2]*' Aufnahme)')) +
theme_void() +
theme(legend.position="bottom") +
scale_color_continuous(name=expression('Kilogramm '*CO[2]*' pro Jahr'), low = "black", high = "green")
Abbildung: Verteilung der Bäume der Stadt Konstanz im Stadtgebiet, hervorgehoben ist die CO2-Aufnahme der eingezeichneten Bäume.
vororte <- c('Egg', 'Dettingen', 'Dingelsdorf', 'Litzelstetten', 'Wallhausen')
konstanzer <- read.csv("data/Einwohner_nach_Stadtviertel 2010-2019.csv", sep=";", na.strings=c('','*)')) %>%
# Fehlende Daten werden herausgefiltert.
filter(complete.cases(.)) %>%
# Es lebe ASCII, UTF-8 und andere Unwägbarkeiten.
mutate(STADTTEIL = fct_collapse(STADTTEIL, 'Fürstenberg' = c('Fuerstenberg'))) %>%
mutate(STADTTEIL = fct_collapse(STADTTEIL, 'Königsbau' = c('Koenigsbau'))) %>%
# Einige Variablenamen etwas leiser stellen.
rename(Stadtteil = STADTTEIL) %>%
rename(Stadtviertel = STADTVIERTEL) %>%
# Hurrga! Pivot Zeilen rausschmeißen.
filter(nchar(Stadtviertel) != 3) %>%
filter(Stadtteil != 'Stadt Konstanz') %>%
# Zusätzliches Merkmal: (Pseudo-) Verwaltungseinheit.
mutate(Verwaltungseinheit = as.factor(ifelse(Stadtteil %in% vororte, 'Vorort', 'Stadt'))) %>%
# Besserere Variablename (IMHO) in diesem Kontext.
mutate(Stichtag = as.Date(Stand_Einwohner, "%d.%m.%y")) %>%
# Unbenötigte Einwohnerdaten entfernen.
select(-EINW_HW_GESAMT, -EINW_HW_FRAUEN, -EINW_HW_DEUTSCH, -EINW_HW_AUSLAENDER) %>%
# Altersklassen bilden.
gather(key="Altersklasse", value="Anzahl", starts_with("EINW_HW")) %>%
mutate(Altersklasse = factor(Altersklasse)) %>%
mutate(Altersklasse = fct_recode(Altersklasse, 'unter 18'='EINW_HW_unter18')) %>%
mutate(Altersklasse = fct_recode(Altersklasse, '18 bis unter 30'='EINW_HW_18_bis_unter_30')) %>%
mutate(Altersklasse = fct_recode(Altersklasse, '30 bis unter 40'='EINW_HW_30_bis_unter_40')) %>%
mutate(Altersklasse = fct_recode(Altersklasse, '40 bis unter 50'='EINW_HW_40_bis_unter_50')) %>%
mutate(Altersklasse = fct_recode(Altersklasse, '50 bis unter 60'='EINW_HW_50_bis_unter_60')) %>%
mutate(Altersklasse = fct_recode(Altersklasse, 'über 60'='EINW_HW_60_und_aelter')) %>%
mutate(Anzahl = as.numeric(Anzahl)) %>%
filter(complete.cases(.)) %>%
group_by(Stadtteil, Verwaltungseinheit, Stichtag, Altersklasse) %>%
summarize(Anzahl = sum(Anzahl, na.rm=TRUE), .groups='drop')
# Anordnung der Alterklassenbezeichnungen anordnen.
konstanzer$Altersklasse = factor(konstanzer$Altersklasse,levels(konstanzer$Altersklasse)[c(6,1:5)])
konstanzer %>%
filter(Stichtag==as.Date('31.12.2019','%d.%m.%Y') | Stichtag==as.Date('31.12.2010','%d.%m.%Y')) %>%
filter(Verwaltungseinheit=='Stadt') %>%
mutate(Stichtag = as.factor(Stichtag)) %>%
ggplot() +
geom_bar(aes(x=Altersklasse, y=Anzahl, fill=Stichtag), stat = "identity", position='dodge') +
facet_wrap(Stadtteil~., ncol=3) +
coord_flip() +
labs(x='Altersklasse', y='Anzahl Einwohner', title='Einwohner nach Altersklasse (Konstanz Stadt)') +
theme_bw() +
theme(legend.position="bottom")
Abbildung: Verteilung der Konstanzer Einwohner (Stadt) auf Altersklassen.
konstanzer %>%
filter(Stichtag==as.Date('31.12.2019','%d.%m.%Y') | Stichtag==as.Date('31.12.2010','%d.%m.%Y')) %>%
filter(Verwaltungseinheit=='Vorort') %>%
mutate(Stichtag = as.factor(Stichtag)) %>%
ggplot() +
geom_bar(aes(x=Altersklasse, y=Anzahl, fill=Stichtag), stat = "identity", position='dodge') +
facet_wrap(Stadtteil~., ncol=3) +
coord_flip() +
labs(x='Altersklasse', y='Anzahl Einwohner', title='Einwohner nach Altersklasse (Konstanz Vororte)') +
theme_bw() +
theme(legend.position="bottom")
Abbildung: Verteilung der Konstanzer Einwohner (Vororte) auf Altersklassen.
Erwachsene Konstanzer im Jahr 2019
erwachsene <- konstanzer %>%
filter(Stichtag == as.Date('31.12.2019','%d.%m.%Y')) %>%
filter(Altersklasse != 'unter 18')
sum(erwachsene$Anzahl)
## [1] 72548
# O2 Verbrauch in Kilogram pro Jahr.
# Perry 2003
erwachsene$o2_verbrauch = erwachsene$Anzahl * 0.84 * 365
O2-Verbrauch der erwachsenen Konstanzer in Tonnen pro Jahr
# O2 Verbrauch in Kilogram pro Jahr.
o2_verbrauch = sum(erwachsene$o2_verbrauch)/1000
o2_verbrauch
## [1] 22243.22
# CO2 Produktion in Kilogram pro Jahr.
# Perry 2003
erwachsene$co2_produktion = erwachsene$Anzahl * 1.00 * 365
CO2-Produktion der erwachsenen Konstanzer in Tonnen pro Jahr
co2_produktion = sum(erwachsene$co2_produktion)/1000
co2_produktion
## [1] 26480.02
Elementare O2 Bilanz in Tonnen pro Jahr
o2_bilanz <- o2_produktion - o2_verbrauch
o2_bilanz
## [1] -21680.28
Elementare CO2 Bilanz in Tonnen pro Jahr
co2_bilanz = co2_produktion - co2_aufnahme
co2_bilanz
## [1] 26119.66
Die O2 Bilanz ist negativ, dh es wird mehr Sauerstoff von den Konstanzer Einwohnern verbraucht als von den Bäumen der Stadt Konstanz hergestellt wird.
Die CO2 Bilanz ist positiv, dh es wird mehr Kohlendioxid von den Konstanzer Einwohnern erzeugt als von den Bäumen der Stadt Konstanz aufgenommen wird wird.
Ermöglicht wurde das ganze im Rahmen HACK AND HARVEST Hackathon 2021 mit:
Nowak, David J.; Hoehn, Robert E. III, Crane, Daniel E.; Stevens, Jack C.; Walton, Jeffrey T. (2007a) Assessing urban forest effects and values, New York City’s urban forest. Resour. Bull. NRS-9. Newtown Square, PA: U.S. Department of Agriculture, Forest Service, Northern Research Station. 22 p. Heruntergeladen am 16.04.2021 von hier
Nowak, David J.; Crane, Daniel E. (2007b) Oxygen production by urban trees in the United States; Arboriculture & Urban Forestry 33(3); Heruntergeladen am 16.04.2021 von hier
Perry, J.; LeVan, M.D. (2003) Air Purification in Closed Environments: Overview of Spacecraft Systems. U.S. Army Natrick Soldier Center.; Heruntergeladen am 17.04.2021 von hier
to_centimeter <- function(inch) return(inch*2.54)
to_kilogram <- function(lbs) return(lbs*0.453592)
trim <- function (x) gsub("^\\s+|\\s+$", "", x)