2 votos

Número de segmentos en SpatialLinesDataFrame

Tras importar un marco de datos de líneas espaciales con readOGR Me gustaría determinar el número de segmentos de línea (nodos) de cada línea. No encuentro una forma práctica de exportar simplemente las longitudes como vector.

routes@lines me llevará a las ranuras de las líneas, pero entonces ¿cómo se obtiene la longitud de cada una?

Por ejemplo, en los datos de muestra que aparecen a continuación, vemos que la primera línea está compuesta por 93 segmentos, la segunda por 170 segmentos, la tercera por 91 segmentos, etc.

Al final, me gustaría un vector de 1657 números que representan la longitud de los segmentos de línea en el SpatialLinesDataFrame

¿Hay alguna solución rápida?

> class(routes)
[1] "SpatialLinesDataFrame"
attr(,"package")
[1] "sp"
> str(routes)
Formal class 'SpatialLinesDataFrame' [package "sp"] with 4 slots
  ..@ data       :'data.frame': 1657 obs. of  3 variables:
  .. ..$ start_time: Factor w/ 1631 levels "2016/09/09 00:00:02",..: 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ duration  : int [1:1657] 786 1248 738 786 651 660 616 889 408 475 ...
  .. ..$ difftime  :Class 'difftime'  atomic [1:1657] 2 4 19 67 92 119 170 202 206 213 ...
  .. .. .. ..- attr(*, "units")= chr "secs"
  ..@ lines      :List of 1657
  .. ..$ :Formal class 'Lines' [package "sp"] with 2 slots
  .. .. .. ..@ Lines:List of 1
  .. .. .. .. ..$ :Formal class 'Line' [package "sp"] with 1 slot
  .. .. .. .. .. .. ..@ coords: num [1:93, 1:2] -79.9 -79.9 -79.9 -79.9 -79.9 ...
  .. .. .. ..@ ID   : chr "0"
  .. ..$ :Formal class 'Lines' [package "sp"] with 2 slots
  .. .. .. ..@ Lines:List of 1
  .. .. .. .. ..$ :Formal class 'Line' [package "sp"] with 1 slot
  .. .. .. .. .. .. ..@ coords: num [1:170, 1:2] -79.9 -79.9 -79.9 -79.9 -79.9 ...
  .. .. .. ..@ ID   : chr "1"
  .. ..$ :Formal class 'Lines' [package "sp"] with 2 slots
  .. .. .. ..@ Lines:List of 1
  .. .. .. .. ..$ :Formal class 'Line' [package "sp"] with 1 slot
  .. .. .. .. .. .. ..@ coords: num [1:91, 1:2] -79.9 -79.9 -79.9 -79.9 -79.9 ...
  .. .. .. ..@ ID   : chr "2"

1voto

sgwill Puntos 2444

ggplot2 fortify es bueno para esto. Una vez que tenga una tabla de todas las coordenadas, identificados por 'id' (fila por objeto SpatialDF) y 'grupo' (partes por objeto), entonces usted puede agrupar / por resumir.

library(dplyr)
library(ggplot2)
fortify(routes) %>% group_by(id, group) %>% 
 ## number of points per group
 summarize(npoint = n()) %>% 
 ## number of points per id
 summarize(npoint = sum(npoint))

Si realmente quieres decir segmentos podrías restar primero de la cuenta de puntos.

Mi pseudocódigo puede estar fuera de lugar, pero una vez que entiendes la salida de fortify es fácil modificar un resumen para adaptarlo.

1voto

Lordakin Puntos 18

Este método funciona

sapply( routes@lines, function (x) dim(x@Lines[[1]]@coords)[1] )

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