2 votos

Fusionar una lista de SpatialLines

Empecé con un SpatialPointsDataFrame, que contiene ubicaciones de animales que llevan registradores GPS. Además de las coordenadas, el marco de datos también contiene el ID de los animales y una marca de tiempo.

A partir de este SpatialPointsDataFrame, he creado líneas que muestran la trayectoria de cada animal durante el periodo de seguimiento. He utilizado el siguiente código:

spdf4tri #el SpatialPointsDataFrame

ids=unique(spdf4tri$id)
trajectory <- list()
 for (i in ids){ 
   spdf4bird<-subset(spdf4tri, id==i)
   birdtrajectory<-SpatialLines(list(Lines(list(Line(spdf4bird)), "id")))
   trajectory[[i]]<-birdtrajectory
   print(i)
 }

Ahora, tengo un problema, porque trajectory es de la clase 'lista'. No sé cómo quitarla de la lista.

5voto

Dan Puntos 16

Como he mencionado en mi comentario, puede utilizar do.call para esto. He aquí un ejemplo.

Primero, añade la librería sp y crea una lista con tres objetos SpatialLines (también funcionaría con el objeto Lines).

library(sp)
sp.lines <- list()
  sp.lines[[1]] <- SpatialLines(list(Lines(list(Line(cbind(c(1,2,3),c(3,2,2)))),ID="a"))) 
  sp.lines[[2]] <- SpatialLines(list(Lines(list(Line(cbind(c(1,2,3)+0.5,c(3,2,2)+0.5))),ID="b"))) 
  sp.lines[[3]] <- SpatialLines(list(Lines(list(Line(cbind(c(1,2,3),c(1,1.5,1)))),ID="c"))) 

Ahora, utilice do.call con rbind para fusionar las líneas en un único objeto SpatialLines.

merged.lines <- do.call(rbind, sp.lines)
  class(merged.lines)
  length(merged.lines)
  plot(merged.lines, col=1:3)

2voto

yanpas Puntos 60

La pista es la construcción del objeto SpatialLines más tarde, una vez que tenga una lista de Lines objetos. El ID DEBE ser único, de lo contrario todos sus Lines tendrán el mismo ID, y SpatialLines arrojará un error.

He preparado este código de ejemplo para ilustrarlo:

 library(sp)
 library(raster) # need a raster to generate fake data
 library(dismo)  # I'm using the "randomPoints" function from dismo

 # first we need a canvas
 # we can start with an arbitrary extent
 ext <- extent(-20,10,-10,0)
 r <- raster(ext) # this is our raster object
 r[] <- 1 # let's fill it up with 1's

 indiv <- LETTERS[1:5] # let's say we have 5 individuals with data
 df <- data.frame()
 # we are generating 10 random points per "individual"
 for (i in 1:5)
      df <- rbind(df,randomPoints(r, 10))
 # you will get a warning about the projection, ignore that.

 # with this we can generate a SpatialPointsDataFrame
 spdf <- SpatialPointsDataFrame(
              coords=as.matrix(df), 
              data=data.frame(ind=sort(rep(indiv,10))))

 # now we loop for each individual 
 # and store "Lines" objects in a list
 trajectories <- list()
 for (i in 1:length(indiv))
         trajectories[[i]] <- Lines(list(Line(subset(spdf, ind == indiv[i]))), 
                                    ID=paste(i))
 # pay close attention on how the Lines object must be structured:
 # Lines(list(Line(spdf)), ID="unique string")

 # then we simply transform our trajectories list to SpatialLines
 splo <- SpatialLines(trajectories)

A continuación, puedes visualizar los datos de la siguiente manera:

 image(r)
 plot(splo, add=T, col=rainbow(5))
 plot(spdf, add=T, pch=16, col=rainbow(5)[ spdf$ind ])

enter image description here

1voto

Dubrekken Puntos 11

Esto es una lista porque tú lo has pedido. Si tu pregunta es tener todas tus trayectorias dentro de un objeto que es un SpatialLines deberías probar esto:

ids=unique(spdf4tri$id)
trajectory <- list()
 for (i in ids){ 
   spdf4bird <- subset(spdf4tri, id == i)
   trajectory[[i]] <- Lines(list(Line(spdf4bird)), "id")
   print(i)
 }
trajectory.sp <- SpatialLines(trajectory)

Tienes entonces una Lines para cada animal. También puede añadir un marco de datos si tiene más información sobre los animales, por ejemplo, con su id otra vez:

trajectory.sp.data <- SpatialLinesDataFrame(trajectory.sp, 
    data = data.frame(id = ids))

A continuación, puede trazar con color en función de id :

plot(trajectory.sp.data, col = rainbow(length(ids))[trajectory.sp.data$id])

No puedo probar el script sin tus datos, pero esto debería funcionar.
¿Es esto lo que buscaba?

0voto

Jim Wooley Puntos 6323

Como alternativa: el rgeos tiene una función gLineMerge para fusionar directamente varias líneas de un SpatialLinesDataFrame a una sola línea:

library("rgeos")
merged_lines <- gLineMerge(your_spatial_data_frame)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X