[R-sig-Geo] merge sliver polygons

Murray Richardson murray.richardson at utoronto.ca
Fri Aug 15 20:07:52 CEST 2008


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.

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




More information about the R-sig-Geo mailing list