sf包st_intersection警告转错误的原因及解决方法咨询
sf包st_intersection警告转错误的原因与解决办法
原因
sf包在1.0.x版本后,将原本「attribute variables are assumed to be spatially constant throughout all geometries」的警告升级为错误。这是因为执行空间交集操作时,若两个输入图层都带有属性字段,sf默认会假设这些属性在对应几何范围内是恒定的,但实际交集后属性的归属可能存在歧义。升级为错误是为了强制用户明确处理属性逻辑,避免潜在的数据错误。你使用的sf 1.0.7正好是启用该规则的版本。
解决办法
根据需求,有以下几种处理方式:
方式1:仅保留单个图层的属性
如果只需要其中一个图层的属性(比如保留县的名称),可以将另一个图层转为纯几何对象(去掉属性):
library(sf) library(tigris) library(dplyr) states <- states(cb = T) %>% select(state = NAME) %>% filter(state == "Wisconsin") wi.counties <- counties(state = "WI", cb = T) %>% select(county = NAME) # 将states转为纯几何,交集后保留wi.counties的属性 intersection <- st_intersection(st_geometry(states), wi.counties)
方式2:明确声明属性为空间恒定
如果你确认两个图层的属性在各自几何范围内确实是恒定的(比如states的state字段始终是Wisconsin,每个county的county字段仅对应自身几何),可以用st_set_agr设置属性聚合规则:
library(sf) library(tigris) library(dplyr) states <- states(cb = T) %>% select(state = NAME) %>% filter(state == "Wisconsin") %>% st_set_agr("constant") # 声明state属性为空间恒定 wi.counties <- counties(state = "WI", cb = T) %>% select(county = NAME) %>% st_set_agr("constant") # 声明county属性为空间恒定 intersection <- st_intersection(states, wi.counties)
方式3:仅获取交集几何(无属性)
如果不需要任何属性,仅需交集后的空间几何,可以将两个图层都转为纯几何:
intersection <- st_intersection(st_geometry(states), st_geometry(wi.counties))
内容的提问来源于stack exchange,提问作者John J.
相关产品推荐
相关产品推荐

