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)

Explorative Datenanalyse

Bäume der Sadt Konstanz

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.

Gattungen

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

Arten

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.

Stammumfang

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.

Höhe

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.

Kronendurchmesser

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.

Standort

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.

O2 Produktion

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.

CO2 Aufnahme

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.

Konstanzer

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

# 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

# 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

Bilanz

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

Zusammenfassung

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.

Shout-Out

Ermöglicht wurde das ganze im Rahmen HACK AND HARVEST Hackathon 2021 mit:

  1. Offene Daten (Baumkataster der Stadt Konstanz, Konstanzer Einwohner nach Stadvierteln 2010-2019)
  2. Freier Zugriff auf Forschungsergebnisse (siehe Literatur)
  3. Frei erhältliche Software (R, RStudio, tidyverse, …)

Literatur

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

Anhang

to_centimeter <- function(inch) return(inch*2.54)
to_kilogram <- function(lbs) return(lbs*0.453592)
trim <- function (x) gsub("^\\s+|\\s+$", "", x)