## ----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"))