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")
输出
我有一个嵌套的坐标列表,格式如下:
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")
输出