[R-sig-Geo] How to replace coordinates of Polygons

Roger Bivand Roger.Bivand at nhh.no
Mon Jul 19 18:09:53 CEST 2010

```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:
> map at polygons[[x]]@Polygons[[y]]@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) {map at polygons[[indexp]]@Polygons[[indexP]]@coords}
> # Or operate a function foo on the old coordinates
> coords.alt <- mapply(foo,
> map at polygons[[indexp]]@Polygons[[indexP]]@coords[,1],
> map at polygons[[indexp]]@Polygons[[indexP]]@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 at polygons[[1]]@Polygons[[1]]@coords <- foo(1,1)
>
> will work fine, but the following will not.
>
> newcoords <- function(indp, indP) {
>    p at polygons[[indp]]@Polygons[[indP]]@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.
>
>
>
>

--
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of