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

时间:2019-05-22 14:01:32

标签: r geometry polygon 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)返回:

st_sf(dat)中的错误:

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

尝试st_polygon(dat$geometry)返回:

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

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

我正在使用R版本3.6.0。

1 个答案:

答案 0 :(得分:1)

我也总是为此进行sf转换而苦恼,因为它不是直接的。

第一步(也是最困难的部分)是为每个表示的几何图形构建一个st_object(在这里st_polygon)。

为此,请将每个现有的list转换为matrix。一旦每个多边形表示为n行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()。它将自动检测格式正确的geometry列,并为您生成一个不错的新sf对象。映射愉快!

EDIT :如果要构建带孔的多边形,则过程类似。 st_polygon()将处理多元素列表,就好像第一个元素是多边形,而其余元素是第一个元素中的孔一样。确实需要两次使用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()