cma-week6

library(readr)
library(sf)
Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(lubridate)

Attaching package: 'lubridate'
The following objects are masked from 'package:base':

    date, intersect, setdiff, union
library(ggplot2)
library(terra)
terra 1.8.80
library(tmap)
wildschwein_BE <- read_delim("wildschwein_BE_2056.csv", delim = ",") |>
  st_as_sf(coords = c("E", "N"), crs = 2056, remove = FALSE)
Rows: 51246 Columns: 6
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (2): TierID, TierName
dbl  (3): CollarID, E, N
dttm (1): DatetimeUTC

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
wildschwein_BE
Simple feature collection with 51246 features and 6 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 2568153 ymin: 1202306 xmax: 2575154 ymax: 1207609
Projected CRS: CH1903+ / LV95
# A tibble: 51,246 × 7
   TierID TierName CollarID DatetimeUTC                E        N
 * <chr>  <chr>       <dbl> <dttm>                 <dbl>    <dbl>
 1 002A   Sabi        12275 2014-08-22 21:00:12 2570409. 1204752.
 2 002A   Sabi        12275 2014-08-22 21:15:16 2570402. 1204863.
 3 002A   Sabi        12275 2014-08-22 21:30:43 2570394. 1204826.
 4 002A   Sabi        12275 2014-08-22 21:46:07 2570379. 1204817.
 5 002A   Sabi        12275 2014-08-22 22:00:22 2570390. 1204818.
 6 002A   Sabi        12275 2014-08-22 22:15:10 2570390. 1204825.
 7 002A   Sabi        12275 2014-08-22 22:30:13 2570387. 1204831.
 8 002A   Sabi        12275 2014-08-22 22:45:11 2570381. 1204840.
 9 002A   Sabi        12275 2014-08-22 23:00:27 2570316. 1204935.
10 002A   Sabi        12275 2014-08-22 23:15:41 2570393. 1204815.
# ℹ 51,236 more rows
# ℹ 1 more variable: geometry <POINT [m]>

Task 1 — Import and explore vector data

