Load in your datasets. This should all be linked ot files on the GIS Server Can take a little while

#load in the DEM and resmaple to 3m resolution
dem3 <- rast('//gis/gisprojects/2024_spring/maya/psx_1_2_dem_1m.tif') %>% 
          terra::aggregate(fact=3,fun=mean)

#load land use DEM and resample to extent of the dem
lu <- rast('//gis/gisprojects/2024_spring/charlie_stuff/land_cover_maya.tif')
ext(lu)<-ext(dem3)
terra::crs(lu)<-terra::crs(dem3)
lu<-terra::resample(lu,dem3)

#load square structures
squares <- st_read('//gis/gisprojects/2024_spring/charlie_stuff/psx_1_2_squares.shp') %>% 
  st_transform(terra::crs(dem3)) %>% 
  mutate(id = row_number())

#load sites
sites <- st_read('//gis/gisprojects/2024_spring/charlie_stuff/psx_1_2_sites.shp') %>% 
  st_transform(terra::crs(dem3))

#create grids at the extent of lu,
grids<-st_make_grid(lu,
                    cellsize=125,
                    # n=c(175,175),
                    square=F) %>% 
                    st_as_sf()

Run the whole chunk below to build the function. Don’t modify anything in here! **********

```r
#the following is a function to add random field to hexes, remove buffers around square platforms, add heights to a given percentage of forest hexagons and to all bajo areas

randFor <- function (struct,perc,obs) {

  #add random column to grids and convert to vector. set.seed means you'll get a different result every time
  set.seed( as.integer((as.double(Sys.time())*1000+Sys.getpid()) %% 2^31) )
  grids<-grids %>% mutate(rand=round(runif(nrow(.))*100,0)) %>% 
                      vect()
  
  #rasterize the grids
  forPercRast <- rasterize(x=grids,y=dem3,field=\rand\,fun=max)
  
  #rasterize buffers around square platforms
  gridsBuff <- rasterize(x=squares %>% st_buffer(200),y=dem3,fun=max)
  
  #get rid of non forested pixels
  forPercRast[lu!=7]<-NA
  
  #get rid of areas outside of the buffer
  forPercRast[gridsBuff==1]<-NA
  remove(gridsBuff)
  
  forPercRast[is.na(forPercRast)]<-0 # set non forest to 0 offset
  forPercRast[forPercRast<perc]<-0 #set unchosen forest hexes to 0 offset
  forPercRast[forPercRast>=perc]<-15.52 #set forest height in random hexes
  forPercRast[lu==10]<-4.8 #add bajo tree height
  
  dem_model<-dem3+forPercRast
  remove(forPercRast)
  
  #get the coordinates of the structure that will be your observer point
  startSquareCoords <- squares[struct,] %>% st_coordinates()
  
  test <- terra::viewshed(x=dem_model,loc=squares[struct,] %>% st_coordinates(),observer=obs)
  remove(dem_model)
return (test)
}

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG50bV9zaGFwZShzcXVhcmVzKSt0bV9kb3RzKCkrXG50bV9zaGFwZShzcXVhcmVzKSt0bV90ZXh0KCdpZCcpXG5gYGAifQ== -->

```r

tm_shape(squares)+tm_dots()+
tm_shape(squares)+tm_text('id')

use this chunk only to test out a single observer at one square platform

#run the viewshed model for one point. takes about 10 seconds to run one

#struct is the id of the structures

#obs is observer height in meters

#setting perc to 100 means that 0% of pixels will be forested
#setting perc to 75 means that 25% of pixels will be forested
#setting perc to 50 means that 50% of pixels will be forested

viewTest <- randFor(struct=10,perc=50,obs=50)

plot(viewTest)

writeRaster(viewTest,'./data/singleview_struc10_50p_50m.tif',overwrite=TRUE)

This chunk below is what you’ll run for your all 17 square viewshed

modify parameters, run the code and then save the output with a different name

