You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:15:05