【问题标题】:Merging Two SpatialPolygonsDataFrame Objects合并两个 SpatialPolygonsDataFrame 对象
【发布时间】:2017-03-30 15:22:18
【问题描述】:

使用可用的 shapefile here 我正在尝试两个合并苏丹和南苏丹的多边形,以便在 2010 年获得苏丹的边界。使 shapefile 在 R 中可用的代码是

library(rgdal)
africa    <- readOGR(dsn =  "Data/Shapes", layer = "AfricanCountries")
class(africa)
[1] "SpatialPolygonsDataFrame" attr(,"package") [1] "sp"

我尝试了不同的软件包和解决方案,例如 raster::intersectrgeos::gIntersectmaptools::unionSpatialPolygons。我总是得到一个空间对象,该对象丢失了属于两个多边形或根本没有联合的数据。

到目前为止,我有以下似乎不是很方便的解决方案:

# Seperate Polygons and Data
sp_africa  <- SpatialPolygons(africa@polygons, proj4string = CRS(proj4string(africa)))
dat_africa <- africa@data

# Delete South Sudan from dataframe
dat_africa <- dat_africa[-which(dat_africa$COUNTRY == "South Sudan"),]

# Add row.names to data according to polygon ID'S
rownames(dat_africa) <- dat_africa$OBJECTID

# Get all ID's
allIDs <- africa$OBJECTID

# Get the ID for Sudan, Primary Land (so we only merge the
# Sudan main land (no islands) with the South Sudan main land
sudanID <- africa[which(africa$COUNTRY == "Sudan" & africa$Land_Type == "Primary land"),]$OBJECTID

# Change ID of South Sudan to that of Sudan
allIDs[which(africa$COUNTRY == "South Sudan")] <- sudanID

# Now unite polygons and afterwards merge polygons with data
tmp     <- unionSpatialPolygons(sp_africa, IDs = allIDs)
africa2 <- SpatialPolygonsDataFrame(tmp, data = dat_africa)

如果有更简单、更方便的方法,我会很高兴知道。

【问题讨论】:

    标签: r gis shapefile


    【解决方案1】:

    您可以使用raster 包中的aggregate

    nsudan <- africa[africa$COUNTRY == "Sudan",]
    ssudan <- africa[africa$COUNTRY == "South Sudan",]
    
    plot(nsudan, axes = T, ylim = c(0, 25))
    plot(ssudan, add = T)
    

    sudan <- aggregate(rbind(ssudan, nsudan))
    plot(sudan)
    

    由于您创建了一个新的SpatialPolygons 对象,因此很难保留所有要素的数据。您可能应该附加来自nsudan的旧信息

    # remove Sudan and South Sudan
    africa <- africa[!africa$COUNTRY %in% c("Sudan", "South Sudan"),]
    
    # Adjust the Polygon IDs
    africa <- spChFIDs(africa, as.character(africa$OBJECTID))
    sudan <- spChFIDs(sudan, as.character(max(africa$OBJECTID) + 1))
    
    library(maptools)
    africaNew <- spRbind(sudan, africa)
    plot(africaNew)
    

    【讨论】:

    • 最后,我想在没有苏丹和南苏丹边界的情况下拥有相同的 SpatialPolygonsDataFrame。这也适用于聚合吗?
    • 在尝试汇总这两个国家/地区时,我也收到错误 Error in match.fun(FUN) : argument "FUN" missing
    • 不知道为什么,但aggregatesp 包中不可用,尽管它在文档中:Error: object ‘aggregate’ is not exported by 'namespace:sp'。我使用的是 1.2-3 版本。
    • 我在这个意义上编辑了我的问题,我添加了到目前为止的解决方案。它有效,但似乎不是最方便的方法。我会看看是否可以使用aggregate 使其更短。
    • 埃及似乎在你的最终地图中消失了。此外,苏丹和南苏丹之间的边界仍然存在。
    猜你喜欢
    • 2018-10-15
    • 1970-01-01
    • 2012-04-25
    • 2018-01-14
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多