[R-sig-Geo] Coercing spatstat::psp to sp:SpatialLines
Rolf Turner
r.turner at auckland.ac.nz
Thu Nov 17 02:51:37 CET 2011
On 16/11/11 20:49, Mathieu Rajerison wrote:
> Finally, I got a SpatialLines from a psp object (here named aix.psp)
>
> Here's how I got it:
>
> coords<- aix.psp$ends
> nc<- nrow(coords)
> out<- vector(mode="list", length=nc)
>
> for (i in seq(along=out)) {
> lLine<-Line(cbind(c(coords[i,1], coords[i,3]), c(coords[i,2],
> coords[i,4])))
> out[[i]]<- Lines(list(lLine), ID=i)
> }
>
> aix.lines<- SpatialLines(out)
>
> I don't find my solution very elegant. I wondered if a simpler code could
> be written using lapply function.
>
> For that purpose, I did:
> liste<-lapply(coords, function(x) Line(cbind(c(x[1], x[3]), c(x[2], x[4]))))
> but I don't know how to create a list of this one, with an incrementating
> ID, which is required for constructing a Lines object as
> Lines(list(LineList), ID=i)
> It's more a general R problem than an R-sig-geo one but if anyone here has
> the issue, I would be thankful.
I hacked your code a bit and came up with the following:
# Generic function for S3 method:
as.SpatialLines <- function(from) {
UseMethod("as.SpatialLines")
}
# Method for class "psp".
as.SpatialLines.psp <- function (from) {
foo <- function(i,x){
y <- matrix(unlist(x[i,]),2,2,byrow=TRUE)
Lines(list(Line(y)),ID=i)
}
coords <- from$ends
SpatialLines(lapply(1:nrow(coords),foo,x=coords))
}
After sourcing in these two functions, try:
check <- as.SpatialLines(aix.psp)
and then compare:
all.equal(check,aix.lines) # Should get TRUE!!!
I *thought* that after having defined as.SpatialLines.psp() as above I would
be able to do:
check <- as(aix.psp,"SpatialLines")
but that gave me the error
Error in as(aix.psp, "SpatialLines") :
no method or default for coercing "psp" to "SpatialLines"
even though I had just written such a method! There must be some extra
S4 classes and methods magic required here, that I don't know about.
Roger?
(I never touch S4 classes and methods with a sterilised barge-pole!)
cheers,
Rolf
More information about the R-sig-Geo
mailing list