如何将dataframe转回SpatialPolygonsDataFrame?附示例代码
将DataFrame转回SpatialPolygonsDataFrame的方法
你提到用fortify()和join()把SpatialPolygonsDataFrame转成了dataframe(utah.df),现在想把它转回和原utah一致的对象,其实可以通过以下步骤实现:
1. 准备依赖包
首先确保加载了sp和plyr包(原示例用了join,所以plyr是必要的):
library(sp) library(plyr)
2. 从DataFrame重建多边形几何信息
utah.df里包含了每个多边形的坐标、分组(group)、是否为洞(hole)等信息,我们需要按这些信息重新构建Polygons对象:
# 按group分组,每个group对应多边形的一个部分(主体或洞) polygons_list <- ddply(utah.df, .(group), function(df) { # 创建单个Polygon对象,指定是否为洞 single_poly <- Polygon(df[, c("long", "lat")], hole = unique(df$hole)) # 创建Polygons对象,ID用当前group值 Polygons(list(single_poly), ID = unique(df$group)) }) # 将Polygons列表转换为SpatialPolygons对象 spatial_polygons <- SpatialPolygons(polygons_list$V1) # 给重建的多边形设置和原utah一致的投影信息 proj4string(spatial_polygons) <- proj4string(utah)
3. 提取并关联属性数据
utah.df里的属性数据是重复的(每个坐标点都带了属性),所以需要先去重,再关联到SpatialPolygons上:
# 提取非几何相关的属性列,去重 attr_data <- unique(utah.df[, !names(utah.df) %in% c("long", "lat", "order", "hole", "piece", "group")]) # 确保属性数据的行名和多边形的ID对应(这里用id列作为行名) rownames(attr_data) <- attr_data$id # 组合成SpatialPolygonsDataFrame utah_restored <- SpatialPolygonsDataFrame(spatial_polygons, data = attr_data, match.ID = "id")
4. 验证结果
你可以用all.equal()函数检查恢复后的对象和原utah是否一致:
all.equal(utah, utah_restored)
如果返回TRUE,说明已经成功恢复啦!
注意事项
- 如果你的多边形有多个部分(比如带洞),一定要按
group分组,而不是只按id,否则洞的信息会丢失。 - 投影信息很重要,别忘了给重建的
SpatialPolygons设置和原数据一致的投影,不然空间位置会出错。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

