将坐标点转换为坐标线 - 并保留变量

时间:2018-03-13 21:27:41

标签: r line geospatial points

我有一个大型数据集,其x,y坐标为91个不同的轨迹,由变量ID区分:

>     head(trjct)
     t        x      y        z     Etot   ID
1 0.00 696621.4 167730 1680.960 1192.526 sim1
2 0.01 696621.4 167730 1680.959 1192.526 sim1
3 0.02 696621.4 167730 1680.958 1192.526 sim1
4 0.04 696621.4 167730 1680.952 1192.526 sim1
5 0.06 696621.4 167730 1680.942 1192.526 sim1
6 0.08 696621.4 167730 1680.929 1192.526 sim1

我已设法将这些坐标转换为行:

  coordinates(trjct) <- ~x+y
  trjct_lines_coords <- lapply(split(trjct, trjct$ID), function(x) Lines(list(Line(coordinates(x))), x$ID[1L])) #first column = row number

但是,不包括变量Etot中包含的信息。如何创建一个行列表,每个行都有一行和列表中相应的Etot值?

我想为行创建一个data.frame,按id分组(每行一行),我还想保留Etot中包含的信息。

1 个答案:

答案 0 :(得分:1)

这是使用sf包进行此操作的一种方法,该方法擅长处理几何和空间数据。请注意,您需要ggplot2的开发版本才能使用geom_sf作为绘图。该方法非常简单,反映了sf的酷感,因为它可以很好地与其他tidyverse工具配合使用。我们使用st_as_sf转换为sf对象(将点坐标放入几何列),group_by(ID)summarise将点折叠为MULTIPOINT并将Etot合并为一个值,然后st_castMULTIPOINT几何转换为行。

library(tidyverse)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.0, proj.4 4.9.3
tbl <- read_table2(
  "t        z     Etot   ID
0.00 1680.960 1192.526 sim1
0.01 1680.959 1192.526 sim1
0.02 1680.958 1192.526 sim1
0.04 1680.952 1192.526 sim1
0.06 1680.942 1192.526 sim1
0.08 1680.929 1192.526 sim1"
)
#> Warning in rbind(names(probs), probs_f): number of columns of result is not
#> a multiple of vector length (arg 2)
#> Warning: 1 parsing failure.
#> row # A tibble: 1 x 5 col     row col   expected actual        file         expected   <int> <chr> <chr>    <chr>         <chr>        actual 1     6 ID    ""       embedded null literal data file # A tibble: 1 x 5

lines <- tbl %>%
  st_as_sf(coords = c("t", "z")) %>%
  group_by(ID) %>%
  summarise(Etot = mean(Etot)) %>%
  st_cast("LINESTRING")

ggplot(lines) +
  theme_bw() +
  geom_sf()

reprex package(v0.2.0)创建于2018-03-13。