如何使用R的sf包筛选保留被A3高速公路穿过的意大利市镇
问题原因
你使用的st_intersection()函数的作用是返回两个空间对象的重叠几何部分,当你用线要素(A3高速)和面要素(市镇)执行交集操作时,最终得到的comuni_A3本质是A3高速被各个市镇裁切后的线段集合,属于线类型,因此绘图时只会渲染线条,不会显示完整的市镇面域。
解决方案
改用空间相交判断筛选完整的市镇面域,你可以使用st_intersects()空间谓词搭配筛选逻辑,或者直接用sf包内置的st_filter()函数实现需求。
修正后的完整代码如下:
library(sf) library(dplyr) library(ggplot2) # 1. 提取A3高速,提前统一CRS避免空间判断错误 only_motorway_A3 <- only_motorway %>% filter(ref == "A3") %>% st_transform(32632) # 统一为你后续绘图用的EPSG:32632 # 2. 先统一市镇数据的CRS comuni <- comuni %>% st_transform(32632) # 3. 筛选所有和A3高速相交的完整市镇 # 方法1:用st_filter(代码更简洁) comuni_A3 <- st_filter(comuni, only_motorway_A3, .predicate = st_intersects) # 方法2:用st_intersects逻辑判断(更易理解底层逻辑) # comuni_A3 <- comuni[st_intersects(comuni, only_motorway_A3, sparse = FALSE), ] # 4. 绘图 ggplot() + geom_sf(data = comuni_A3, color = "gray30", size = 0.1, fill = "black") + # 面要素:fill控制填充色,color控制边界色 geom_sf(data = only_motorway_A3, size = 0.15, color = "green") + coord_sf(crs = 32632) + theme_void()
说明
- 空间筛选时建议提前统一两个数据集的坐标系,避免因CRS不匹配导致的空间判断错误
- 面要素绘图时
fill参数控制面的填充颜色,color参数控制面的边界颜色,你可以根据需要调整颜色参数达到预期视觉效果
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

