如何在R中筛选sf对象仅保留CA、NM、AZ三州绘制耐寒区地图
筛选CA、AZ、NM三州USDA耐寒区数据的R实现
要获取加利福尼亚(CA)、亚利桑那(AZ)、新墨西哥(NM)三州的USDA耐寒区数据,你不能直接用filter()做字符串匹配——这份耐寒区shapefile没有内置州缩写字段,正确做法是通过空间关系筛选,保留与三州边界相交的耐寒区多边形。
完整修改后的代码
library(sf) library(tidyverse) library(USAboundaries) # 下载并读取州边界数据 state_zip <- "https://www.weather.gov/source/gis/Shapefiles/County/s_22mr22.zip" download.file(state_zip, destfile = "state_zip.zip", junkpaths=TRUE, overwrite=TRUE) unzip("state_zip.zip", junkpaths = TRUE, exdir = ".") state_boundaries <- read_sf("s_22mr22.shp") # 修正原代码的路径错误 # 下载并读取USDA耐寒区数据 temp_shapefile <- tempfile() download.file('http://prism.oregonstate.edu/projects/public/phm/phm_us_shp.zip', temp_shapefile) unzip(temp_shapefile) shp_hardness <- read_sf('phm_us_shp.shp') # 1. 筛选目标三州的边界 ca_az_nm <- state_boundaries %>% filter(STATE %in% c("CA", "AZ", "NM")) # 用%in%替代多条件|,代码更简洁 # 2. 先筛选指定耐寒区,再保留属于三州的部分 shp_hardness_subset <- shp_hardness %>% filter(str_detect(ZONE, '9b|10a|10b|6a|6b|7a|7b')) %>% st_filter(ca_az_nm, .predicate = st_intersects) # 空间过滤:保留与三州相交的区域 # 3. 绘制叠加地图 ggplot() + geom_sf(data = shp_hardness_subset, aes(fill = ZONE), color = "white") + geom_sf(data = ca_az_nm, fill = NA, color = "black", linewidth = 1) + theme_minimal() + labs(title = "CA/AZ/NM 指定USDA耐寒区地图", fill = "耐寒区")
关键说明
- 用
%in%替代多个|,代码更简洁易维护 st_filter()是sf包的空间过滤函数,st_intersects作为匹配规则,确保只保留与三州边界有交集的耐寒区多边形- 修正了原代码中读取州边界的路径错误(原路径多了一个无效的点前缀)
内容的提问来源于stack exchange,提问作者hnguyen
相关产品推荐
相关产品推荐