fanel <- read_sf("Feldaufnahmen_Fanel.gpkg")
# View the dataset
fanel
Simple feature collection with 975 features and 2 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 2568099 ymin: 1199766 xmax: 2578824 ymax: 1207836
Projected CRS: CH1903+ / LV95
# A tibble: 975 × 3
   FieldID Frucht                                                           geom
     <dbl> <chr>                                                   <POLYGON [m]>
 1       1 Roggen ((2570914 1202743, 2570917 1202749, 2570985 1202833, 2571294 …
 2       0 <NA>   ((2570893 1202758, 2570893 1202758, 2570959 1202845, 2570985 …
 3       0 <NA>   ((2570868 1202776, 2570872 1202781, 2570913 1202828, 2570946 …
 4       2 Wiese  ((2570882 1203234, 2570641 1202974, 2570630 1202983, 2570606 …
 5       3 Weide  ((2570249 1203116, 2570371 1203328, 2570481 1203197, 2570390 …
 6       5 Weide  ((2570378 1203320, 2570466 1203436, 2570552 1203289, 2570481 …
 7       6 Weide  ((2570466 1203436, 2570572 1203495, 2570659 1203433, 2570659 …
 8       4 Weide  ((2569706 1203278, 2569706 1203342, 2570199 1203198, 2570223 …
 9       7 Wiese  ((2570804 1203310, 2570805 1203312, 2570900 1203608, 2571208 …
10       0 Wald   ((2571004 1202990, 2571041 1203029, 2571073 1203003, 2571035 …
# ℹ 965 more rows
# What information does it contain?
names(fanel)
[1] "FieldID" "Frucht"  "geom"   
head(fanel)
Simple feature collection with 6 features and 2 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 2570249 ymin: 1202176 xmax: 2571719 ymax: 1203436
Projected CRS: CH1903+ / LV95
# A tibble: 6 × 3
  FieldID Frucht                                                            geom
    <dbl> <chr>                                                    <POLYGON [m]>
1       1 Roggen ((2570914 1202743, 2570917 1202749, 2570985 1202833, 2571294 1…
2       0 <NA>   ((2570893 1202758, 2570893 1202758, 2570959 1202845, 2570985 1…
3       0 <NA>   ((2570868 1202776, 2570872 1202781, 2570913 1202828, 2570946 1…
4       2 Wiese  ((2570882 1203234, 2570641 1202974, 2570630 1202983, 2570606 1…
5       3 Weide  ((2570249 1203116, 2570371 1203328, 2570481 1203197, 2570390 1…
6       5 Weide  ((2570378 1203320, 2570466 1203436, 2570552 1203289, 2570481 1…
summary(fanel)
    FieldID         Frucht                     geom    
 Min.   :  0.0   Length:975         POLYGON      :975  
 1st Qu.:112.5   Class :character   epsg:2056    :  0  
 Median :354.0   Mode  :character   +proj=some...:  0  
 Mean   :399.4                                         
 3rd Qu.:722.5                                         
 Max.   :968.0                                         
# What geometry type?
st_geometry_type(fanel)
  [1] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [10] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [19] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [28] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [37] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [46] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [55] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [64] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [73] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [82] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
 [91] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[100] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[109] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[118] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[127] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[136] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[145] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[154] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[163] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[172] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[181] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[190] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[199] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[208] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[217] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[226] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[235] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[244] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[253] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[262] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[271] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[280] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[289] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[298] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[307] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[316] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[325] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[334] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[343] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[352] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[361] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[370] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[379] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[388] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[397] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[406] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[415] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[424] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[433] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[442] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[451] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[460] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[469] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[478] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[487] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[496] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[505] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[514] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[523] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[532] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[541] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[550] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[559] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[568] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[577] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[586] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[595] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[604] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[613] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[622] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[631] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[640] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[649] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[658] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[667] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[676] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[685] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[694] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[703] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[712] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[721] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[730] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[739] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[748] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[757] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[766] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[775] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[784] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[793] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[802] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[811] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[820] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[829] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[838] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[847] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[856] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[865] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[874] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[883] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[892] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[901] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[910] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[919] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[928] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[937] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[946] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[955] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[964] POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON POLYGON
[973] POLYGON POLYGON POLYGON
18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT ... TRIANGLE
# What are the data types of the columns?
str(fanel)
sf [975 × 3] (S3: sf/tbl_df/tbl/data.frame)
 $ FieldID: num [1:975] 1 0 0 2 3 5 6 4 7 0 ...
 $ Frucht : chr [1:975] "Roggen" NA NA "Wiese" ...
 $ geom   :sfc_POLYGON of length 975; first list element: List of 1
  ..$ : num [1:12, 1:2] 2570914 2570917 2570985 2571294 2571719 ...
  ..- attr(*, "class")= chr [1:3] "XY" "POLYGON" "sfg"
 - attr(*, "sf_column")= chr "geom"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA
  ..- attr(*, "names")= chr [1:2] "FieldID" "Frucht"
# What is the coordinate system?
st_crs(fanel)
Coordinate Reference System:
  User input: CH1903+ / LV95 
  wkt:
PROJCRS["CH1903+ / LV95",
    BASEGEOGCRS["CH1903+",
        DATUM["CH1903+",
            ELLIPSOID["Bessel 1841",6377397.155,299.1528128,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",4150]],
    CONVERSION["Swiss Oblique Mercator 1995",
        METHOD["Hotine Oblique Mercator (variant B)",
            ID["EPSG",9815]],
        PARAMETER["Latitude of projection centre",46.9524055555556,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8811]],
        PARAMETER["Longitude of projection centre",7.43958333333333,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8812]],
        PARAMETER["Azimuth at projection centre",90,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8813]],
        PARAMETER["Angle from Rectified to Skew Grid",90,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8814]],
        PARAMETER["Scale factor at projection centre",1,
            SCALEUNIT["unity",1],
            ID["EPSG",8815]],
        PARAMETER["Easting at projection centre",2600000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8816]],
        PARAMETER["Northing at projection centre",1200000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8817]]],
    CS[Cartesian,2],
        AXIS["(E)",east,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["(N)",north,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["Cadastre, engineering survey, topographic mapping (large and medium scale)."],
        AREA["Liechtenstein; Switzerland."],
        BBOX[45.82,5.96,47.81,10.49]],
    ID["EPSG",2056]]
# visualise
#plot(fanel)tm_shape(fanel) + tm_polygons()

Task 2 — Annotate trajectories with crop data

names(wildschwein_BE)
[1] "TierID"      "TierName"    "CollarID"    "DatetimeUTC" "E"          
[6] "N"           "geometry"   
str(wildschwein_BE)
sf [51,246 × 7] (S3: sf/spec_tbl_df/tbl_df/tbl/data.frame)
 $ TierID     : chr [1:51246] "002A" "002A" "002A" "002A" ...
 $ TierName   : chr [1:51246] "Sabi" "Sabi" "Sabi" "Sabi" ...
 $ CollarID   : num [1:51246] 12275 12275 12275 12275 12275 ...
 $ DatetimeUTC: POSIXct[1:51246], format: "2014-08-22 21:00:12" "2014-08-22 21:15:16" ...
 $ E          : num [1:51246] 2570409 2570402 2570394 2570379 2570390 ...
 $ N          : num [1:51246] 1204752 1204863 1204826 1204817 1204818 ...
 $ geometry   :sfc_POINT of length 51246; first list element:  'XY' num [1:2] 2570409 1204752
 - attr(*, "spec")=
  .. cols(
  ..   TierID = col_character(),
  ..   TierName = col_character(),
  ..   CollarID = col_double(),
  ..   DatetimeUTC = col_datetime(format = ""),
  ..   E = col_double(),
  ..   N = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
 - attr(*, "sf_column")= chr "geometry"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA
  ..- attr(*, "names")= chr [1:6] "TierID" "TierName" "CollarID" "DatetimeUTC" ...
#Make sure DatetimeUTC  is treated as date-time:
wildschwein_BE <- wildschwein_BE |>
  mutate(DatetimeUTC = ymd_hms(DatetimeUTC))

# Filter may and june 
wildschwein_may_june <- wildschwein_BE |>
  filter(month(DatetimeUTC) %in% c(5, 6))
wildschwein_may_june
Simple feature collection with 15559 features and 6 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 2568174 ymin: 1203130 xmax: 2574285 ymax: 1207596
Projected CRS: CH1903+ / LV95
# A tibble: 15,559 × 7
   TierID TierName CollarID DatetimeUTC                E        N
 * <chr>  <chr>       <dbl> <dttm>                 <dbl>    <dbl>
 1 002A   Sabi        12275 2015-05-01 00:00:17 2570093. 1205256.
 2 002A   Sabi        12275 2015-05-01 00:15:25 2570093. 1205249.
 3 002A   Sabi        12275 2015-05-01 00:30:15 2570091. 1205253.
 4 002A   Sabi        12275 2015-05-01 00:45:15 2570059. 1205242.
 5 002A   Sabi        12275 2015-05-01 01:00:30 2570078. 1205246.
 6 002A   Sabi        12275 2015-05-01 01:15:43 2570096. 1205256.
 7 002A   Sabi        12275 2015-05-01 01:30:17 2570079. 1205247.
 8 002A   Sabi        12275 2015-05-01 01:45:18 2570094. 1205248.
 9 002A   Sabi        12275 2015-05-01 02:00:45 2570044. 1205212.
10 002A   Sabi        12275 2015-05-01 02:15:22 2570025. 1205217.
# ℹ 15,549 more rows
# ℹ 1 more variable: geometry <POINT [m]>
#Overlay wild boar points and Fanel polygons:
ggplot() +
  geom_sf(data = fanel) +
  geom_sf(data = wildschwein_may_june, size = 0.5)

#spatially join the crop data to the wild boar points:
wildschwein_crop <- st_join(wildschwein_may_june, fanel)

wildschwein_crop
Simple feature collection with 15559 features and 8 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 2568174 ymin: 1203130 xmax: 2574285 ymax: 1207596
Projected CRS: CH1903+ / LV95
# A tibble: 15,559 × 9
   TierID TierName CollarID DatetimeUTC                E        N
 * <chr>  <chr>       <dbl> <dttm>                 <dbl>    <dbl>
 1 002A   Sabi        12275 2015-05-01 00:00:17 2570093. 1205256.
 2 002A   Sabi        12275 2015-05-01 00:15:25 2570093. 1205249.
 3 002A   Sabi        12275 2015-05-01 00:30:15 2570091. 1205253.
 4 002A   Sabi        12275 2015-05-01 00:45:15 2570059. 1205242.
 5 002A   Sabi        12275 2015-05-01 01:00:30 2570078. 1205246.
 6 002A   Sabi        12275 2015-05-01 01:15:43 2570096. 1205256.
 7 002A   Sabi        12275 2015-05-01 01:30:17 2570079. 1205247.
 8 002A   Sabi        12275 2015-05-01 01:45:18 2570094. 1205248.
 9 002A   Sabi        12275 2015-05-01 02:00:45 2570044. 1205212.
10 002A   Sabi        12275 2015-05-01 02:15:22 2570025. 1205217.
# ℹ 15,549 more rows
# ℹ 3 more variables: geometry <POINT [m]>, FieldID <dbl>, Frucht <chr>
names(wildschwein_crop)
[1] "TierID"      "TierName"    "CollarID"    "DatetimeUTC" "E"          
[6] "N"           "geometry"    "FieldID"     "Frucht"     
#Now each wild boar location should have additional crop/field information from the polygon it falls into.

Task 3 — Explore annotated trajectories

names(wildschwein_crop)
[1] "TierID"      "TierName"    "CollarID"    "DatetimeUTC" "E"          
[6] "N"           "geometry"    "FieldID"     "Frucht"     
#add the hour of the day
wildschwein_crop <- wildschwein_crop |>
  mutate(hour = hour(DatetimeUTC))

head(wildschwein_crop)
Simple feature collection with 6 features and 9 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 2570059 ymin: 1205242 xmax: 2570096 ymax: 1205256
Projected CRS: CH1903+ / LV95
# A tibble: 6 × 10
  TierID TierName CollarID DatetimeUTC                E        N
  <chr>  <chr>       <dbl> <dttm>                 <dbl>    <dbl>
1 002A   Sabi        12275 2015-05-01 00:00:17 2570093. 1205256.
2 002A   Sabi        12275 2015-05-01 00:15:25 2570093. 1205249.
3 002A   Sabi        12275 2015-05-01 00:30:15 2570091. 1205253.
4 002A   Sabi        12275 2015-05-01 00:45:15 2570059. 1205242.
5 002A   Sabi        12275 2015-05-01 01:00:30 2570078. 1205246.
6 002A   Sabi        12275 2015-05-01 01:15:43 2570096. 1205256.
# ℹ 4 more variables: geometry <POINT [m]>, FieldID <dbl>, Frucht <chr>,
#   hour <int>
#Count how many wild boar points are in each crop per hour
crop_hour <- wildschwein_crop |>
  st_drop_geometry() |>
  filter(!is.na(Frucht)) |>
  group_by(hour, Frucht) |>
  summarise(n = n(), .groups = "drop")
crop_hour
# A tibble: 213 × 3
    hour Frucht           n
   <int> <chr>        <int>
 1     0 Acker           14
 2     0 Bohnen          62
 3     0 Chinaschilf      2
 4     0 Feuchtgebiet    28
 5     0 Gerste          91
 6     0 Kartoffeln       6
 7     0 Kohlrabi         5
 8     0 Mais            32
 9     0 Raps             5
10     0 Rueben          38
# ℹ 203 more rows
#Convert counts into percentages
crop_hour <- crop_hour |>
  group_by(hour) |>
  mutate(percent = n / sum(n) * 100)
crop_hour
# A tibble: 213 × 4
# Groups:   hour [24]
    hour Frucht           n percent
   <int> <chr>        <int>   <dbl>
 1     0 Acker           14   2.33 
 2     0 Bohnen          62  10.3  
 3     0 Chinaschilf      2   0.333
 4     0 Feuchtgebiet    28   4.66 
 5     0 Gerste          91  15.1  
 6     0 Kartoffeln       6   0.998
 7     0 Kohlrabi         5   0.832
 8     0 Mais            32   5.32 
 9     0 Raps             5   0.832
10     0 Rueben          38   6.32 
# ℹ 203 more rows
#Plot the percentage of crop visits per hour
ggplot(crop_hour, aes(x = hour, y = percent, fill = Frucht)) +
  geom_col() +
  labs(
    title = "Percentage of wild boar locations by crop and hour",
    x = "Hour of day",
    y = "Percentage of samples",
    fill = "Crop"
  )

#keep only the most common crops
top_crops <- wildschwein_crop |>
  st_drop_geometry() |>
  filter(!is.na(Frucht)) |>
  count(Frucht, sort = TRUE) |>
  slice_head(n = 5) |>
  pull(Frucht)
top_crops
[1] "Wald"         "Feuchtgebiet" "Gerste"       "Rueben"       "Bohnen"      
#Filter the dataset to only those crops
crop_hour_top <- crop_hour |>
  filter(Frucht %in% top_crops)

#plot 
ggplot(crop_hour_top, aes(x = hour, y = percent, fill = Frucht)) +
  geom_col() +
  labs(
    title = "Most common crop visits by hour",
    x = "Hour of day",
    y = "Percentage of samples",
    fill = "Crop"
  )

Task 4 — Import and visualize raster data

veg_height <- rast("vegetationshoehe_LFI.tif")

plot(veg_height)

tm_shape(veg_height) +
  tm_raster(title = "Vegetation height")
── tmap v3 code detected ───────────────────────────────────────────────────────
[v3->v4] `tm_raster()`: migrate the argument(s) related to the legend of the
visual variable `col` namely 'title' to 'col.legend = tm_legend(<HERE>)'
SpatRaster object downsampled to 2753 by 3634 cells.

Task 5 — Annotate trajectories with raster data

wildschwein_vect <- vect(wildschwein_BE)
#Extract vegetation height values at each wild boar location:
veg_values <- terra::extract(veg_height, wildschwein_vect)

#Add the extracted raster value back to your wild boar data:
wildschwein_veg <- wildschwein_BE |>
  mutate(vegetationshoehe_LFI = veg_values[[2]])

#vegetation height by hour
wildschwein_veg <- wildschwein_veg |>
  mutate(hour = hour(DatetimeUTC))

ggplot(wildschwein_veg, aes(x = hour, y = vegetationshoehe_LFI)) +
  geom_boxplot(aes(group = hour)) +
  labs(
    x = "Hour of day",
    y = "Vegetation height",
    title = "Vegetation height used by wild boar by hour"
  )
Warning: Removed 11 rows containing non-finite outside the scale range
(`stat_boxplot()`).

#by individual wildboar
ggplot(wildschwein_veg, aes(x = TierID, y = vegetationshoehe_LFI)) +
  geom_boxplot() +
  labs(
    x = "Wild boar ID",
    y = "Vegetation height",
    title = "Vegetation height used by each wild boar"
  )
Warning: Removed 11 rows containing non-finite outside the scale range
(`stat_boxplot()`).