```r
#this chunk runs through all the structures and adds them together. this is exactly like what ArcGIS does when you have multiple observer points

#takes about 4 minutes

#this is what you'll do for each of the nine scenarios

allView<-sapply(squares$id,
                   FUN=randFor,
                   perc=75,
                   obs=50)  %>% rast() %>% sum()

#plot your results
plot(allView)

# export for use in ArcGIS - 
# change the output name to match model parameters from above
writeRaster(allView,'./data/view_25p_50m.tif',overwrite=TRUE)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->





***Let's talk about this one. I think it's pretty neat but we might want to save it for after presentation***


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuI3RoaXMgaXMgc29tZXRoaW5nIEkganVzdCB0ZXN0ZWQuIFNpbmNlIHRoZSByZXN1bHRzIGFyZSByYW5kb20sIHlvdSdsbCBnZXQgYSBkaWZmZXJlbnQgbWFwIGV2ZXJ5IHRpbWUuIGJ5IHJ1bm5pbmcgdGhlIHNhbWUgcGFyYW1ldGVycyAxMCB0aW1lcywgeW91IGNhbiBnZXQgYW4gaWRlYSBvZiB3aGljaCBwaXhlbHMgY2FuIGJlIHNlZW4gbm8gbWF0dGVyIHRoZSBmb3Jlc3QgY29uZmlndXJhdGlvblxuXG4jcnVuIHRoaXMgZm91ciB0aW1lczogcGVyYyA9IDc1ICgyNSUpIGFuZCBwZXJjID0gNTAgKDUwJSkgYXQgYm90aCBoZWlnaHRzICg1IGFuZCA1MCBtKVxuXG5mb3IgKGkgaW4gMToxNykge1xuI3J1biAxMCB0aW1lcyBmb3IgZWFjaCBzaXRlXG5yZXBlYXRTaW5nbGU8LXNhcHBseShyZXAoaSwxMCksXG4gICAgICAgICAgICAgICAgICAgIEZVTj1yYW5kRm9yLFxuICAgICAgICAgICAgICAgICAgICBwZXJjPTUwLFxuICAgICAgICAgICAgICAgICAgICBvYnM9NTApICU+JSByYXN0KCkgJT4lIHN1bSgpXG5cbiNjcmVhdGUgYSBuYW1lIHRvIHBhc3RlIGludG8gd3JpdGVSYXN0ZXJcbm5hbWUgPC0gcGFzdGUoJy4vZGF0YS9zaXRlJyxpLCdfMTB4XzUwcF81MG0udGlmJyxzZXA9JycpXG5cbiN3cml0ZSB0aGUgcmFzdGVyXG53cml0ZVJhc3RlcihyZXBlYXRTaW5nbGUsbmFtZSxvdmVyd3JpdGU9VFJVRSlcblxuI3JlbW92ZSB0aGUgZmlsZSBhbmQgdGhlbiBzdGFydCBhZ2FpblxucmVtb3ZlKHJlcGVhdFNpbmdsZSlcbn1cblxuYGBgIn0= -->

```r
#this is something I just tested. Since the results are random, you'll get a different map every time. by running the same parameters 10 times, you can get an idea of which pixels can be seen no matter the forest configuration

#run this four times: perc = 75 (25%) and perc = 50 (50%) at both heights (5 and 50 m)

