## ----setup, include = FALSE--------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = FALSE ) ## ----va-engine, echo = FALSE, results = "asis", eval = TRUE------------------- cat(' ') ## ----------------------------------------------------------------------------- # library(vectra) ## ----raster-to-points-anim, echo = FALSE, results = "asis", eval = TRUE------- body <- " var s=VA.setup('m2p-cv'); if(!s)return; var x=s.ctx,W=s.w,H=s.h,C=VA.C; var GX=26,GY=72,COLS=8,ROWS=5,TW=44,TH=44,GW=COLS*TW,GH=ROWS*TH; var N=COLS*ROWS; var LX=GX+GW+70, LY=86, RH=15; var seed=20260625;function rnd(){seed=(seed*1103515245+12345)&0x7fffffff;return seed/0x7fffffff;} var V=[];for(var i=0;i ONE ROW PER CELL',16,30);VA.noglow(x); var done=Math.floor(tc/PER); for(var i=0;i\n", "\n")) ## ----------------------------------------------------------------------------- # clim <- vec_open_raster("worldclim_bio.vec") # # occ <- read.csv("occurrences.csv") # species, x, y # occ <- cbind(occ, vec_extract_points(clim, occ$x, occ$y)) # head(occ) ## ----select-by-location-anim, echo = FALSE, results = "asis", eval = TRUE----- body <- " var s=VA.setup('sbl-cv'); if(!s)return; var x=s.ctx,W=s.w,H=s.h,C=VA.C; var PER=8.0,HOLD=1.6,PERIOD=PER+HOLD; var poly=[[330,128],[470,116],[548,214],[472,322],[332,332],[262,216]]; var seed=77;function rnd(){seed=(seed*1103515245+12345)&0x7fffffff;return seed/0x7fffffff;} var P=[];for(var i=0;i<56;i++){P.push([60+rnd()*(W-120),64+rnd()*(H-118)]);} P.sort(function(a,b){return a[0]-b[0];}); function inPoly(px,py){var inside=false;for(var i=0,j=poly.length-1;ipy)!=(yj>py))&&(px<(xj-xi)*(py-yi)/(yj-yi)+xi);if(hit)inside=!inside;}return inside;} function drawPoly(){x.save();VA.glow(x,C.amber,8);x.strokeStyle=C.amber;x.lineWidth=2;x.beginPath();x.moveTo(poly[0][0],poly[0][1]);for(var i=1;i\n", "\n")) ## ----------------------------------------------------------------------------- # region <- sf::st_read("study_area.gpkg", quiet = TRUE) # # inside <- tbl("occurrences.vtr") |> # spatial_filter(region, coords = c("x", "y"), crs = 4326) ## ----------------------------------------------------------------------------- # clipped <- tbl("rivers.vtr") |> spatial_clip(region, crs = 4326) ## ----------------------------------------------------------------------------- # tagged <- tbl("gbif_points.vtr") |> # spatial_join(tbl("countries.vtr"), coords = c("x", "y"), # crs = 4326, partition = grid(1)) ## ----rasterize-anim, echo = FALSE, results = "asis", eval = TRUE-------------- body <- " var s=VA.setup('rz-cv'); if(!s)return; var x=s.ctx,W=s.w,H=s.h,C=VA.C; var GX=44,GW=W-88,COLS=16,ROWS=8,TW=GW/COLS,GY=150,TH=27,GH=ROWS*TH; var PERIOD=12.0; var seed=531;function rnd(){seed=(seed*1103515245+12345)&0x7fffffff;return seed/0x7fffffff;} var D=[];var cxC=10.5,cyC=4.5; for(var i=0;i<150;i++){var c=Math.round(VA.clamp(cxC+(rnd()-0.5)*9+(rnd()-0.5)*5,0,COLS-1));var r=Math.round(VA.clamp(cyC+(rnd()-0.5)*5+(rnd()-0.5)*3,0,ROWS-1));D.push([c,r,rnd()]);} function draw(tc){VA.bg(x,W,H); VA.glow(x,C.cyan,7);x.fillStyle=C.cyan;x.textAlign='left';x.font=VA.F(15,true);x.fillText('RASTERIZE :: POINTS -> DENSITY GRID',16,28);VA.noglow(x); var cnt=new Array(COLS*ROWS).fill(0),maxc=1; for(var i=0;i=rt+0.7){var k=D[i][1]*COLS+D[i][0];cnt[k]++;if(cnt[k]>maxc)maxc=cnt[k];}} for(var r=0;r0?'rgba(58,215,255,'+(0.14+0.78*v).toFixed(3)+')':C.off; x.fillRect(GX+c*TW+1,GY+r*TH+1,TW-2,TH-2);} x.strokeStyle=C.grid;for(var c2=0;c2<=COLS;c2++){x.beginPath();x.moveTo(GX+c2*TW,GY);x.lineTo(GX+c2*TW,GY+GH);x.stroke();} for(var r2=0;r2<=ROWS;r2++){x.beginPath();x.moveTo(GX,GY+r2*TH);x.lineTo(GX+GW,GY+r2*TH);x.stroke();} for(var i=0;i=0&&fall<0.7){var f=fall/0.7;var tcx=GX+(D[i][0]+0.5)*TW,tcy=GY+(D[i][1]+0.5)*TH;var py=VA.lerp(62,tcy,VA.ease(f)); VA.glow(x,C.green,7);x.fillStyle=C.green;x.globalAlpha=1-0.25*f;x.beginPath();x.arc(tcx,py,3.4,0,6.2832);x.fill();x.globalAlpha=1;VA.noglow(x);}} x.fillStyle=C.cyan;x.font=VA.F(12,true);x.textAlign='right';x.fillText('brighter = more points per cell',W-16,GY-12); x.fillStyle=C.mut;x.font=VA.F(11);x.textAlign='left';x.fillText('one batch streams past; the grid stays resident',16,H-18); VA.scan(x,W,H); } VA.run(draw,PERIOD,null,'rz','rz-cv'); " cat(paste0( "\n", "\n")) ## ----------------------------------------------------------------------------- # # Point density on a continental grid, streamed from a billion-row file. # density <- tbl("gbif_points.vtr") |> # rasterize(extent = c(-180, -90, 180, 90), res = 0.1, # fun = "count", path = "density.vec") ## ----------------------------------------------------------------------------- # admin <- sf::st_read("regions.gpkg", quiet = TRUE) # zonal(clim, admin, fun = c("mean", "sd"), zone_field = "region_id") ## ----------------------------------------------------------------------------- # terrain("dem.vec", v = c("slope", "aspect", "hillshade"), # path = "dem_derivatives.vec") ## ----------------------------------------------------------------------------- # warp("dem.vec", list(crs = 3035, res = 25), # method = "bilinear", path = "dem_laea.vec") ## ----------------------------------------------------------------------------- # habitat <- polygonize("landcover.vec") # one polygon per class ## ----------------------------------------------------------------------------- # isolines <- contours("dem.vec", levels = seq(0, 3000, by = 200)) ## ----------------------------------------------------------------------------- # study <- mask("dem.vec", region, path = "dem_study.vec") ## ----------------------------------------------------------------------------- # ndvi <- rast_calc(list(nir = "nir.vec", red = "red.vec"), # (nir - red) / (nir + red), path = "ndvi.vec") ## ----------------------------------------------------------------------------- # tile_merge <- mosaic(list("n50.vec", "n51.vec", "n52.vec"), fun = "mean") ## ----------------------------------------------------------------------------- # dist_to_road <- proximity("roads.vec", path = "road_distance.vec") # sea_distance <- proximity("landcover.vec", target = 0) # 0 = water ## ----cost-tiers-anim, echo = FALSE, results = "asis", eval = TRUE------------- body <- " var s=VA.setup('ct-cv'); if(!s)return; var x=s.ctx,W=s.w,H=s.h,C=VA.C; var PERIOD=10.0; var rows=[ {name:'monoid fold',sub:'spatial_filter, rasterize, zonal',col:C.green,f:function(t){return 0.15+0.02*Math.sin(t*9);}}, {name:'sort / partition',sub:'focal, terrain, warp, partitioned join',col:C.amber,f:function(t){return 0.16+0.2*(0.5-0.5*Math.cos(t*6.5));}}, {name:'all-to-all',sub:'self-overlay, voronoi, neighbour graphs',col:C.red,f:function(t){return VA.clamp(t,0,1)*0.9+0.05;}} ]; var PX=310,PW=W-310-92,BH=56,GAP=36,TOP=74; function draw(tc){VA.bg(x,W,H); VA.glow(x,C.cyan,7);x.fillStyle=C.cyan;x.textAlign='left';x.font=VA.F(15,true);x.fillText('COST-MODEL TIERS :: MEMORY OVER A RUN',16,28);VA.noglow(x); var t=tc/PERIOD; for(var i=0;i<3;i++){var y=TOP+i*(BH+GAP);var rw=rows[i]; x.strokeStyle=C.red;x.setLineDash([5,4]);x.beginPath();x.moveTo(PX,y-7);x.lineTo(PX+PW,y-7);x.stroke();x.setLineDash([]); x.fillStyle=C.off;x.fillRect(PX,y,PW,BH);x.strokeStyle=C.grid;x.strokeRect(PX,y,PW,BH); var cursor=VA.clamp(t,0,1),steps=Math.floor(cursor*PW); x.fillStyle=rw.col;x.globalAlpha=0.82; for(var px=0;px\n", "\n"))