[R-sig-Geo] merge sliver polygons
Murray Richardson
murray.richardson at utoronto.ca
Fri Sep 5 20:49:38 CEST 2008
Thanks Roger,
I have singletons with areas. I think the slivers will be quite obvious
based on their areas relative to the rest of the polygon areas. I could
even compute some perimeter to area index I supposed since they tend to
be long a skinny.
So, my main uncertainty is still just how to work with the neighbour
list to merge the sliver polygons with the LARGEST non-sliver polygon
they share an edge with. i.e. to generate the new ids to use in
unionSpatialPolygons. I can't seem to find a good example of how to
use the nb object in such a way.
cheers
Murray
Roger Bivand wrote:
> On Fri, 5 Sep 2008, Murray Richardson wrote:
>
>> Hi Roger
>>
>> I'm just getting around to trying this out. I must say, I'm not clear
>> on how to work with the neighbour list object to accomplish this.
>> Specifically, how would I identify the largest neighbours of the
>> sliver candidates?
>>
>> Furthermore, do I first subset the polygons according to the area
>> threshold, and then construct the neighbour list for only these
>> candidate slivers? I'm not clear on how to identify neighbours for a
>> subset of polygons.
>
> My idea (IIRC!) was to look at a distribution of the areas of the
> Polygon objects in the dataset. A good deal will depend on whether the
> slivers are represented as separate Polygons objects (note the _s_),
> or whether they are Polygon objects belonging to Polygons objects. So
> nimbleness will be needed!
>
> library(maptools)
> xx <- readShapeSpatial(system.file("shapes/sids.shp",
> package="maptools")[1],
> IDvar="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66"))
> pls <- slot(xx, "polygons")
> AREAS <- sapply(pls, function(x) sapply(slot(x, "Polygons"), function(y)
> slot(y, "area")))
> summary(sapply(AREAS, length))
> summary(unlist(AREAS))
>
> is not a very good example, because the "areas" are planar in
> non-planar coordinates, but I hope you see the point. If you have a
> clear break in the distribution, you can find out which they are, and
> where they are. If all the Polygons objects (the ones in the
> "polygons" slot of your SpatialPolygons object, pls) are singletons,
> things get much easier, because the merging will be between Polygons
> objects, provided directly in maptools.
>
> This should be a start - once you have singleton Polygons objects with
> areas as attributes, we can continue.
>
> Hope this helps,
>
> Roger
>
>>
>> Sorry to bother you with this again. It will be very useful if it
>> works as I would also like to use it for region merging based on
>> other attributes.
>>
>> Still waiting on that book...!
>
> PS. Edzer, Virgilio and I did see the only copy in Europe in Dortmund
> at useR! three weeks ago. It turns out that it was printed in the US,
> and is at or awaited at the publisher's warehouse for dispatch. Things
> seem to take time in the "real" world!
>
>>
>> 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