2016-11-16 6 views
3

Использование шейп доступной here я пытаюсь объединить два многоугольники Судана и Южного Судана, так что я получаю границы Судана в 2010 году мой код, чтобы сделать шейп доступный в R являетсяОбъединение двух SpatialPolygonsDataFrame объектов

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

Я пробовал различные пакеты и решения, как raster::intersect, rgeos::gIntersect или maptools::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

Вы можете использовать aggregate из пакета raster.

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): аргумент« FUN »отсутствует при попытке агрегировать обе страны. –

+0

Не уверен, почему, но 'aggregate' недоступен в пакете' sp', хотя он находится внутри документации: 'Error: object 'aggregate' не экспортируется 'namespace: sp''. Я использую версию 1.2-3. –