library(gdalraster)
#> GDAL 3.13.0dev-0e4f0cadf6 (released 2026-01-20), GEOS 3.12.1, PROJ 9.7.0
dsn <- "WMTS:https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/WMTS/1.0.0/WMTSCapabilities.xml,layer=World_Imagery"
ds <- new(GDALRaster, dsn)
d <- read_ds(ds, out_xsize = 1024, out_ysize = 1024, bands = 1:3)
bb <- ds$bbox()
plot(NA, xlim = bb[c(1, 3)], ylim = bb[c(2, 4)], asp = 1, xlab = "", ylab = "")
a <- aperm(array(d, c(1024, 1024, 3)), c(2,1 ,3))
a01 <- a/255
system.time({
rasterImage(a01, bb[1], bb[2], bb[3], bb[4])
})
#> user system elapsed
#> 0.212 0.024 0.238
native_rgb <- function(r, g, b, dm) {
#res <- bitwOr(bitwOr(bitwOr(r, bitwShiftL(g, 8L)), bitwShiftL(b, 16L)), -16777216L)
res <- as.integer(r) + as.integer(g) * 256L + as.integer(b) * 65536L - 16777216L
res <- matrix(res, dm[2L], dm[1L], byrow = TRUE)
class(res) <- "nativeRaster"
attr(res, "channels") <- 3L
res
}
b <- native_rgb(a[,,1L], a[,,2L], a[,,3L], c(1024, 1024))
system.time({
rasterImage(b, bb[1], bb[2], bb[3], bb[4])
})#> user system elapsed
#> 0.001 0.000 0.001
Created on 2026-01-22 with reprex v2.0.2


Oh totally that's a very attractive idea. I think it's a very hard thing, to be general and lightweight and abstract as possible but also able to support custom map making - it's too much for one function, but I'm not sure anyone in R has got this really figured out (or anywhere). Think of magick - that's such cool ux but it's entirely incompatible atm. I'm pretty tied to my own hypertidy/ximage, and I like the idea of raster graphics that aren't tied to GDAL and building on that. I'd love to brainstorm it out and I don't think it's out of aspiration range to cut across a lot of other packages too. The core in R is really rasterImage and nativeRaster, so maybe there's a need for plot() method on array/matrix as a basis. I'm in love with ximage(x, extent-optional) so maybe that (or equivalen) is a contribution to R itself.