You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:02:46