2 votos

Obtener la longitud de los componentes de una multilínea

Estoy buscando conseguir no la longitud del en general multilinestring sino la longitud del componentes . Esto es lo que tengo hasta ahora:

library(sf)

s1 <- rbind(c(0,3),c(0,4),c(1,5),c(2,5))
s2 <- rbind(c(0.2,3), c(0.2,4), c(1,4.8), c(2,4.8))
s3 <- rbind(c(0,4.4), c(0.6,5))
mls <- st_multilinestring(list(s1,s2,s3))

# calculate overall length
st_length(mls)

# split multilinestring into component linestring objects
mls_points <- st_cast(mls, "MULTIPOINT")
mls_split <- st_split(mls, mls_points)

plot(mls)
plot(mls_points, add = TRUE, col = "red")

# error on length of split output
st_length(mls_split)

Error: inherits(x, "sfc_LINESTRING") || inherits(x, "sfc_MULTILINESTRING") no es TRUE

enter image description here

Tal vez hay algo que se supone que debo hacer con st_cast ?

6voto

Jay Bazuzi Puntos 194

Crear un sfc primero, y luego usar st_cast que lo dividirá en LINESTRINGs:

> st_length(st_cast(st_sfc(mls),"LINESTRING"))
[1] 3.4142136 3.1313708 0.8485281

estos suman st_length(mls) .

Me costó un poco de trabajo averiguar esto, la ayuda no fue útil:

el método 'st_cast' para objetos 'sf' sólo puede dividir geometrías, por ejemplo, convertir "MULTIPOINT" en múltiples características "POINT".

hasta que me di cuenta de que decía "para sf objetos" y no tenías una sf objeto, tenías un sfg objeto. No estoy seguro de por qué st_cast no los divide, pero la solución es bastante sencilla una vez que se sabe.

1voto

obrl_soil Puntos 53

Esto probablemente no es muy elegante, pero

# split multilinestring into component linestring objects and then to points
mls_pts <- st_sfc(mls) %>%
  st_cast(., 'LINESTRING') %>%
  lapply(., function(x) {
    st_sfc(x) %>% 
      st_cast(., 'POINT')})

# get distances between points
mls_seglengths <- lapply(mls_pts, function(d) {
  start <- 1:(length(d)-1)
  end   <- 2:length(d)
  dists <- mapply(function(a,b) {st_distance(d[a], d[b])}, a = start, b = end)
})

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