Raster analyses

library(raster)
library(sf)
library(ggplot2)
library(tmap)
library(scales)
library(gridExtra)

Load data

Rasters

Load prepared rasters.

load("1_data/manual/slope_clip.rData")
load("1_data/manual/aspect_clip.rData")

# slope_clip<-raster("1_data/manual/slope_clip.tif")
# aspect_clip<-raster("1_data/manual/aspect_clip.tif")

Pinch-points

Load buffered pinch-point polygons

# buffered pinch point polygons
load("3_pipeline/store/pp_s_clip_clus_buf_ext.rData")

# study area
load("1_data/manual/study_area.rdata")

# load clipped road data
load("1_data/manual/v_road_clip.rdata")

# load polygon representing North Central Region of Saskatchewan region of the ribbon of green
load("1_data/manual/nscr.rdata")  

# pinch point clusters
load("3_pipeline/tmp/pp_s_clip_clus.rData")

# buffered pinchpoints
load("3_pipeline/store/pp_s_clip_clus_buf.rData")

Prepare rasters

Stack rasters into a single object

#create a list of raster objects to include
r_list<-list(slope_clip, aspect_clip)

r_stack<-stack(r_list)

#save stack as r object
stackSave(r_stack,file="3_pipeline/store/r_stack")

Extract data

Check the extreme values if the raster stack to identity any values that shouldn’t be included (e.g. -9999).

stackOpen("3_pipeline/store/r_stack")

minValue(r_stack)
maxValue(r_stack)

hist(r_stack)

Summary table

Extract and summarize raster data within each pinch-point polygon

#calculate mean
pp_r_mean<-extract(r_stack,  pp_s_clip_clus_buf_ext, fun=mean, na.rm=TRUE)
colnames(pp_r_mean)<-paste("mean", substr(colnames(pp_r_mean), 1, nchar(colnames(pp_r_mean))-5), sep="_")

#calculate sd
pp_r_sd<-extract(r_stack,  pp_s_clip_clus_buf_ext, fun=sd, na.rm=TRUE)                   
colnames(pp_r_sd)<-paste("sd", substr(colnames(pp_r_sd), 1, nchar(colnames(pp_r_sd))-5), sep="_")          

#calculate max
pp_r_max<-extract(r_stack,  pp_s_clip_clus_buf_ext, fun=max, na.rm=TRUE)                   
colnames(pp_r_max)<-paste("max", substr(colnames(pp_r_max), 1, nchar(colnames(pp_r_sd))-3), sep="_") 

#calculate min
pp_r_min<-extract(r_stack,  pp_s_clip_clus_buf_ext, fun=min, na.rm=TRUE)                   
colnames(pp_r_min)<-paste("min", substr(colnames(pp_r_min), 1, nchar(colnames(pp_r_sd))-3), sep="_")

#combine metrics into a single table
pp_r<-cbind(ID=pp_s_clip_clus_buf_ext$ID, pp_r_min, pp_r_max, pp_r_mean, pp_r_sd)

#reorder columns
pp_r<-pp_r[,c("ID","min_slope", "max_slope", "mean_slope", "sd_slope", "min_aspect", "max_aspect", "mean_aspect", "sd_aspect")]

# save
save(pp_r,file="3_pipeline/store/pp_r.rData")
ID min_slope min_aspect max_slope max_aspect mean_slope mean_aspect sd_slope sd_aspect
1 0.0812411 9.523023 29.51549 350.7695 9.270331 259.04827 7.952051 57.05700
2 0.0704860 3.451188 36.16954 350.3948 9.332548 116.92821 8.964192 117.51785
3 0.0015890 -1.000000 36.34338 355.8282 10.351893 61.10899 8.540351 74.69963
4 0.0302920 7.249906 32.39600 355.5254 10.835116 274.18811 9.079490 99.14873
5 0.5257717 17.686188 15.55570 304.5115 6.774683 71.43680 3.858803 61.59105
6 0.3955552 37.618832 14.68072 347.2162 5.808701 137.50692 3.444783 61.99655
7 2.5336754 158.527191 32.88671 341.4302 14.066558 310.33579 9.399289 26.40259
8 0.1472756 29.808361 29.34639 302.2689 12.175097 119.74625 7.320759 33.05506
9 0.0011139 -1.000000 19.93499 357.6785 5.804861 266.47090 4.539194 88.67824
10 0.5570856 36.425022 11.98081 311.1764 4.675243 82.88598 3.742990 32.59775
11 0.4183576 23.960176 36.29103 316.6076 15.518173 171.71226 7.504589 48.60800
12 0.2824213 8.322483 36.79930 346.5271 12.061293 279.54274 9.658006 34.58862
13 1.4415734 84.780663 29.49452 216.7601 11.417863 176.32245 5.478304 17.11099
14 3.7535818 130.068848 19.73516 173.1658 11.018893 151.23519 3.648061 12.60279

