[R-sig-Geo] merging polygons and IDs

David Depew depewd at gmail.com
Mon Jan 12 02:36:37 CET 2015


Thank you Roger and Robert for your suggestions.
I was able to use disaggregate (package sp) on the "ID-less" merged
polygons result and get what I needed (although it is considerably less
elegant and more clunky than the examples you provided). Using these as
SpatialPolygons with "over" is now much more straightforward.

Thanks again!

On Sun, Jan 11, 2015 at 7:46 PM, Robert J. Hijmans <r.hijmans at gmail.com>
wrote:

> David,
>
> I think you could also do this:
>
> library(raster)
> a <- disaggregate(aggregate(pols))
> ids <-  over(pts, a)
>
> Now you have the aggregated polygons and for each point you know which
> polygon it belongs to. Perhaps continue with something like this:
>
> tab <- table(ids, as.integer(names(ids)))
> tab <- t(t(tab) * as.integer(colnames(tab)))
> x <- apply(tab, 1, function(i) paste(i[i!=0], collapse='_'))
> p <- SpatialPolygonsDataFrame(a, data.frame(points=x))
> head(p)
>
> Robert
>
> On Sun, Jan 11, 2015 at 11:57 AM, Roger Bivand <Roger.Bivand at nhh.no>
> wrote:
> > On Sun, 11 Jan 2015, David Depew wrote:
> >
> >> Dear list,
> >>
> >> given a set of polygons created from points with a specified buffer
> >> distance,
> >>
> >> library(sp)
> >> library(rgeos)
> >> box <- readWKT("POLYGON((0 0, 0 1000, 1000 1000, 1000 0, 0 0))")
> >> plot(box)
> >> set.seed(1)
> >> pts <- spsample(box, n=40, type="random")
> >> pols <- gBuffer(pts, byid=TRUE, width=50)
> >> plot(pols, add=TRUE)
> >>
> >>
> >> I'd like to merge polygons where the buffers overlap
> >> i.e.
> >> merg.poly=gUnaryUnion(pols)
> >> plot(merg.poly)
> >>
> >> but I'm having difficulty figuring out how to specify that the merged
> >> polygons retain some unique Id. Clearly in the package help, one would
> >> specify this by use of the "id" argument, however since the polygons
> >> started as points, overlapping points do not have the same ID. Suppose
> one
> >> approach is to define a common ID for overlapping polys before using
> >> gUnaryUnion, but I'm at a loss where to begin with that approach. Any
> >> advice would be greatly appreciated,
> >
> >
> > Thanks for a self-contained example!
> >
> > Right, this isn't obvious, as you need to go to a list/graph
> representation
> > of the intersects predicate, which takes us outside rgeos. We'll compare
> > this with the equivalent for distance neighbours in spdep:
> >
> > library(spdep)
> > dnb <- dnearneigh(pts, 0, 100) # 2*50 buffer
> > nc <- n.comp.nb(dnb) # find graph components
> > merg.poly <- gUnaryUnion(pols, nc$comp.id)
> > plot(merg.poly)
> >
> > which jumps over the buffered objects. To use the buffered objects, do:
> >
> > gI <- gIntersects(pols, pols, byid=TRUE, returnDense=FALSE) # list
> > for (i in seq(along=gI)) {gI[[i]] <- gI[[i]][-(which(gI[[i]] == i))];
> >  if (length(gI[[i]]) == 0) gI[[i]] <- 0L} # remove i<->i edges
> > class(gI) <- "nb"
> > attr(gI, "region.id") <- names(gI)
> > nc1 <- n.comp.nb(gI)
> > all.equal(nc, nc1) # same result
> >
> > So what this is doing is having gIntersects return a list. Since i
> > intersects i, we have to drop the i<->i edges, pretend that this is an nb
> > object, and use the n.comp.nb() function to find the graph components.
> These
> > two approaches give the same results. There is a new vignette in spdep
> > starting to look at representations of neighbours as graph objects:
> >
> > http://cran.r-project.org/web/packages/spdep/vignettes/nb_igraph.html
> >
> > Hope this helps,
> >
> > Roger
> >
> >>
> >> Thanks,
> >>
> >>         [[alternative HTML version deleted]]
> >>
> >> _______________________________________________
> >> R-sig-Geo mailing list
> >> R-sig-Geo at r-project.org
> >> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> >>
> >
> > --
> > Roger Bivand
> > Department of Economics, Norwegian School of Economics,
> > Helleveien 30, N-5045 Bergen, Norway.
> > voice: +47 55 95 93 55; fax +47 55 95 91 00
> > e-mail: Roger.Bivand at nhh.no
> >
> >
> > _______________________________________________
> > R-sig-Geo mailing list
> > R-sig-Geo at r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>

	[[alternative HTML version deleted]]



More information about the R-sig-Geo mailing list