我试图在R中使用sf包,以使用st_within函数查看sf对象是否在另一个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) 

这给出了错误:列 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) 

这行得通,它删除了包含TRUE值的行,但是由于我的实际数据包含许多观察值,因此矩阵的生成过程对于我的计算而言非常缓慢。有没有一种方法可以使 st_within的输出成为字符向量,或者有可能在不创建矩阵的情况下将 sgbp转换为与 dplyr兼容的字符向量?

请您参考如下方法:

这是从稀疏几何二进制谓词中获取逻辑向量的方法:

df$indicator <- st_within(df, box) %>% lengths > 0 

或子集而不创建新变量:
df <- df[st_within(df, box) %>% lengths > 0,] 

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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!