在R中查找美国众议院选区内的德克萨斯州人口普查区块
解决美国众议院选区内人口普查区块筛选问题
嘿,我来帮你搞定这个空间数据筛选的麻烦!你遇到的NULL报错,大概率是因为直接把.shp文件名传给了函数,而不是先读取成有效的空间对象,咱们一步步来解决:
第一步:先正确读取空间数据
不管用传统的sp包还是更现代的sf包,首先得把.shp文件转换成R能识别的空间对象,不能直接拿文件名当参数用。
用sp/raster包读取(兼容旧代码)
library(raster) # 读取两个shp文件,存为可操作的空间对象 cd32 <- shapefile("CD32.shp") subblocks <- shapefile("SUBBLOCK_ALL.shp") # 检查对象是否有效(避免出现NULL) class(cd32) # 正常应该返回"SpatialPolygonsDataFrame" head(subblocks)
用sf包读取(推荐,更易用且维护活跃)
sp包已经停止维护了,sf是当前空间数据处理的主流工具,语法更简洁:
library(sf) cd32_sf <- st_read("CD32.shp") subblocks_sf <- st_read("SUBBLOCK_ALL.shp") # 再次确认CRS完全一致(你说一致,但多检查一步更稳妥) st_crs(cd32_sf) == st_crs(subblocks_sf)
第二步:筛选选区内的人口普查区块
根据你的需求,分两种常见场景:和选区相交的区块,或者完全包含在选区内的区块,分别提供两种包的实现方法:
用sp+rgeos包实现
确保两个对象都是有效的SpatialPolygonsDataFrame后:
library(rgeos) # 场景1:筛选和CD32选区相交的区块 intersect_ids <- gIntersects(subblocks, cd32, byid = TRUE) cd32_subblocks <- subblocks[intersect_ids[, 1], ] # 场景2:筛选完全包含在CD32选区内的区块 contains_ids <- gContains(cd32, subblocks, byid = TRUE) cd32_subblocks <- subblocks[contains_ids[, 1], ]
用sf包实现(更简洁高效)
sf的st_filter函数可以直接按空间关系筛选,代码更易读:
# 场景1:筛选和选区相交的区块 cd32_subblocks_sf <- st_filter(subblocks_sf, cd32_sf, .predicate = st_intersects) # 场景2:筛选完全包含在选区内的区块 cd32_subblocks_sf <- st_filter(subblocks_sf, cd32_sf, .predicate = st_within)
为什么你之前的方法会报错?
你之前用raster::aggregate(rbind(SUBBLOCK_ALL.shp, CD32.shp))和rgeos::gIntersection时,都是直接传入了.shp文件名——R无法直接把文件名识别为空间对象,所以返回了NULL,进而触发了那些报错。
额外注意事项
- 确认文件路径正确:如果.shp文件不在当前工作目录,要写完整路径(比如
"C:/your_data_folder/CD32.shp") - 若数据量极大,sf包的方法效率更高,还可以通过
st_filter(..., progress = TRUE)查看处理进度 - 确保CRS完全匹配:哪怕看起来都是WGS84,也要检查proj4字符串是否完全一致(比如有没有细微的参数差异)
内容的提问来源于stack exchange,提问作者Jim B
相关产品推荐
相关产品推荐