Summary histograms

Create a histogram of raster values for each pinch point.

poly<-pp_s_clip_clus_buf_ext
#poly$ID <- 1:length(poly)
poly$layer <- NULL
d <- data.frame(poly)
v<-extract(r_stack,  poly, na.rm=TRUE, df=TRUE)

vd <- merge(d, v, by="ID")
vd<- vd[-c(3)]
save(vd, file="3_pipeline/tmp/vd.rData")

# x<-vd[vd$ID==1,]
# h<-hist(aspect_clip)

############# Slope plot #################

# basemap
m4<-
  tm_shape(slope_clip)+
    tm_raster(palette = c("white", "#00441b"),
      title = "Slope",
              contrast = c(0,.8),
              style = "cont")+
   tm_shape(v_road_clip)+tm_lines(col="white")+
  tm_layout(bg.col="#d9d9d9")+
  tm_shape(nscr)+
    tm_fill(col="white", alpha=.4)+
    tm_borders(col = "#636363")+
  tm_shape(pp_s_clip_clus)  +
    tm_fill(col="MAP_COLORS", palette = "Dark2", alpha=.8)+
    tm_borders(alpha=1)+
   tm_shape(pp_s_clip_clus_buf)+
    tm_text(text = "group",
          col="black",
          size = 1.3)+
  tm_layout(legend.outside = FALSE, 
            legend.text.size = .8, 
            legend.bg.color="white", 
            legend.frame=TRUE,
            legend.title.size=1, 
            legend.frame.lwd=.8,
            )
m4

#convert tmap to grob
g1<-tmap_grob(m4)


# create hist plots in ggplot convert to grob objects which will be plotted in tmap.

g2<-vd%>%
    ggplot(aes(x = slope_clip)) +
    geom_histogram(binwidth=1, position = "identity", aes(y=..ncount..), fill="#00441b") +
  #geom_density(alpha=.2, fill="#FF6666")+
    scale_y_continuous(labels = percent_format())+
  labs(x="slope", y="% count")+
    theme(#panel.background = element_blank(),
          axis.ticks=element_blank(),
          strip.background =element_rect(fill="white"),
          panel.background = element_rect(fill="#ece2f0"),
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank())+
  facet_grid(~ID)
  # geom_vline(aes(xintercept=grp.mean),
  #           color="blue", linetype="dashed", size=1)+
g2


lay2 <- rbind(c(1),
              c(1),
              c(1),
              c(1),
              c(2))   

m2<-arrangeGrob(g1, g2, layout_matrix =lay2)

ggsave("4_output/maps/summary/raster_slope_hist_map.png", m2, width=15, height=12
       )

############# Aspect plot #################

m5<-
  tm_shape(aspect_clip)+
    tm_raster(palette= c("white", "#023858"),
              title = "Aspect",
              contrast = c(0,.8))+
  tm_shape(v_road_clip)+tm_lines(col="white")+
  tm_layout(bg.col="#d9d9d9")+
  tm_shape(nscr)+
    tm_fill(col="white", alpha=.4)+
    tm_borders(col = "#636363")+
  tm_shape(pp_s_clip_clus)  +
    tm_fill(col="MAP_COLORS", palette = "Dark2", alpha=.8)+
    tm_borders(alpha=1)+
   tm_shape(pp_s_clip_clus_buf)+
    tm_text(text = "group",
          col="black",
          size = 1.3)+
  
  
  tm_layout(legend.outside = FALSE, 
            legend.text.size = .8, 
            legend.bg.color="white", 
            legend.frame=TRUE,
            legend.title.size=1, 
            legend.frame.lwd=.8,
            )
m5

g3<-tmap_grob(m5)


g4<-vd%>%
    ggplot(aes(x = aspect_clip)) +
    geom_histogram(binwidth=1, position = "identity", aes(y=..ncount..), fill="#023858") +
  #geom_density(alpha=.2, fill="#FF6666")+
    scale_y_continuous(labels = percent_format())+
  labs(x="aspect", y="% count")+
    theme(#panel.background = element_blank(),
          axis.ticks=element_blank(),
          strip.background =element_rect(fill="white"),
          panel.background = element_rect(fill="#ece2f0"),
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank())+
  facet_grid(~ID)
  # geom_vline(aes(xintercept=grp.mean),
  #           color="blue", linetype="dashed", size=1)+
g4


m3<-arrangeGrob(g3, g4, layout_matrix =lay2)

ggsave("4_output/maps/summary/raster_aspect_hist_map.png", m3, width=15, height=12
       )
Histograms of slope values for each pinch point.

Figure 3.6: Histograms of slope values for each pinch point.

Histograms of aspect values for each pinch point.

Figure 3.7: Histograms of aspect values for each pinch point.