[R-sig-Geo] transformin multipart shapefile to singlepart shapefile
Jean-Luc DUPOUEY
dupouey at nancy.inra.fr
Sat Jan 31 12:17:44 CET 2015
I faced the same question recently: how to tranform a multipart polygon layer
into single polygons? Here is a little bit more general function to do that.
It keeps the initial ID of the polygons, adding a sequence number. The
initial plot order and projection information are also kept.
But pay attention, holes are automatically converted into islands, because
holes cannot be single polygons.
I am interested in improving this function. Thanks in advance,
JL Dupouey
#JL Dupouey INRA-Nancy 2015/01/31
#convert a multipart SpatialPolygons object to a single part SpatialPolygons
object
#plot order: keeps the initial plot order
#p4s: keeps the initial p4s, if not NA
#ID: keeps the initial ID of the multipart polygons, and add a numeric
increasing index from 1 to n
# in order of presence of the single polygons wich compose the multipart
polygon, if there is more then one part
multitoone=function(mpart)
{
#vector of number of elementary polygons in each multipart polygon (for
calculation of plot order, and initialization of islands)
nbpoly=sapply(mpart at polygons,function(x){length(x at Polygons)})
#initialize the list of single Polygons to be built
islands=vector("list",sum(nbpoly))
#initialize the vector plot order of single polygons to be built
plotorder=vector("integer",sum(nbpoly))
#index of current single Polygons
k=0
#loop on all Polygons of the object
for (i in 1:length(mpart))
{
#current multiple polygon
pols=mpart at polygons[[i]]@Polygons
ID=mpart at polygons[[i]]@ID
#number of polygons to plot before the current multiple one
prev=sum(nbpoly[mpart at plotOrder<mpart at plotOrder[i]])
#loop on each elementary polygon of the current multiple polygon
for (j in 1:length(pols))
{ k=k+1
IDs=ifelse(length(pols)>1,paste(ID,'-',j,sep=''),ID)
islands[[k]] = Polygons(list(pols[[j]]), IDs)
plotorder[k]=rank(mpart at polygons[[i]]@plotOrder,ties.method="first")[j]+prev
}
}#end on loop on all Polygons of the object
multitoone = SpatialPolygons(islands,pO=plotorder)
if (!is.na(proj4string(mpart))) proj4string(multitoone)=proj4string(mpart)
return(multitoone)
}
--
View this message in context: http://r-sig-geo.2731867.n2.nabble.com/transformin-multipart-shapefile-to-singlepart-shapefile-tp5935148p7587716.html
Sent from the R-sig-geo mailing list archive at Nabble.com.
More information about the R-sig-Geo
mailing list