在R中处理Shape文件时,如何保留SpatialPolygonsDataFrame类型?
解决gDifference返回SpatialPolygons而非SpatialPolygonsDataFrame的问题
我来帮你搞定这个问题!rgeos::gDifference()在执行差值运算后,确实只会返回SpatialPolygons对象——它不会自动保留原SpatialPolygonsDataFrame里的属性数据,不过我们可以手动把数据框和运算结果结合起来,转换成你需要的类型。
具体步骤和修改后的代码:
你已经通过byid=T和id=ID参数让运算结果的多边形ID和原shape_1的ID对应上了,这一步非常关键!接下来只需要把原数据框里对应ID的行提取出来,再和SpatialPolygons对象组合即可:
# 你的原有代码 ID <- as.character(shape_1@data$ID) shape.gDiff <- gDifference(shape_1, shape_2, byid=T, id=ID) # 1. 匹配运算结果的多边形ID与原数据框的行 # 确保数据行的顺序和shape.gDiff的多边形顺序完全一致 matched_data <- shape_1@data[match(names(shape.gDiff), shape_1@data$ID), ] # 2. 转换为SpatialPolygonsDataFrame # 设置match.ID=FALSE,因为我们已经手动完成了ID匹配,避免函数自动匹配出错 shape.gDiff_spdf <- SpatialPolygonsDataFrame(shape.gDiff, data = matched_data, match.ID = FALSE)
注意事项:
- 检查
matched_data里有没有NA行:如果某些原多边形在差值运算后完全被剔除(没有剩余区域),对应的行就会变成NA,你可以根据需求过滤掉这些行,比如matched_data <- na.omit(matched_data),同时也要同步过滤shape.gDiff对应的多边形。 - 确保输入的两个Shape文件CRS一致:如果
shape_1和shape_2的坐标参考系统不同,先使用spTransform()统一CRS,否则差值运算可能出现异常。
内容的提问来源于stack exchange,提问作者martins
相关产品推荐
相关产品推荐

