R语言使用Tigris做地图相交如何保留全部图层边界
tigris处理明尼苏达县与居民点边界及绘图方案
问题核心
原代码存在两个逻辑问题:
- 调用
counties()、places()时未指定state参数,会先下载全美范围数据再过滤,运行效率极低 - 直接对两个图层做
st_intersection()会返回两个图层几何重叠的裁切片段,不会保留完整县级边界,单独绘制该结果自然无法显示完整县界
原错误绘图效果如下:
完整实现步骤
1. 加载依赖包
library(tigris) library(sf) library(dplyr) library(tmap) # 开启本地缓存,避免重复下载数据 options(tigris_use_cache = TRUE)
2. 数据获取与正确相交/关联
直接在tigris接口中指定明尼苏达州(州缩写MN),仅下载目标州数据,无需额外过滤:
# 获取明尼苏达县级简化制图边界 mn_counties <- counties(cb = TRUE, state = "MN") # 获取明尼苏达居民点简化制图边界 mn_places <- places(cb = TRUE, state = "MN")
如果需求是给居民点附加所属县的属性(如县名、县FIPS编码,这也是多数场景下做空间匹配的目标),无需裁切几何,使用空间连接即可,能完整保留两个图层的原始边界:
# 空间匹配:为每个居民点关联其所属县的属性 mn_places_with_county_attr <- st_join( x = mn_places, y = mn_counties %>% select(COUNTYFP, NAME, NAMELSAD), join = st_intersects )
如果确实需要做几何相交(即得到被县界分割后的居民点几何片段,同时保留双方法定边界的属性匹配),原有相交逻辑可以保留,但要清楚该输出结果是裁切后的片段,不包含完整县界:
# 几何相交(按需使用) mn_intersected <- st_intersection(mn_places, mn_counties)
3. 同时展示两层边界的绘图代码
tmap遵循先绘图层在下层、后绘图层在上层的叠加逻辑,分别加载两个图层,设置差异化的填充、边框样式即可同时显示两类边界:
tm_shape(mn_counties) + # 县界作为底图:浅灰填充、深灰细边框 tm_polygons( fill = "#f0f0f0", col = "#636363", lwd = 0.7, alpha = 1 ) + tm_shape(mn_places) + # 居民点边界叠在上层:透明填充、蓝色粗边框,避免遮盖底图县界 tm_polygons( fill = NA, col = "#2171b5", lwd = 1 ) + # 可选布局元素 tm_layout( main.title = "明尼苏达州县级边界与居民点分布", main.title.size = 1.1, frame = FALSE ) + tm_scale_bar(position = c("left", "bottom")) + tm_compass(position = c("right", "top"))
4. 导出shapefile
使用st_write将处理好的图层导出为shapefile格式即可:
# 导出县级边界 st_write(mn_counties, "mn_county_boundary.shp", delete_layer = TRUE) # 导出带县属性的居民点边界 st_write(mn_places_with_county_attr, "mn_places_with_county.shp", delete_layer = TRUE)
提示:
cb = TRUE返回的是简化后的制图边界,适合快速出图;如果需要开展高精度空间分析,将参数设置为cb = FALSE即可下载TIGER/Line原始高精度边界数据。
内容的提问来源于stack exchange,提问作者Adriana Castillo Castillo
相关产品推荐
相关产品推荐

