我是使用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。
答案 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()