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

4

我是一个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对象?

我正在使用版本为3.6.0的R


2
如果数据样本可以以我们可以粘贴到脚本中的格式(例如通过调用dput)呈现,那么帮助您将更加容易。如果我们能够看到未能正常工作的代码——您如何尝试使用st_sf?这也会更容易提供帮助。 - camille
1
我尝试过 st_geometry(dat) <- st_sf(st_polygon(dat$geometry))dat.sf <- st_sf(dat)。此外,我发现有时几何图形可以被两次包装在列表中,例如 list(list(c(x1,y1),c(x2,y2))),但这并不会改变任何东西。我也尝试了 st_sfc,但我不确定它与 st_sf 的区别... - ldavadan
1个回答

4

我总是在尝试进行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对象。愉快地绘制地图吧!

编辑:如果你想建立有空洞的多边形,这个过程也类似。 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()

可以,谢谢。你有没有办法处理带有洞的多边形?例如:dat <- 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))) )第一个列表是多边形,第二个列表是洞。 - ldavadan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接