data-raw/wildboar.R

############################################

### Masterfile Wildschwein GPS-Locations ###

############################################


# Forschungsgruppe Wildtiermanagement, ZHAW Wädenswil
#
# Projekt Wildschweinschreck; Besenderungsjahre 2014 - 2017
#
# Kontakt: Stefan Suter suts@zhaw.ch / Benjamin Sigrist sigb@zhaw.ch
#
#
# Stand 15.01.2018, sigb
#
#
# Die Wildschweinpositionen wurden in verschiedenen Schritten bereinigt und mit zusätzlichen Attributen anotiert.
#
# Diese umfassten kurz:
#
#
#   1. Einzelne Tiere zusammenfassen, extreme Outlier entfernen (400000 < X > 850000), DatumZeit-Spalte anhängen
#
# => Spalten Tier - ZeitpUTC
#
#
# 2. Anhängen von Infos über die relevanten Tageszeiten, basierend auf dem Mittelpunkt (Lat / Long / Zeitzone UTC) aus Gesamtdatensatz
#
# => sunrise:              Zeitpunkt Sonnenaufgang
#
# sunset:               Zeitpunkt Sonnenuntergang
#
# CivilTwilight_start:  Zeitpunkt zivile Morgendämmerung (Sonne 6° unter dem Horizont)
#
# CiviTwilight_end:     Zeitpunkt zivile Abenddämmerung (Sonne 6° unter dem Horizont)
#
# moonilumination:   Anteil Mondlicht (0 - 1)
#
# nightlength:    Dauer der Nacht in sec
#
# jd:                   Julianischer Tag ab dem 1 Januar 4713 vor Christus (BCE, Before Common Era), R Funktion jd
#
# moonrise:     Zeitpunkt Mondaufgang
#
# moonset:   Zeitpunkt Monduntergang
#
# 3. Einteilung der Positionen in bestimmte Tages/Nachtzeiten
#
# => day:     Tag / Nacht
#
# phase:   Tag / Abenddämmerung / Nacht / Morgendämmerung
#
# quarter: Einteilung der Nacht in 4 Viertel
#
#
# 4. Semantische Anreicherung mit Attributen des Habitats
#
# => MaxVal:       Einteilung in Habitate:  0 = kein Habitat, 1 = Landw., 2 = Wald, 3 = Schilf
#
# Location:     Studiengebiet:           1 = Elfingen, 2 = Felsenau, 3 = Fanel (if x$location is.na remove)
#
# Walddist:     Distanz zum Waldrand:    Einteilung in 5 Meter-Klassen
#
# Jagd:         Jagdverbotsperimeter:    1 = Jagd / 0 = keine Jagd
#
#
# 5. Anreicherungen mit Bewegungsparametern
#
# => Trajectory:   Einzigartige Kennung aus Tier und Collar ID
#
# distance:   Distanz zwischen zwei Positionen in Meter
#
# speed:   Geschwindigkeit zwischen zwei Positionen in m/sec
#
# timelag:      Zeit zwischen zwei Postionen in sec





library(sf)
library(tidyverse)
library(readxl)
library(stringr)


sensitive_data <- "sensitive_data"

wildboarzip <- file.path(sensitive_data, "wildboar.zip")

if(file.exists(wildboarzip)){
  unzip(wildboarzip, exdir = sensitive_data)
} else{
  print(paste("Go to",
              "https://github.com/ComputationalMovementAnalysis/RawDatasets/raw/main/wildboar.zip",
              "and download the zipfile to this directory:",
              sensitive_data))
}

## Import and Clean Wildboar Meta Data #################################


wildschwein_metadata_raw <- read_xlsx(file.path(sensitive_data, "Wildschweine_2018-04-17_METADATEN.xlsx"), 1) %>%
  filter(!is.na(Animal))

wildschwein_metadata <- wildschwein_metadata_raw %>%
  janitor::clean_names() %>%
  mutate(
    animal = case_when(
      animal == "W118"~"WS118",
      animal == "WS098/003"~"WS098",
      animal == "WS109/004"~"WS084", # [1]
      animal == "WS117/79"~"WS117",
      TRUE ~ animal
    ),
    TierID = as.integer(str_extract(animal,"\\d{3}")),
    CollarID = as.integer(halsband_nummer_klein),
    Sex = as_factor(sex),
    TierName = str_extract(name, "[a-zA-Z]+"),
    Gewicht = gewicht,
    Rotte = rotte,
    Alter_monate = alter_monate
  ) %>%
  select(TierID, TierName, CollarID, Sex, Gewicht, Rotte, Alter_monate)

