[R-sig-Geo] Euclidean distance raster

Roozbeh Valavi rv@|@v| @end|ng |rom @tudent@un|me|b@edu@@u
Mon Feb 18 03:46:50 CET 2019


Hi all,

I want to create a nearest distance raster in R. As far as I know, the
common practice is to compute the distance matrix of all the points in the
mask raster to all the features in the vector layer, then calculate the min
distance for each point. But this makes a huge (m by n) matrix and it
involves a lot of computation which is too slow.

To go around the computation, I wrote the following function that first
gets the index of the nearest feature to each point in the mask raster,
then only calculates the distance between each point and its nearest
feature. This solution is 3 times faster than the previous one, but still
not fast enough.

I wonder if anyone knows a better solution to this problem.

Thank you in advance,
Roozbeh Valavi

rasterDistance <- function(feature, rastermask){
  require(raster)
  require(sf)
  require(progress)
  p <- st_as_sf(rasterToPoints(rastermask, spatial = TRUE))
  p$indx <- st_nearest_feature(st_geometry(p), st_geometry(feature))
  pb <- progress::progress_bar$new(format = " Progress [:bar] :percent in
:elapsed",
                                   total=nrow(p), clear=FALSE, width=75) #
add progress bar
  for(i in 1:nrow(p)){
    p$dist[i] <- st_distance(st_geometry(p[i,]),
st_geometry(feature[p$indx[i],]))
    pb$tick() # update progress bar
  }
  output <- raster::rasterize(p, rastermask, field = "dist")
  return(output)
}

-- 
*Roozbeh Valavi*
PhD Candidate
The Quantitative & Applied Ecology Group <http://qaeco.com/>
School of BioSciences | Faculty of Science
The University of Melbourne, VIC 3010, Australia
Mobile: +61 423 283 238

	[[alternative HTML version deleted]]



More information about the R-sig-Geo mailing list