使用raster::getData提取的美国两州矢量图形显示异常问题
问题成因与修复方案
成因
GADM提供的美国伊利诺伊州空间数据属于多部件多边形(MultiPolygon),其中包含拓扑无效的子多边形(比如自相交、环方向错误);直接通过属性筛选生成子集后,这些拓扑问题未被自动修正,导致plot()函数渲染图形时出现异常。另外,SpatialPolygonsDataFrame子集化过程中,可能出现多边形ID关联错乱,引发几何信息丢失或显示异常。
修复方案
方案一:使用sf包(推荐,拓扑处理更健壮)
sf包对空间数据的拓扑兼容性更好,能自动修复多数常见问题:
# 加载依赖包 library(raster) library(sf) # 获取GADM数据并转换为sf格式 states <- raster::getData("GADM", country = "United States", level = 1) %>% st_as_sf() # 筛选目标州并修复拓扑 statesilwi <- states[states$NAME_1 %in% c("Illinois", "Wisconsin"), ] %>% st_make_valid() # 验证绘图 plot(st_geometry(statesilwi))
方案二:使用rgeos包修复sp对象
如果需要继续使用SpatialPolygonsDataFrame,可以通过零宽度缓冲区修正拓扑:
# 加载依赖包 library(raster) library(rgeos) # 获取并筛选数据 states <- raster::getData("GADM", country = "United States", level = 1) statesilwi <- states[states$NAME_1 == "Illinois" | states$NAME_1 == "Wisconsin",] # 修复拓扑错误 statesilwi_valid <- gBuffer(statesilwi, byid = TRUE, width = 0) # 验证绘图 plot(statesilwi_valid)
说明
st_make_valid():sf包的核心拓扑修复函数,能自动检测并修正自相交、无效环等问题,保留原始几何特征。gBuffer(..., width=0):通过创建零宽度缓冲区的方式,间接清理自相交的多边形,同时维持原形状不变。
内容的提问来源于stack exchange,提问作者Melissa Duda
相关产品推荐
相关产品推荐