# [1]: This is actually Gaby, I don't know why she got a new ID. Renaming her
# is a bit dangerous, since we need to take care to rename the ID in
# wildschwein.csv as well


## Import and Clean Wildboar Location Data #################################


wildschwein_raw <- read_delim(file.path(sensitive_data, "wildschwein.csv"), ";") %>%
  filter(!is.na(Lat)) %>%
  transmute(Tier, DatetimeUTC = ZeitpUTC, Lat, Long, day, moonilumination)

wildschwein_raw_sf <- st_as_sf(wildschwein_raw, coords = c("Long", "Lat"), crs = 4326)

wildschwein_raw_sf <- wildschwein_raw_sf %>%
  st_transform(2056)

wildschwein <- cbind(st_drop_geometry(wildschwein_raw_sf),st_coordinates(wildschwein_raw_sf)) %>%
  as_tibble() %>%
  rename(E = X, N = Y)

# Removes an single (?) outlier
wildschwein <- wildschwein %>%
  filter(E < 2800000, N < 1300000)

# Manually correct some Names
wildschwein <- wildschwein %>%
  mutate(Tier = case_when(
    Tier == "083_Evel_12842_"~"083_Evel_12842",
    Tier == "058_Chri_1227"~"058_Chri_12274",
    Tier == "109_Gab2_12274"~"084_Gab2_12274", # see comment [1]
    TRUE~Tier)
    ) %>%
  separate(Tier, c("TierID","TierName","CollarID"),convert = TRUE)



# Filtering removing locations after a certain date for the following animal, since it seems the collar
# was not switched off in the field.
wildschwein <- wildschwein %>%
  filter(!(TierID == 25 &  CollarID == 12272 & DatetimeUTC > as.POSIXct("2015-02-26 00:00:00", tz = "UTC"))) %>%
  filter(!(TierID == 83 &  CollarID == 12842 & DatetimeUTC > as.POSIXct("2016-03-06 00:00:00", tz = "UTC"))) %>%
  filter(!(TierID == 83 &  CollarID == 12842 & DatetimeUTC < as.POSIXct("2015-12-08 22:30:00", tz = "UTC")))



# Get centeroids of wildboars to seperate into study areas
wildschwein_centeroid <- wildschwein %>%
  st_as_sf(coords = c("E","N"),crs = 2056) %>%
  group_by(TierID, CollarID) %>%
  summarise() %>%
  st_centroid()

wildschwein_centeroid <- cbind(st_drop_geometry(ungroup(wildschwein_centeroid)), st_coordinates(wildschwein_centeroid))


wildschwein_metadata <- wildschwein_centeroid %>%
  mutate(
    Study_area = case_when(
      Y < 1208000~"Bern",
      Y > 1224000~"Aargau",
      TRUE~"Bern & Aargau"
    )
  ) %>%
  select(TierID, CollarID, Study_area) %>%
  full_join(wildschwein_metadata, by = c("TierID", "CollarID"))


wildschwein <- wildschwein %>%
  # i left TierName until now to make it easy to check if assumptions are correct
  rename(TierNameCheck = TierName) %>%
  left_join(wildschwein_metadata, by = c("TierID", "CollarID")) %>%
  transmute(TierID, TierName, CollarID = as.integer(CollarID), DatetimeUTC, E, N, Study_area, day, moonilumination)

wildschwein_BE <- wildschwein %>%
  filter(Study_area == "Bern") %>%
  select(-Study_area)

wildschwein_metadata <- wildschwein_metadata %>%
  select(TierID, TierName, CollarID, Sex, Gewicht, Study_area)

wildschwein_metadata <- mutate(wildschwein_metadata, CollarID = as.integer(CollarID))

# There are some locations with identical timestamps, remove the first
wildschwein_BE <- wildschwein_BE %>%
  group_by(TierID, TierName, CollarID) %>%
  mutate(
    timelag0 = as.numeric(difftime(lead(DatetimeUTC),DatetimeUTC, units = "secs")) == 0
    ) %>%
  filter(!timelag0) %>%
  select(-timelag0) %>%
  ungroup()


usethis::use_data(wildschwein_BE, overwrite = TRUE)
usethis::use_data(wildschwein_metadata, overwrite = TRUE)
ComputationalMovementAnalysis/ComputationalMovementAnalysisData documentation built on Dec. 17, 2021, 3:04 p.m.