Michael, to be hounest, it even surprised me, being the author, that
data(meuse.grid)
gridded(meuse.grid) = ~x+y
fullgrid(meuse.grid) = TRUE
image(meuse.grid[104:1,])
would not flip the image. It just works hard to not destroy the spatial
location of all individual pixels -- it will select all rows in reverse
order, but in the end put everything back in place. What you do is kind
of more like image analysis, as it ?moves the location of pixels, right?
Do you mind if we add your flipXxx functions to sp?
--
Edzer
Michael Sumner wrote:
Ergh, sorry for the update - ?a pox on Gmail for sabotaging my
attempts at plain text! ?I've attached the functions in a text file to
avoid [ampersand] to " at " conversion ...
---------- Forwarded message ----------
From: Michael Sumner <mdsumner at gmail.com>
Date: Tue, Nov 3, 2009 at 8:45 AM
Subject: Re: [R-sig-Geo] flip SpatialGridDataFrame across axis
To: r-sig-geo at stat.math.ethz.ch
It would be nice if the "[" methods on ?'SpatialGridDataFrame-class'
could perform the same indexing orientation, but that uses the
row/column values for [i,j,...] ?to obtain the subsetted cells which
are regridded via SpatialPixels - so the direction is lost. I'm not
sure it's a good idea to modify that - given that the indexing could
be used to subset at the same time - which is probably why the authors
have written it that way. ?;)
But, I've been meaning to try something like this for ages, and this
seems to work:
flipHorizontal <- function(x) {
? ? ? ?if (!inherits(x, "SpatialGridDataFrame")) stop("x must be a
SpatialGridDataFrame")
? ? ? ?grd <- getGridTopology(x)
? ? ? ?idx = 1:prod(grd at cells.dim[1:2])
? ? ? ?m = matrix(idx, grd at cells.dim[2], grd at cells.dim[1], byrow =
TRUE)[,grd at cells.dim[1]:1]
? ? ? ?idx = as.vector(t(m))
? ? ? ?x at data <- x at data[idx, TRUE, drop = FALSE]
? ? ? ?x
}
flipVertical <- function(x) {
? ? ? ?if (!inherits(x, "SpatialGridDataFrame")) stop("x must be a
SpatialGridDataFrame")
? ? ? ?grd <- getGridTopology(x)
? ? ? ?idx = 1:prod(grd at cells.dim[1:2])
? ? ? ?m = matrix(idx, grd at cells.dim[2], grd at cells.dim[1], byrow =
TRUE)[grd at cells.dim[2]:1, ]
? ? ? ?idx = as.vector(t(m))
? ? ? ?x at data <- x at data[idx, TRUE, drop = FALSE]
? ? ? ?x
}
The approach there is stolen from 'subs.SpatialGridDataFrame' in
sp/R/SpatialGridDataFrame-methods.R - so thanks as ever to the
authors!
Cheers, Mike.
On Tue, Nov 3, 2009 at 7:49 AM, Sebastian P. Luque <spluque at gmail.com> wrote:
On Tue, 3 Nov 2009 07:40:59 +1100,
Michael Sumner <mdsumner at gmail.com> wrote:
Hi Sebastian, I think the "north-south" note is referring to
possibly-rotated grids (using the transform values supported by many
formats) - not to "north vs. south" in orientation.
You can easily flip a grid by reverting it (one band at a time) to an
xyz image and using indexing. I find this approach the least confusing
and easily repeatable.
[...]
Thanks for the quick reply Mike!!
Cheers,
--
Seb