for (i in 1:17) {
#run 10 times for each site
repeatSingle<-sapply(rep(i,10),
                    FUN=randFor,
                    perc=50,
                    obs=50) %>% rast() %>% sum()

#create a name to paste into writeRaster
name <- paste('./data/site',i,'_10x_50p_50m.tif',sep='')

#write the raster
writeRaster(repeatSingle,name,overwrite=TRUE)

#remove the file and then start again
remove(repeatSingle)
}
LS0tDQp0aXRsZTogIlZpZXdzaGVkIE1heWEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyLGVjaG89VCxpbmNsdWRlPUZ9DQpzb3VyY2UoJy4uL3BhY2thZ2VzLnInKQ0KYGBgDQoNCioqKkxvYWQgaW4geW91ciBkYXRhc2V0cy4gVGhpcyBzaG91bGQgYWxsIGJlIGxpbmtlZCBvdCBmaWxlcyBvbiB0aGUgR0lTIFNlcnZlcioqKg0KKioqQ2FuIHRha2UgYSBsaXR0bGUgd2hpbGUqKioNCg0KYGBge3J9DQojbG9hZCBpbiB0aGUgREVNIGFuZCByZXNtYXBsZSB0byAzbSByZXNvbHV0aW9uDQpkZW0zIDwtIHJhc3QoJy8vZ2lzL2dpc3Byb2plY3RzLzIwMjRfc3ByaW5nL21heWEvcHN4XzFfMl9kZW1fMW0udGlmJykgJT4lIA0KICAgICAgICAgIHRlcnJhOjphZ2dyZWdhdGUoZmFjdD0zLGZ1bj1tZWFuKQ0KDQojbG9hZCBsYW5kIHVzZSBERU0gYW5kIHJlc2FtcGxlIHRvIGV4dGVudCBvZiB0aGUgZGVtDQpsdSA8LSByYXN0KCcvL2dpcy9naXNwcm9qZWN0cy8yMDI0X3NwcmluZy9jaGFybGllX3N0dWZmL2xhbmRfY292ZXJfbWF5YS50aWYnKQ0KZXh0KGx1KTwtZXh0KGRlbTMpDQp0ZXJyYTo6Y3JzKGx1KTwtdGVycmE6OmNycyhkZW0zKQ0KbHU8LXRlcnJhOjpyZXNhbXBsZShsdSxkZW0zKQ0KDQojbG9hZCBzcXVhcmUgc3RydWN0dXJlcw0Kc3F1YXJlcyA8LSBzdF9yZWFkKCcvL2dpcy9naXNwcm9qZWN0cy8yMDI0X3NwcmluZy9jaGFybGllX3N0dWZmL3BzeF8xXzJfc3F1YXJlcy5zaHAnKSAlPiUgDQogIHN0X3RyYW5zZm9ybSh0ZXJyYTo6Y3JzKGRlbTMpKSAlPiUgDQogIG11dGF0ZShpZCA9IHJvd19udW1iZXIoKSkNCg0KI2xvYWQgc2l0ZXMNCnNpdGVzIDwtIHN0X3JlYWQoJy8vZ2lzL2dpc3Byb2plY3RzLzIwMjRfc3ByaW5nL2NoYXJsaWVfc3R1ZmYvcHN4XzFfMl9zaXRlcy5zaHAnKSAlPiUgDQogIHN0X3RyYW5zZm9ybSh0ZXJyYTo6Y3JzKGRlbTMpKQ0KDQojY3JlYXRlIGdyaWRzIGF0IHRoZSBleHRlbnQgb2YgbHUsDQpncmlkczwtc3RfbWFrZV9ncmlkKGx1LA0KICAgICAgICAgICAgICAgICAgICBjZWxsc2l6ZT0xMjUsDQogICAgICAgICAgICAgICAgICAgICMgbj1jKDE3NSwxNzUpLA0KICAgICAgICAgICAgICAgICAgICBzcXVhcmU9RikgJT4lIA0KICAgICAgICAgICAgICAgICAgICBzdF9hc19zZigpDQpgYGANCg0KDQoqKioqKioqKioqDQoqKipSdW4gdGhlIHdob2xlIGNodW5rIGJlbG93IHRvIGJ1aWxkIHRoZSBmdW5jdGlvbi4gRG9uJ3QgbW9kaWZ5IGFueXRoaW5nIGluIGhlcmUhKioqDQoqKioqKioqKioqDQoNCmBgYHtyfQ0KI3RoZSBmb2xsb3dpbmcgaXMgYSBmdW5jdGlvbiB0byBhZGQgcmFuZG9tIGZpZWxkIHRvIGhleGVzLCByZW1vdmUgYnVmZmVycyBhcm91bmQgc3F1YXJlIHBsYXRmb3JtcywgYWRkIGhlaWdodHMgdG8gYSBnaXZlbiBwZXJjZW50YWdlIG9mIGZvcmVzdCBoZXhhZ29ucyBhbmQgdG8gYWxsIGJham8gYXJlYXMNCg0KcmFuZEZvciA8LSBmdW5jdGlvbiAoc3RydWN0LHBlcmMsb2JzKSB7DQoNCiAgI2FkZCByYW5kb20gY29sdW1uIHRvIGdyaWRzIGFuZCBjb252ZXJ0IHRvIHZlY3Rvci4gc2V0LnNlZWQgbWVhbnMgeW91J2xsIGdldCBhIGRpZmZlcmVudCByZXN1bHQgZXZlcnkgdGltZQ0KICBzZXQuc2VlZCggYXMuaW50ZWdlcigoYXMuZG91YmxlKFN5cy50aW1lKCkpKjEwMDArU3lzLmdldHBpZCgpKSAlJSAyXjMxKSApDQogIGdyaWRzPC1ncmlkcyAlPiUgbXV0YXRlKHJhbmQ9cm91bmQocnVuaWYobnJvdyguKSkqMTAwLDApKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgdmVjdCgpDQogIA0KICAjcmFzdGVyaXplIHRoZSBncmlkcw0KICBmb3JQZXJjUmFzdCA8LSByYXN0ZXJpemUoeD1ncmlkcyx5PWRlbTMsZmllbGQ9InJhbmQiLGZ1bj1tYXgpDQogIA0KICAjcmFzdGVyaXplIGJ1ZmZlcnMgYXJvdW5kIHNxdWFyZSBwbGF0Zm9ybXMNCiAgZ3JpZHNCdWZmIDwtIHJhc3Rlcml6ZSh4PXNxdWFyZXMgJT4lIHN0X2J1ZmZlcigyMDApLHk9ZGVtMyxmdW49bWF4KQ0KICANCiAgI2dldCByaWQgb2Ygbm9uIGZvcmVzdGVkIHBpeGVscw0KICBmb3JQZXJjUmFzdFtsdSE9N108LU5BDQogIA0KICAjZ2V0IHJpZCBvZiBhcmVhcyBvdXRzaWRlIG9mIHRoZSBidWZmZXINCiAgZm9yUGVyY1Jhc3RbZ3JpZHNCdWZmPT0xXTwtTkENCiAgcmVtb3ZlKGdyaWRzQnVmZikNCiAgDQogIGZvclBlcmNSYXN0W2lzLm5hKGZvclBlcmNSYXN0KV08LTAgIyBzZXQgbm9uIGZvcmVzdCB0byAwIG9mZnNldA0KICBmb3JQZXJjUmFzdFtmb3JQZXJjUmFzdDxwZXJjXTwtMCAjc2V0IHVuY2hvc2VuIGZvcmVzdCBoZXhlcyB0byAwIG9mZnNldA0KICBmb3JQZXJjUmFzdFtmb3JQZXJjUmFzdD49cGVyY108LTE1LjUyICNzZXQgZm9yZXN0IGhlaWdodCBpbiByYW5kb20gaGV4ZXMNCiAgZm9yUGVyY1Jhc3RbbHU9PTEwXTwtNC44ICNhZGQgYmFqbyB0cmVlIGhlaWdodA0KICANCiAgZGVtX21vZGVsPC1kZW0zK2ZvclBlcmNSYXN0DQogIHJlbW92ZShmb3JQZXJjUmFzdCkNCiAgDQogICNnZXQgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGJlIHlvdXIgb2JzZXJ2ZXIgcG9pbnQNCiAgc3RhcnRTcXVhcmVDb29yZHMgPC0gc3F1YXJlc1tzdHJ1Y3QsXSAlPiUgc3RfY29vcmRpbmF0ZXMoKQ0KICANCiAgdGVzdCA8LSB0ZXJyYTo6dmlld3NoZWQoeD1kZW1fbW9kZWwsbG9jPXNxdWFyZXNbc3RydWN0LF0gJT4lIHN0X2Nvb3JkaW5hdGVzKCksb2JzZXJ2ZXI9b2JzKQ0KICByZW1vdmUoZGVtX21vZGVsKQ0KcmV0dXJuICh0ZXN0KQ0KfQ0KDQpgYGANCg0KYGBge3J9DQoNCnRtX3NoYXBlKHNxdWFyZXMpK3RtX2RvdHMoKSsNCnRtX3NoYXBlKHNxdWFyZXMpK3RtX3RleHQoJ2lkJykNCmBgYA0KDQoNCioqKnVzZSB0aGlzIGNodW5rIG9ubHkgdG8gdGVzdCBvdXQgYSBzaW5nbGUgb2JzZXJ2ZXIgYXQgb25lIHNxdWFyZSBwbGF0Zm9ybSoqKg0KDQpgYGB7cn0NCiNydW4gdGhlIHZpZXdzaGVkIG1vZGVsIGZvciBvbmUgcG9pbnQuIHRha2VzIGFib3V0IDEwIHNlY29uZHMgdG8gcnVuIG9uZQ0KDQojc3RydWN0IGlzIHRoZSBpZCBvZiB0aGUgc3RydWN0dXJlcw0KDQojb2JzIGlzIG9ic2VydmVyIGhlaWdodCBpbiBtZXRlcnMNCg0KI3NldHRpbmcgcGVyYyB0byAxMDAgbWVhbnMgdGhhdCAwJSBvZiBwaXhlbHMgd2lsbCBiZSBmb3Jlc3RlZA0KI3NldHRpbmcgcGVyYyB0byA3NSBtZWFucyB0aGF0IDI1JSBvZiBwaXhlbHMgd2lsbCBiZSBmb3Jlc3RlZA0KI3NldHRpbmcgcGVyYyB0byA1MCBtZWFucyB0aGF0IDUwJSBvZiBwaXhlbHMgd2lsbCBiZSBmb3Jlc3RlZA0KDQp2aWV3VGVzdCA8LSByYW5kRm9yKHN0cnVjdD0xMCxwZXJjPTUwLG9icz01MCkNCg0KcGxvdCh2aWV3VGVzdCkNCg0Kd3JpdGVSYXN0ZXIodmlld1Rlc3QsJy4vZGF0YS9zaW5nbGV2aWV3X3N0cnVjMTBfNTBwXzUwbS50aWYnLG92ZXJ3cml0ZT1UUlVFKQ0KYGBgDQoNCg0KDQoqKipUaGlzIGNodW5rIGJlbG93IGlzIHdoYXQgeW91J2xsIHJ1biBmb3IgeW91ciBhbGwgMTcgc3F1YXJlIHZpZXdzaGVkKioqDQoNCioqKm1vZGlmeSBwYXJhbWV0ZXJzLCBydW4gdGhlIGNvZGUgYW5kIHRoZW4gc2F2ZSB0aGUgb3V0cHV0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSoqKg0KDQpgYGB7cn0NCiN0aGlzIGNodW5rIHJ1bnMgdGhyb3VnaCBhbGwgdGhlIHN0cnVjdHVyZXMgYW5kIGFkZHMgdGhlbSB0b2dldGhlci4gdGhpcyBpcyBleGFjdGx5IGxpa2Ugd2hhdCBBcmNHSVMgZG9lcyB3aGVuIHlvdSBoYXZlIG11bHRpcGxlIG9ic2VydmVyIHBvaW50cw0KDQojdGFrZXMgYWJvdXQgNCBtaW51dGVzDQoNCiN0aGlzIGlzIHdoYXQgeW91J2xsIGRvIGZvciBlYWNoIG9mIHRoZSBuaW5lIHNjZW5hcmlvcw0KDQphbGxWaWV3PC1zYXBwbHkoc3F1YXJlcyRpZCwNCiAgICAgICAgICAgICAgICAgICBGVU49cmFuZEZvciwNCiAgICAgICAgICAgICAgICAgICBwZXJjPTc1LA0KICAgICAgICAgICAgICAgICAgIG9icz01MCkgICU+JSByYXN0KCkgJT4lIHN1bSgpDQoNCiNwbG90IHlvdXIgcmVzdWx0cw0KcGxvdChhbGxWaWV3KQ0KDQojIGV4cG9ydCBmb3IgdXNlIGluIEFyY0dJUyAtIA0KIyBjaGFuZ2UgdGhlIG91dHB1dCBuYW1lIHRvIG1hdGNoIG1vZGVsIHBhcmFtZXRlcnMgZnJvbSBhYm92ZQ0Kd3JpdGVSYXN0ZXIoYWxsVmlldywnLi9kYXRhL3ZpZXdfMjVwXzUwbS50aWYnLG92ZXJ3cml0ZT1UUlVFKQ0KDQpgYGANCg0KDQoNCg0KKioqTGV0J3MgdGFsayBhYm91dCB0aGlzIG9uZS4gSSB0aGluayBpdCdzIHByZXR0eSBuZWF0IGJ1dCB3ZSBtaWdodCB3YW50IHRvIHNhdmUgaXQgZm9yIGFmdGVyIHByZXNlbnRhdGlvbioqKg0KDQpgYGB7cn0NCiN0aGlzIGlzIHNvbWV0aGluZyBJIGp1c3QgdGVzdGVkLiBTaW5jZSB0aGUgcmVzdWx0cyBhcmUgcmFuZG9tLCB5b3UnbGwgZ2V0IGEgZGlmZmVyZW50IG1hcCBldmVyeSB0aW1lLiBieSBydW5uaW5nIHRoZSBzYW1lIHBhcmFtZXRlcnMgMTAgdGltZXMsIHlvdSBjYW4gZ2V0IGFuIGlkZWEgb2Ygd2hpY2ggcGl4ZWxzIGNhbiBiZSBzZWVuIG5vIG1hdHRlciB0aGUgZm9yZXN0IGNvbmZpZ3VyYXRpb24NCg0KI3J1biB0aGlzIGZvdXIgdGltZXM6IHBlcmMgPSA3NSAoMjUlKSBhbmQgcGVyYyA9IDUwICg1MCUpIGF0IGJvdGggaGVpZ2h0cyAoNSBhbmQgNTAgbSkNCg0KZm9yIChpIGluIDE6MTcpIHsNCiNydW4gMTAgdGltZXMgZm9yIGVhY2ggc2l0ZQ0KcmVwZWF0U2luZ2xlPC1zYXBwbHkocmVwKGksMTApLA0KICAgICAgICAgICAgICAgICAgICBGVU49cmFuZEZvciwNCiAgICAgICAgICAgICAgICAgICAgcGVyYz01MCwNCiAgICAgICAgICAgICAgICAgICAgb2JzPTUwKSAlPiUgcmFzdCgpICU+JSBzdW0oKQ0KDQojY3JlYXRlIGEgbmFtZSB0byBwYXN0ZSBpbnRvIHdyaXRlUmFzdGVyDQpuYW1lIDwtIHBhc3RlKCcuL2RhdGEvc2l0ZScsaSwnXzEweF81MHBfNTBtLnRpZicsc2VwPScnKQ0KDQojd3JpdGUgdGhlIHJhc3Rlcg0Kd3JpdGVSYXN0ZXIocmVwZWF0U2luZ2xlLG5hbWUsb3ZlcndyaXRlPVRSVUUpDQoNCiNyZW1vdmUgdGhlIGZpbGUgYW5kIHRoZW4gc3RhcnQgYWdhaW4NCnJlbW92ZShyZXBlYXRTaW5nbGUpDQp9DQoNCmBgYA0K