R从嵌套的坐标列表创建sf折线

R create sf polyline from nested list of coordinates

我有一个嵌套的坐标列表,格式如下:

feature <- list(type = "Feature", properties = list(`_leaflet_id` = 125L, 
    feature_type = "polyline"), geometry = list(type = "LineString", 
    coordinates = list(list(-176.264648, 59.355596), list(-165.541992, 
        60.951777), list(-158.510742, 57.891497))))

我正在尝试通过将嵌套列表坐标解压缩为几何图形,将其转换为简单的要素 sf 层。

我尝试了以下实验,试图先制作坐标数据框,但 none 似乎可行。

xs <- as.data.frame(feature) 
xs <- bind_rows(feature[["geometry"]][["coordinates"]])
xs <- feature[["geometry"]] %>% set_names() %>% bind_rows() 

有直接的方法吗?

注意:坐标对(直线上的顶点)的数量是任意的,可能会发生变化

如果你把它取消列出,然后把它放到一个矩阵中,sf 包中的 st_linestring 就可以使用它了。

coords <- matrix(unlist(feature$geometry$coordinates), byrow = TRUE, ncol = 2)

linestring <- st_linestring(coords)

plot(linestring)

您的 feature 看起来像是将 geojson 转换为 R 对象的结果

如果您在之前可以访问geojson对象,它被转换成您的feature,那么您可以忽略这里的to_json()步骤

library(sf)

## convert back to JSON

### Option 1
js <- jsonify::to_json(feature, unbox = TRUE)

### Option 2
js <- jsonlite::toJSON(feature, auto_unbox = TRUE)

## Then you can convert to SF

### Option 1
geojsonsf::geojson_sf(js)

### Option 2
sf::st_read(js)

这是一个tidyverse方法:

library(tidyverse)
library(sf)
  
map_dfr(feature$geometry$coordinates,
        ~ data.frame(.x) %>% set_names(c("x", "y"))) %>%
  as.matrix() %>%
  st_linestring() %>%
  st_sfc(crs = 4326) %>%
  st_as_sf() %>%
  ggplot() +
  geom_sf(lwd = 3, lineend = "round")

输出