Skip to content

Instantly share code, notes, and snippets.

@ThierryO
Forked from barryrowlingson/abuff.R
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ThierryO/03c496c44db1a3c349cf to your computer and use it in GitHub Desktop.
Save ThierryO/03c496c44db1a3c349cf to your computer and use it in GitHub Desktop.
abuff <- function(spgeom, ratio = 1.1, precision = 0.00001, maxsteps = 20){
require(rgeos)
spgeom.area <- gArea(spgeom)
spgeom.perimeter <- gLength(spgeom)
buffer.width <- (ratio - 1) * spgeom.area / spgeom.perimeter
buffered.spgeom <- gBuffer(spgeom, width = buffer.width)
achieved.precision <- gArea(buffered.spgeom) / spgeom.area - ratio
steps <- 1
while(abs(achieved.precision) > precision & steps < maxsteps){
buffered.perimeter <- gLength(buffered.spgeom)
buffer.width <- buffer.width - achieved.precision * spgeom.area / buffered.perimeter
buffered.spgeom <- gBuffer(spgeom, width = buffer.width)
achieved.precision <- gArea(buffered.spgeom) / spgeom.area - ratio
steps <- steps + 1
}
if(steps == maxsteps & abs(achieved.precision) > precision){
warning("Required precision not reached after ", maxsteps, " steps. Achieved precision = ", achieved.precision)
}
return(buffered.spgeom)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment