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
> [email protected]
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> >
_______________________________________________
R-sig-Geo mailing list
[email protected]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo