[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