rarrayspolygonr-sfwkt

R function to convert polygon (sf, wkt) into mask (matrix, array)


I have an image stored as matrix with grayscale for each pixel.

On this image I use SLIC algorithm to divide it into areas.

So I get a simple feature (sf) with polygons, I am able to extract in well-known-text (wkt).

But what I really need is a matrix/mask (same dimension as my pixel-image-matrix) storing the id of the polygon each pixel belongs to. For example the pixel image[1,2] belongs to polygon 5, then mask[1,2] <- 5.

I add some code to give example of my porblem (for a random "image"):

mat <- array(runif(10000, min=0, max=500), dim=c(100,100))
# SLIC  
library(supercells);
library(sf);
library(terra);
# make spatial raster from matrix
raster <- rast(mat);
rasterSLIC <- supercells(raster, k = 50, compactness = 1, dist_fun = "euclidean", avg_fun = "mean");
plot(raster);
plot(st_geometry(rasterSLIC), add = TRUE, lwd = 0.2);
point <- st_cast(rasterSLIC$geometry[2], to="POINT");
coord <- st_coordinates(point);

# what I want:
goal <- array(c(1,1,1,2,2,1,2,3,3), dim=c(3,3));
image(goal);
goal;

I would like to have something that helps me turning coords into such a mask/matrix I gave a small example for in goal.


Solution

  • You can use terra::rasterize

    Example data

    library(terra)
    # polygons
    f <- system.file("ex/lux.shp", package="terra")
    v <- vect(f)
    # arbitrary raster
    r <- rast(v, res=.01)
    

    Solution:

    rid <- rasterize(v, r, 1:nrow(r))
    
    #or 
    v$ID <- 1:nrow(v)
    rid <- rasterize(v, r, "ID")
    

    Illustration

    plot(rid, type="classes")
    text(v)
    lines(v)
    

    enter image description here

    To get the a matrix of the raster values you can do

    m <- as.matrix(rid, wide=TRUE)
    

    With your more specific example, you could do

    library(supercells);
    library(terra)
    set.seed(1)
    mat <- array(runif(10000, min=0, max=500), dim=c(100,100))
    r <- rast(mat)
    SLIC <- supercells(r, k = 50, compactness = 1, dist_fun = "euclidean", avg_fun = "mean");
    x <- rasterize(SLIC, r, "supercells")
    xm <- as.matrix(x, wide=TRUE)
    
    plot(x); 
    s <- vect(SLIC)
    lines(s)