[R-sig-Geo] merge sliver polygons

Roger Bivand Roger.Bivand at nhh.no
Sat Aug 16 22:45:07 CEST 2008


On Fri, 15 Aug 2008, Murray Richardson wrote:

> Oh maybe I've misunderstood the function.
>
> I am using unionSpatialPolygons to dissolve boundaries between adjacent 
> polygons that have a similar attribute (I use cut to classify the ID into 
> say, 10 different categories), i.e.:
>
> x<-readShapePoly("up1polys", IDvar="ID")
> slopes<-slot(x[(1:length(slot(x, "polygons"))),3], "data")
> breaks<-c(0,5,10,20,30,40,50,60,70,100)
> ID <- cut(slopes[,1], breaks)
> sptmp <- unionSpatialPolygons(x, ID)
> newID<-data.frame(c(1:length(slot(sptmp, "polygons"))))
> merged<-SpatialPolygonsDataFrame(sptmp, data=newID, match.ID=FALSE)
> writePolyShape(merged, "up1merged", factor2char = TRUE, max_nchar=254)
>
> So I am just using unionSpatialPolygons as a dissolve tool but I would like 
> non-adjacent polys within the same slope class to be separate polygons when 
> I'm done.

The ID argument groups all, both contiguous and so merged, and 
non-contiguous, Polygon objects in the same Polygons object. So if you 
don't want them merged, only set the same ID values for the slivers to be 
joined, merge the polygons, then go on and do the other things.

Your assignment to slopes is very strange. What does names(x) say? If the 
third one is "slopes", why not just say x$slopes? The object does behave 
just like a data.frame, after all. I think that you need to do things 
strictly step by step, do the slivers first, then associate the correct 
attributes with the output polygons.

Roger

>
> Thanks again
>
> Murray
>
>
> Roger Bivand wrote:
>>  On Fri, 15 Aug 2008, Murray Richardson wrote:
>> 
>> >  Thanks for this Roger.
>> > 
>> >  One other thing now...if I use unionSpatialPolygons as a dissolve tool, 
>> >  is there a way to then explode distinct polygons back to individual 
>> >  polygons? i.e. once all the slivers are gone and I have polygons merged 
>> >  based on attributes, the result is a multipart polygon for each ID I 
>> >  used for the merge, but I need them back as separate polys.
>>
>>  Each unique ID value should give a separate Polygons object, so look at
>>  the ID vector before going into unionSpatialPolygons() to make sure it
>>  does what you want.
>>
>>  Roger
>> 
>> > 
>> >  Thanks
>> > 
>> >  Murray
>> > 
>> > 
>> > 
>> >  Roger Bivand wrote:
>> > >   On Wed, 13 Aug 2008, Murray Richardson wrote:
>> > > 
>> > > >   Hello again r.sig.geo list,
>> > > > >   Thanks Roger, for help on my previous question regarding 
>> > > iterating >   through a shapefile.
>> > > > >   I'm sure once I receive my copy of  "Applied Spatial Data 
>> > >  Analysis with >  R" I will find answers to simple questions like this 
>> > >  on my own, but in >  the meantime....
>> > > > >   Is it possible to merge sliver polygons that fall below a 
>> > >  certain >  threshold area with adjacent neighbours (e.g. perhaps using 
>> > >  >  unionSpatialPolygons but without aggregating any  polygons?).  If a 
>> > >  >  sliver shares edges with more than one polygon, it doesn't really 
>> > >  matter >  which one it merges with, but if I had to choose a rule I 
>> > >  would have it >  merge with the largest one.
>> > > 
>> > >   Not such a simple question ...
>> > > 
>> > >  Both the Polygon and Polygons objects in the SpatialPolygons object 
>> > >  have
>> > >   "area" slots, with different roles. The Polygon objects have a 
>> > >   correct
>> > >   naive area in the geometry of the coordinates taken as planar. The
>> > >   Polygons objects use the "gross" area of Polygon objects belonging to
>> > >   them, but "only" to provide the plot order (plot from largest to 
>> > >  smallest
>> > >   to avoid over-painting).
>> > > 
>> > >   If you "trust" the area slot of the Polygons objects (beware of hole
>> > >   Polygon objects), you can first find your candidate slivers by 
>> > >  retrieving
>> > >   the areas by:
>> > > 
>> > >   Polygons_areas <- sapply(slot(SPobj, "polygons"),
>> > >     function(x) slot(x, "area"))
>> > > 
>> > >  and set a cutoff. Then use poly2nb(SPobj, queen=FALSE) in spdep to 
>> > >  find
>> > >  the neighbours (rook criterion). Next use the output object to 
>> > >  identify
>> > >   the largest neighbours of the sliver candidates, and build a "new
>> > >   Polygons" ID vector. Finally, use unionSpatialPolygons(). I'm 
>> > >  assuming you
>> > >   wouldn't have asked if there was useful data in the slivers!
>> > > 
>> > >   Hope this helps,
>> > > 
>> > >   Roger
>> > > 
>> > > > >   Thanks in advance,
>> > > > >   Murray Richardson
>> > > > 
>>>>> _______________________________________________
>> > > >   R-sig-Geo mailing list
>> > > >   R-sig-Geo at stat.math.ethz.ch
>> > > >   https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>> > > > > 
>> > 
>> 
>

-- 
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no




More information about the R-sig-Geo mailing list