Extremly helpful. Thanks again.
On 07/19/2010 01:30 PM, Roger Bivand wrote:
On Mon, 19 Jul 2010, Ben Mazzotta wrote:
Thank you very much, Roger.
I was afraid that might be the answer. Once I have the new Polygon
and Polygons objects, how can I merge all the slots from the old
Polygon and Polygons to the new Polygon and Polygons objects?
Ultimately I'd like to bring the other fields from the old object
into the new one.
If they have the same IDs, no problem, just make a
SpatialPolygonsDataFrame with data=as(old, "data.frame").
The context is this: I am transforming the coordinates using the
cartogram() function from {Rcartogram}. The argument to cartogram()
is a rectangular matrix, which contains sample densities of a
statistic at regular intervals over the map. Cartogram() returns a
lookup table in the form of two matrices, which specify x_new as a
function of (x_old, y_old) and y_new, again as a function of (x_old,
y_old). After cleaning up missing observations, I can interpolate new
coordinates for every pair of old coordinates.
Therefore, I'd like to create a new version of the world map by
transforming every pair of coordinates in the original polygon.
Firstly, the input is a planar grid of values of a variable, so the
queries on the two output grids need to accommodate the loss of
resolution implied there. Try on something simple first. If you can
get a wrapper around cartogram() to take a SpatialPolygonsDataFrame,
make a grid from it for the chosen variable (including NA handling),
then do cartogram, followed by interpolation for Polygons object by
Polygons object (remember objects may be multiple Polygon objects, and
may have holes), you may be able to get there. Constructing the output
objects from computed coordinates looks like the least of your
challenges.
Good luck!
Roger
On 07/19/2010 12:09 PM, Roger Bivand wrote:
On Mon, 19 Jul 2010, Ben Mazzotta wrote:
Dear R geographers:
I'm able to replace the coordinates of any given polygon, but not
construct apply() family commands or for() loops to accomplish the
same task. How can I construct a simple loop or apply() command
that will sequentially replace all of the coordinates in a
SpatialPolygons object?
Just build lists of new Polygon then Polygons objects, and build a
new SpatialPolygons at the end. I don't think that you'll see big
memory problems, and the approach you propose will probably have
poor timings, because the containing objects will probably be
rebuilt for each update.
Are you looking for the elide() method for SpatialPolygons in
maptools? Do you need an extra operation added to it?
Roger
As far as I understand, the coordinates of a polygon are kept in a
slot referred as follows:
m...@polygons[[x]]@polygons[[...@coords
Using which, I can create mapply(foo, indexp, indexP) commands to
extract the original coordinates and transform them.
# Define a pair of vectors indexp, indexP that together index every
Polyon in the SpatialPolygons object map.
# Then extract coordinates as follows:
coords <- function(x,y)
{...@polygons[[indexp]]@polygons[[index...@coords}
# Or operate a function foo on the old coordinates
coords.alt <- mapply(foo,
m...@polygons[[indexp]]@polygons[[index...@coords[,1],
m...@polygons[[indexp]]@polygons[[index...@coords[,2])
So I can create lists and matrices of coordinates, and transform
the coordinates.
It is possible to write a command that replaces coordinates using
integers; but these commands fail when I attempt to use mapply() to
replace existing coordinates. For example,
p...@polygons[[1]]@polygons[[...@coords <- foo(1,1)
will work fine, but the following will not.
newcoords <- function(indp, indP) {
p...@polygons[[indp]]@polygons[[ind...@coords <- foo(indp, indP)
}
mapply(newcoords, indexp, indexP)
Have I missed something in the manual on coordinates that would
enable me to transform the coordinates of all the Polygons in a
SpatialPolygonsDataFrame according to some regular function of the
old coordinates (x,y)? Is the only alternative to build a new
SpatialPolygons data frame from scratch, beginning with the new
coordinates?
If it would be useful, I can provide sample code that works on
wrld_simpl.
Please advise. Thank you!
--
Ben Mazzotta, PhD Candidate
The Fletcher School, Tufts University
benjamin.mazzo...@tufts.edu
_______________________________________________
R-sig-Geo mailing list
R-sig-Geo@stat.math.ethz.ch
https://stat.ethz.ch/mailman/listinfo/r-sig-geo