# Appendix 2: Creating your own spatial data

## Load the required pacakges

    pacman::p_load(tidyverse, sf, rnaturalearth, patchwork, prioritizr)
    source("utils-functions.R")

## Create a dataset boundary

    dat_bndry <- tibble(x = 100, y = seq(-50, 0, by = 1)) %>%
      bind_rows(tibble(x = seq(100, 160, by = 1), y = 0)) %>%
      bind_rows(tibble(x = 160, y = seq(0, -50, by = -1))) %>%
      bind_rows(tibble(x = seq(160, 100, by = -1), y = -50)) %>%
      as.matrix() %>%
      list() %>%
      st_polygon() %>%
      st_sfc(crs = "EPSG:4326") %>%
      st_sf() %>%
      st_make_valid()

## Create planning units

    dat_PUs <- st_make_grid(dat_bndry, cellsize = 2) %>%
      st_sf() %>%
      mutate(cellID = row_number()) # Add a cell ID reference

    ggplot() +
      geom_sf(data = dat_PUs)

## Create species data

    dat_species_prob <- dat_PUs %>%
      st_sf() %>%
      mutate(
        Spp1 = runif(n = dim(.)[[1]]),
        Spp2 = runif(n = dim(.)[[1]]),
        Spp3 = runif(n = dim(.)[[1]]),
        Spp4 = runif(n = dim(.)[[1]]),
        Spp5 = runif(n = dim(.)[[1]])
      )
    print(dat_species_prob)

    Simple feature collection with 780 features and 6 fields
    Geometry type: POLYGON
    Dimension:     XY
    Bounding box:  xmin: 100 ymin: -50 xmax: 160 ymax: 2
    Geodetic CRS:  WGS 84
    First 10 features:
       cellID                       geometry        Spp1      Spp2       Spp3
    1       1 POLYGON ((100 -50, 102 -50,... 0.073318975 0.9132673 0.64967977
    2       2 POLYGON ((102 -50, 104 -50,... 0.232265136 0.5278280 0.71378633
    3       3 POLYGON ((104 -50, 106 -50,... 0.005846191 0.1002031 0.70895919
    4       4 POLYGON ((106 -50, 108 -50,... 0.049310110 0.9396838 0.96180804
    5       5 POLYGON ((108 -50, 110 -50,... 0.132347638 0.3551796 0.14346341
    6       6 POLYGON ((110 -50, 112 -50,... 0.927284935 0.5081837 0.40945422
    7       7 POLYGON ((112 -50, 114 -50,... 0.021034951 0.6488039 0.01025041
    8       8 POLYGON ((114 -50, 116 -50,... 0.990886714 0.4781844 0.93609304
    9       9 POLYGON ((116 -50, 118 -50,... 0.012682000 0.4531465 0.80747452
    10     10 POLYGON ((118 -50, 120 -50,... 0.742546350 0.0353536 0.39667087
             Spp4      Spp5
    1  0.67805419 0.7889837
    2  0.31436926 0.9522712
    3  0.31235934 0.3874380
    4  0.11227152 0.6601634
    5  0.10585245 0.2963974
    6  0.06569794 0.2242155
    7  0.29624232 0.8025695
    8  0.42655559 0.4251609
    9  0.65161999 0.1906374
    10 0.27303567 0.4910942

## Convert to binary data

    dat_species_bin <- dat_species_prob %>%
      as_tibble() %>%
      mutate(across(
         # Apply to all columns except geometry and cellID
        -any_of(c("cellID", "geometry")),
        ~ case_when(
          . >= 0.5 ~ 1,
          . < 0.5 ~ 0,
          is.na(.data) ~ 0
        )
      )) %>%
      st_as_sf()

## Setup prioritization

Extract feature names for use in prioritization

    col_name <- dat_species_bin %>%
      select(-"cellID") %>%
      st_drop_geometry() %>%
      colnames()

Add a cost layer

    out_sf <- dat_species_bin %>%
      mutate(CostArea = rep(1, 780))

Create targets object

    targets <- rep(0.3, length(col_name))

Create a conservation problem

    dat_problem <- problem(out_sf,
                           features = col_name,
                           cost_column = "CostArea"
    ) %>%
      add_min_set_objective() %>%
      add_relative_targets(targets) %>%
      add_binary_decisions() %>%
      add_default_solver(verbose = FALSE)

## Run prioritization

Solve and plot conservation problem

    dat_soln <- dat_problem %>%
      solve.ConservationProblem()

    (gg_sol <- splnr_plot_Solution(dat_soln))

    Warning: Duplicated `override.aes` is ignored.