2

我在对 sf 对象进行逐行操作时遇到了一些麻烦,其中几何是多边形类型。

by_row 中的 sf 函数似乎不起作用,例如以下应该创建一个包含边界框对象的列表列:

 purrr::by_row(sf_polygons_object, function(x) {
   list(st_bbox(x))
 }, .to = 'bb')

UseMethod(“st_bbox”)中的错误:没有适用于“st_bbox”的适用方法应用于类“c('tbl_df','data.frame')”的对象

(本身不是最有用的例子,但演示了问题)。

我尝试了一些替代方法,例如rowwise() %>% mutate(), mutate( x = apply(., 1, function(x) ...)),但都没有,因为它们没有为 st_bbox() 提供它需要的 sf 对象。这是一个错误,还是我处理得不好?

编辑:可重现的例子

library(sp)
library(rgdal)
library(rgeos)
library(sf)
library(tidyverse)
library(rnaturalearth)

nec <- st_as_sf(ne_countries()[1:5,]) %>%
  purrr::by_row(., function(x) st_bbox(x), .to = 'bb')
4

3 回答 3

7

不需要黑客。只需拆分和映射函数:

st_as_sf(ne_countries()[1:5,]) %>% 
  mutate(bb = split(., 1:5) %>% purrr::map(st_bbox))
于 2017-04-29T11:07:45.310 回答
1

我发现不使用管道要容易得多。这是皮埃尔在没有管道的情况下重写的答案:

nec       <- st_as_sf(ne_countries()[1:5,])
nec_split <- split(nec, 1:5)
nec_map   <- map(nec_split, st_bbox)
nec       <- mutate(nec, bb = nec_map)
于 2017-04-29T12:35:58.990 回答
1

我不得不摆弄一下。你必须使用一个sf对象吗?在这种情况下,这将为您提供每个多边形的边界框列表:

library(sp)
library(rgdal)
library(sf)
library(tidyverse)
library(rnaturalearth)
library(rgeos)
library(purrr)

nec <- as.list(st_as_sf(ne_countries()[1:5,])$geometry) %>% lapply(., st_bbox)
nec

导致:

[[1]]
    xmin     ymin     xmax     ymax 
60.52843 29.31857 75.15803 38.48628 

[[2]]
      xmin       ymin       xmax       ymax 
 11.640096 -17.930636  24.079905  -4.438023 

[[3]]
    xmin     ymin     xmax     ymax 
19.30449 39.62500 21.02004 42.68825 

[[4]]
    xmin     ymin     xmax     ymax 
51.57952 22.49695 56.39685 26.05546 

[[5]]
     xmin      ymin      xmax      ymax 
-73.41544 -55.25000 -53.62835 -21.83231 
于 2017-04-29T10:58:27.197 回答