# [R-sig-Geo] Seeking example of making polygons from non-uniform grid

Waichler, Scott R Scott.Waichler at pnl.gov
Tue Jun 27 02:45:13 CEST 2006

> Does this help?
>
> ## bottom left corner of bottom left cell llX <- 0 llY <- 0.5
>
> ## cell width and height
> cellX <- 1
> cellY <- 0.3

Michael, thanks for the example, but does this not assume that cellX is
constant across the grid, and likewise for cellY?

After my post I found a Roger Bivand example of how to process a few
irregular polygons given knowledge of the vertices.  I adapted this for
a rectangular grid situation, where the cells are varying sizes.  My
code to do this is below.  If anyone desires to make this more

library(sp)
library(spgpc)

dx <- c(1, 2, 2, 1, 3, 3, 1, 1)
dz <- c(2, 1, 1, 3, 3, 1, 2, 2)
x.origin <- 0
xnb <- c(x.origin, x.origin + cumsum(dx))  # x cell boundaries
z.origin <- 0
znb <- c(z.origin, z.origin + cumsum(dz))  # z nodal boundaries
num.x <- length(dx)
num.z <- length(dz)
num.cells <- num.x * num.z

k <- 0
for(j in 1:num.z) {
for(i in 1:num.x) {
k <- k + 1
ll.x <- xnb[i]  # lower left corner
ll.y <- znb[j]
ul.x <- ll.x     # upper left corner
ul.y <- znb[(j+1)]
ur.x <- xnb[(i+1)]  # upper right corner
ur.y <- ul.y
lr.x <- ur.x  # lower right corner
lr.y <- znb[j]
this.polygon <-
Polygon(matrix(c(ll.x, ll.y, ul.x, ul.y, ur.x, ur.y, lr.x, lr.y,
ll.x, ll.y), byrow=T, ncol=2),
hole=F)

cmd <- paste(sep="", 'Srs', k, ' <- Polygons(list(this.polygon),
"s', k, '")')
eval(parse(text=cmd))
}
}

# Assign values to the cells
cell.values <- c(1, 1, 2, 1, 3, 3, 3, 3, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2,
2, 3, 3,
2, 2, 3, 3, 3, 1, 1, 1, 3, 3, 3, 3, 3, 1, 1, 1, 3, 2,
3, 2, 2,
3, 3, 3, 3, 1, 2, 3, 3, 2, 2, 2, 2, 1, 3, 1, 1, 2, 2,
2, 2, 1, 3)

cmd.SR <- 'SR <- SpatialPolygons(list(Srs1'
for(k in 2:num.cells) cmd.SR <- paste(sep="", cmd.SR, ', Srs', k)
cmd.SR <- paste(sep="", cmd.SR, ')', ', cell.values', ')')
eval(parse(text=cmd.SR))
SR.new <- lapply(getSpPpolygonsSlot(SR), checkPolygonsHoles)

# Plot the individual cells/polygons
plot(as.SpatialPolygons.PolygonsList(SR.new), col = cell.values, pbg =
"white")

# Now union contiguous like-valued cells into minimum number of
polygons.
SR.union <-
unionSpatialPolygons(as.SpatialPolygons.PolygonsList(SR.new),
cell.values)
plot(SR.union, col=1:3)

Thanks,
Scott Waichler
Pacific Northwest National Laboratory
scott.waichler _at_ pnl.gov