2016-11-16 218 views
3

使用可用的shape文件here我想两个合并苏丹和南苏丹的多边形,让我得到苏丹的边界在2010年我的代码,以使R中可用的shape文件是合并两个SpatialPolygonsDataFrame对象

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([email protected], proj4string = CRS(proj4string(africa))) 
dat_africa <- [email protected] 

# 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) 

如果有一个更简单,更方便的方法,我会很高兴知道这件事。

回答

4

您可以使用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) 

north and south sudan

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

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) 

africa new

+0

追加旧的信息最后,我想有相同SpatialPolygonsDataFrame只是没有苏丹和南苏丹之间的边界。这也可以用于聚合吗? –

+0

当我尝试聚合两个国家时,我也遇到错误'Match.fun(FUN):Error“参数”FUN“missing'错误。 –

+0

不知道为什么,''聚集'在'sp'包中是不可用的,尽管它在文档中:'错误:对象'聚集'不会被'namespace:sp''导出。我正在使用1.2-3版本。 –