将包含多边形坐标的数据框转换为 sf

Convert data frame containing coordinates of polygons to sf

我是 sf 包的初学者,我在将我的数据框转换为 sf 对象时遇到了一些困难。

我有一个数据框,其中每行包含多边形的坐标。这些坐标位于一列中。

这是我的数据框结构的示例:

dat <- tibble::tribble(
    ~code,    ~geometry,
    "MIE",    list(c(1.24, 45), c(1.25, 45), c(1.25, 46), c(1.24, 45)),
    "MIS",    list(c(1.23, 44), c(1.23, 45), c(1.24, 45), c(1.23, 44))
    )

我想从这个数据框创建一个 sf 对象,但 R 无法识别几何列。

我尝试了 st_sf()st_geometry()st_polygon() 等列表格式和函数,但没有成功。

正在尝试 st_sf(dat) returns:

st_sf(dat) 中的错误:

Error in st_sf(dat) : no simple features geometry column present

正在尝试 st_polygon(dat$geometry) returns :

Error in vapply(x, ncol, 0L) : values must be length 1,
  but FUN(X[[1]]) result is length 0

有什么方法可以将我的数据框转换为 sf 对象吗?

我正在使用 R 版本 3.6.0。

我也一直在努力进行这种 sf 转换,因为它不是直截了当的。

第一步(也是困难的部分)是为所表示的每个单独的几何体构建一个 st_object(这里是 st_polygon)。

为此,将每个现有 list 转换为 matrix。一旦每个多边形表示是 n-row matrix(每个点一行),我们将矩阵转换为一个元素 list 以馈入 st_polygon()。现在 dat$geometry 是一个适当分类的列表 POLYGONS.

library(tidyverse)

dat %>%
  mutate(geometry = map(geometry,
                        ~ do.call(rbind, .) %>% # make each list a matrix
                          list() %>% # st_polygon() requires a list
                          st_polygon()
                    )
         ) %>% 
  st_as_sf()

然后最后一步是对整个数据框调用st_as_sf()。它将 auto-detect 现在格式正确的 geometry 列并为您生成一个漂亮的新 sf 对象。制图愉快!

编辑:如果你想构建带孔的多边形,过程类似。 st_polygon() 将处理 multi-element 列表,就好像第一个元素是多边形,其余元素是第一个中的孔。它确实需要你使用 map 两次,因为你仍然需要从每个列表元素构建一个矩阵,但需要将分组矩阵的列表放在一起以处理空洞。

dat2 <- tibble::tribble( ~code, ~geometry, "MIE", list(list(c(1.24, 45), c(1.25, 45), c(1.25, 46), c(1.24, 45)), list(c(1.245,45.5), c(1.246,45.7), c(1.245,45.5))) )

 dat %>%
  mutate(geometry = map(dat$geometry,
                        ~ map(.,
                          ~ do.call(rbind, .) # make each list a matrix
                          ) %>% 
                        st_polygon()
                        )
  ) %>% 
  st_as_sf()