r - 将输出从 sf::st_within 转换为向量

adl*_*adl 6 gis r dataframe dplyr r-sf

我试图在 R 中使用 sf 包来查看 sf 对象是否在另一个具有该st_within函数的sf 对象中。我的问题是这个函数的输出是稀疏几何二进制谓词 -sgbp我需要一个向量作为输出,以便我可以在dplyr之后使用该包进行过滤。这是一个简化的示例:

# object 1: I will test if it is inside object 2
df <- data.frame(lon = c(2.5, 3, 3.5), lat = c(2.5, 3, 3.5), var = 1) %>% 
st_as_sf(coords = c("lon", "lat"), dim = "XY") %>% st_set_crs(4326) %>%
  summarise(var = sum(var), do_union = F) %>% st_cast("LINESTRING")

# object 2: I will test if it contains object 1
box <- data.frame(lon = c(2, 4, 4, 2, 2), lat = c(2, 2, 4, 4,2), var = 1) %>%
  st_as_sf(coords = c("lon", "lat"), dim = "XY") %>% st_set_crs(4326) %>% 
  summarise(var = sum(var), do_union = F) %>% st_cast("POLYGON")

# test 1
df$indicator <- st_within(df$geometry, box$geometry) # gives geometric binary predicate on pairs of sf sets which cannot be used 
df <- df %>% filter(indicator == 1)
Run Code Online (Sandbox Code Playgroud)

这给出了错误:列indicator必须是一维原子向量或列表。

我尝试在下面解决这个问题:

# test 2
df$indicator <- st_within(df$geometry, box$geometry, sparse = F) %>% 
  diag() # gives matrix that I convert with diag() into vector
df <- df %>% filter(indicator == FALSE)
Run Code Online (Sandbox Code Playgroud)

这有效,它删除了包含 TRUE 值的行,但由于我的真实数据包含许多观察结果,因此我的计算制作矩阵的过程非常缓慢。有没有办法使st_within字符向量的输出,或者可能是一种在不制作矩阵的情况下转换sgbp为与字符向量兼容dplyr的方法?

seb*_*rno 11

以下是从稀疏几何二元谓词中获取逻辑向量的方法:

df$indicator <- st_within(df, box) %>% lengths > 0
Run Code Online (Sandbox Code Playgroud)

或者在不创建新变量的情况下进行子集化:

df <- df[st_within(df, box) %>% lengths > 0,]
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法对您的大型数据集进行测试,但请告诉我它是否比矩阵方法更快。