[R-sig-Geo] gUnaryUnion Not Dissolving Correctly

Matt Strimas-Mackey strimas at zoology.ubc.ca
Fri Nov 6 03:12:31 CET 2015


Thanks for explaining this in such detail! I have a greater
appreciation for the importance of thinking about these topological
issues and for the role machine precision plays.

I constructed a series of simple examples to demonstrate to myself how
these sorts of problems arise and how setScale,
set_RGEOS_polyThreshold, set_RGEOS_dropSlivers, and
set_RGEOS_warnSlivers work. In case someone else stumbles on this
thread looking for similar clarification, I've pasted these examples
below, and they also appear in this gist:
https://gist.github.com/mstrimas/1b4a4b93a9d4a158bce4

library(sp)
library(raster)
library(rgeos)
set_RGEOS_polyThreshold(0)
set_RGEOS_warnSlivers(TRUE)
set_RGEOS_dropSlivers(FALSE)

# function to rigidly shift polygon
# only works for simple polygon objects with a single polygon
shift_poly <- function(p, x, y) {
  p at polygons[[1]]@Polygons[[1]]@coords[,'x'] <-
    p at polygons[[1]]@Polygons[[1]]@coords[,'x'] + x
  p at polygons[[1]]@Polygons[[1]]@coords[,'y'] <-
    p at polygons[[1]]@Polygons[[1]]@coords[,'y'] + y
  row.names(p) <- paste0('shifted', row.names(p))
  return(p)
}

p1 <- readWKT("POLYGON((0 0,0 1,1 1,1 0,0 0))")
row.names(p1) <- '1'
p2 <- readWKT("POLYGON((1 0,1 1,2 1,2 0,1 0))")
row.names(p2) <- '2'

plot(rbind(p1, p2))
plot(shift_poly(p2, -0.5, 0.1), border='orange', add=T, lty=2, lwd=1)

# default scale of 10^8
# behaviour of topology operations depends on scale!
setScale(1e8)
# shift horizontally by small amount so no longer touching
plot(gUnion(p1, shift_poly(p2, 1e-1, 0)))
plot(gUnion(p1, shift_poly(p2, 1e-8, 0)))
plot(gUnion(p1, shift_poly(p2, 1e-9, 0)))

gIntersects(p1, p2)
gIntersects(p1, shift_poly(p2, 1e-1, 0))
gIntersects(p1, shift_poly(p2, 1e-8, 0))
gIntersects(p1, shift_poly(p2, 1e-9, 0))
# polygons with coordinates different by less that the scale set by setScale()
# are considered to intersect and are merge together by union operations

# p1 and p2 share a boundary exactly so the intersection of the 2 is a line
class(gIntersection(p1, p2))
# shift right polygon horizontally slightly to it is just overlapping or just
# separated from the left polygon and consider the results
gIntersection(p1, shift_poly(p2, -1e-9, 0)) # overlap > scale => polygon
gIntersection(p1, shift_poly(p2, -1e-8, 0)) # overlap < scale => line
gIntersection(p1, p2) # exactly touching => line
gIntersection(p1, shift_poly(p2, 1e-9, 0)) # separation < scale => line
gIntersection(p1, shift_poly(p2, 1e-8, 0)) # separation > scale => NULL

# lower scale to 10^4
setScale(1e4)
plot(gUnion(p1, shift_poly(p2, 1e-1, 0)))
plot(gUnion(p1, shift_poly(p2, 1e-4, 0)))
plot(gUnion(p1, shift_poly(p2, 1e-5, 0)))

gIntersects(p1, p2)
gIntersects(p1, shift_poly(p2, 1e-1, 0))
gIntersects(p1, shift_poly(p2, 1e-4, 0))
gIntersects(p1, shift_poly(p2, 1e-5, 0))

gIntersection(p1, shift_poly(p2, -1e-4, 0)) # overlap > scale => polygon
gIntersection(p1, shift_poly(p2, -1e-5, 0)) # overlap < scale => line
gIntersection(p1, p2) # exactly touching => line
gIntersection(p1, shift_poly(p2, 1e-5, 0)) # separation < scale => line
gIntersection(p1, shift_poly(p2, 1e-4, 0)) # separation > scale => NULL


# consider the effect of setting polyThreshold and turning on sliver warning
# this will identify slivers resulting from topology operations
setScale(1e4)
set_RGEOS_polyThreshold(1e-2)
set_RGEOS_warnSlivers(TRUE)
# shift horizontally by increasing amount so just overlapping
gi <- gIntersection(p1, shift_poly(p2, -1e-5, 0))
class(gi) # overlap < scale => line, i.e. assumes just touching
# warnings raised in next 2 cases because:
#   a. overlap > scale => polygon on intersection
#   b. resulting polygon area < polyThreshold => sliver
gIntersection(p1, shift_poly(p2, -1e-4, 0))
gIntersection(p1, shift_poly(p2, -1e-3, 0))
# warnings raised in next 2 cases because:
#   a. overlap > scale => polygon on intersection
#   b. resulting polygon area > polyThreshold => not a sliver
gIntersection(p1, shift_poly(p2, -1e-2, 0))
gIntersection(p1, shift_poly(p2, -1e-1, 0))

# with a lower threshold
set_RGEOS_polyThreshold(1e-3)
# this still raises a warning
gIntersection(p1, shift_poly(p2, -1e-4, 0))
# but this doesn't since resulting polygon is at the threshold now
gIntersection(p1, shift_poly(p2, -1e-3, 0))

# not that it isn't the linear overlap that triggers the warning, it is that the
# area of the resulting polygons are below the threshold
# no warning
gi1 <- gIntersection(p1, shift_poly(p2, -1e-3, 0))
# now a warning is raised because a slight shift in the y direction has caused
# the polygons the resulting polygon to be just less than the 1e-3 threshold
gi2 <- gIntersection(p1, shift_poly(p2, -1e-3, 1e-3))
gArea(gi1) / get_RGEOS_polyThreshold()
gArea(gi2) / get_RGEOS_polyThreshold()

# rgeos can also be set to automatically remove these slivers
class(gIntersection(p1, shift_poly(p2, -1e-4, 0))) # SpaitalPolygons
set_RGEOS_dropSlivers(TRUE)
class(gIntersection(p1, shift_poly(p2, -1e-4, 0))) # NULL
set_RGEOS_dropSlivers(FALSE)

# slivers can also be generated as a result of union operations
setScale(1e4)
set_RGEOS_polyThreshold(1e-2)
set_RGEOS_warnSlivers(TRUE)
set_RGEOS_dropSlivers(FALSE)

p3 <- readWKT("POLYGON((0 1,0 2,2 2,2 1,0 1))")
row.names(p3) <- '3'
p4 <- readWKT("POLYGON((0 -1,0 0,2 0,2 -1,0 -1))")
row.names(p4) <- '4'
plot(rbind(p1, p3, p4))
plot(p2, add=T, col='red')

# offset the middle right (i.e. red) square slightly to the right
# not picked up since middle edge misalignment is < scale
pp <- rbind(p1, p3, p4, shift_poly(p2, 1e-5, 0))
plot(gUnaryUnion(pp))
# misalignment picked up since = scale => a very narrow hole in center
# warning raised because hole area is < polyThreshold
pp <- rbind(p1, p3, p4, shift_poly(p2, 1e-4, 0))
plot(gUnaryUnion(pp))
# misalignment picked up since = scale => a very narrow hole in center
# warning not raised because hole area is > polyThreshold
pp <- rbind(p1, p3, p4, shift_poly(p2, 1e-2, 0))
plot(gUnaryUnion(pp))
# the fact that this is a hole and not a vertical line becomes apparent when
# the shift is bigger
pp <- rbind(p1, p3, p4, shift_poly(p2, 1e-1, 0))
plot(gUnaryUnion(pp))
# finally, set_RGEOS_dropSlivers can be used to remove these slivers
# and fix the topology
set_RGEOS_dropSlivers(TRUE)
pp <- rbind(p1, p3, p4, shift_poly(p2, 1e-4, 0))
plot(gUnaryUnion(pp))
set_RGEOS_dropSlivers(FALSE)

On Thu, Nov 5, 2015 at 2:49 AM, Roger Bivand <Roger.Bivand at nhh.no> wrote:
> On Thu, 5 Nov 2015, Roger Bivand wrote:
>
>> On Wed, 4 Nov 2015, Matt Strimas-Mackey wrote:
>>
>>>  The original study area shapefile is a boundary of the Indonesia half
>>>  of New Guinea. The file as well as the code to construct the hexagonal
>>>  grids are here:
>>>
>>> https://www.dropbox.com/sh/ff8v08p3ambqcbs/AAAPBlGP4fthdmZhrto7oIuCa?dl=0
>>>
>>>  Since it's a large area, generating the grid takes a long time, so
>>>  I've also included code for a small subset of the original
>>>  shapefile--one small offshore island.
>>
>>
>> An equivalent scaling fix is to change the coordinate units from metres to
>> kilometres:
>>
>> library(rgdal)
>> study_area2 <- spTransform(study_area, CRS("+proj=aea +lat_1=-7.42
>>  +lat_2=-0.62 +lat_0=-9.119 +lon_0=128.91 +x_0=0 y_0=0 +datum=WGS84
>>  +units=km +no_defs +ellps=WGS84 +towgs84=0,0,0"))
>> size <- sqrt(2 * 1e2 / sqrt(3)) # reduce to suit
>> set.seed(1)
>> hex_points <- spsample(study_area2[2,], type="hexagonal", cellsize=size)
>> hex_grid <- HexPoints2SpatialPolygons(hex_points)
>> hex_union <- gUnaryUnion(hex_grid)
>> plot(hex_grid, col='lightgrey')
>> plot(hex_union, border='orange', lwd=3, add=T)
>>
>> An advantage of these scaling issues being made visible is that we see
>> that computers really do not operate in continuous space, and that
>> computational geometry actually matters, I suppose.
>>
>> I'll check the underlying code generating the hexagons to see why the
>> nodes (where hexagon boundaries meet) appear to slide apart at the edge of
>> machine precision.
>
>
> A potentially robust approach at default scale uses the dx= argument to
> HexPoints2SpatialPolygons():
>
> hex_grid <- HexPoints2SpatialPolygons(hex_points, dx=size)
>
> Setting:
>
> set_RGEOS_polyThreshold(1e-2) # for example
> set_RGEOS_warnSlivers(TRUE)
>
> shows the remaining slivers, and:
>
> set_RGEOS_dropSlivers(TRUE)
>
> drops them. It is still possible that an inward dangle will get through
> (zero area line in from boundary point, but part of the single boundary).
>
> Setting dx= to the same value as cellsize= in the spsample call seems to be
> crucial, avoiding an approximation marked in the code as:
>
>         # EJP; changed:
>         # how to figure out dx from a grid? THK suggested:
>         #dx <- hexGrid$x[2] - hexGrid$x[1]
>         # and the following will also not always work:
>
> in sp:::genPolyList(), so there was a warning there against taking the
> default.
>
> Roger
>
>
>>
>> Roger
>>
>>
>>>
>>>  Finally, some more odd behaviour. I noticed each time I run this code,
>>>  the dissolve mistakes change, i.e. different boundaries are
>>>  erroneously kept. However, using set.seed() makes the errors the same
>>>  each time for a given seed, and changing the seed yields a different
>>>  set of errors. Example in the code in the dropbox link and copied
>>>  here:
>>>
>>>  library(sp)
>>>  library(raster)
>>>  library(rgeos)
>>>
>>>  # just a subset of full shapefile
>>>  set.seed(1)
>>>  size <- sqrt(2 * 1e8 / sqrt(3))
>>>  study_area <- shapefile('papua.shp')
>>>  hex_points <- spsample(study_area[2,], type="hexagonal", cellsize=size)
>>>  hex_grid <- HexPoints2SpatialPolygons(hex_points)
>>>  hex_union <- gUnaryUnion(hex_grid)
>>>  plot(hex_grid, col='lightgrey')
>>>  plot(hex_union, border='orange', lwd=3, add=T)
>>>
>>>  # results chage according to seed
>>>  set.seed(100)
>>>  size <- sqrt(2 * 1e8 / sqrt(3))
>>>  study_area <- shapefile('papua.shp')
>>>  hex_points <- spsample(study_area[2,], type="hexagonal", cellsize=size)
>>>  hex_grid <- HexPoints2SpatialPolygons(hex_points)
>>>  hex_union <- gUnaryUnion(hex_grid)
>>>  plot(hex_grid, col='lightgrey')
>>>  plot(hex_union, border='orange', lwd=3, add=T)
>>>
>>>  On Wed, Nov 4, 2015 at 8:57 AM, Roger Bivand <Roger.Bivand at nhh.no>
>>> wrote:
>>> >  On Wed, 4 Nov 2015, Matt Strimas-Mackey wrote:
>>> > > >  Thanks, lots of useful info here. I've never seen the setScale()
>>> > >  function; I don't think it's mentioned in the gUnaryUnion help. This
>>> > >  saves me a lot of headache!
>>> > > > >  For what it's worth, the invalid geometry is an artifact of the
>>> > >  reproducible example I created. The original hexagonal grid is
>>> > >  produced with
>>> > >  g <- spsample(study_area, type="hexagonal", cellsize=size)
>>> > >  hex_grid <- HexPoints2SpatialPolygons(g)
>>> > > >  OK, thanks - this is useful. Could you please make available the
>>> > > > study >  area
>>> >  object in some way - so that we can re-create g and see how
>>> >  HexPoints2SpatialPolygons() creates the artefact Mike spotted
>>> > (although >  this
>>> >  looks like numeric fuzz - 'changing "1287248.96712942" to
>>> >  "1287248.96712943"' is a change in the 15th digit, which is on the >
>>> > precision
>>> >  edge of the "double" storage mode. If we can revisit functions
>>> > creating
>>> >  SpatialPolygons objects to ensure that they are GEOS-compatible for
>>> > the
>>> >  default scale of 1e+8, we'll be more secure.
>>> > >  Roger
>>> > > > > > >  And this object passes gIsValid() and clgeo_GeometryReport()
>>> > > > > > > without
>>> > >  any problems, yet still has the dissolving issue. Regardless, all is
>>> > >  solved with setScale().
>>> > > > >  Thanks!
>>> > > > >  M
>>> > > > >  On Wed, Nov 4, 2015 at 6:30 AM, Michael Sumner
>>> > > > > <mdsumner at gmail.com> > >  wrote:
>>> > > > > > > > > > > > >  On Thu, 5 Nov 2015 at 01:10 Roger Bivand
>>> > > > > > > > > > > > > <Roger.Bivand at nhh.no> > > >  wrote:
>>> > > > > > > > > > > > >  On Wed, 4 Nov 2015, Michael Sumner wrote:
>>> > > > > > > > > >  Thanks for all this detail Roger, is there a way to
>>> > > > > > > > > > "re-build" a
>>> > > > > >  spatial
>>> > > > > >  object so that the given scale setting is applied? Are there
>>> > > > > > any
>>> > > > > >  general
>>> > > > > >  rounding or "orthogonalize" functions in the Spatial suite?
>>> > > > > > > > > > > > >  No, not really. In this case, the very detailed
>>> > > > > > > > > > > > > coordinate > > > >  measurements
>>> > > > >  may have made things worse, or possibly using Polygon rather
>>> > > > > than
>>> > > > >  Polygons
>>> > > > >  objects, or not building the Polygons object with a proper
>>> > > > > comment
>>> > > > >  attribute, I don't know. rgeos::gIsValid(spoly) is FALSE, and
>>> > > > > > > > > > > > >
>>> > > > > > > > > > > > > cleangeo::clgeo_GeometryReport(clgeo_CollectionReport(clgeo_Clean(spoly)))
>>> > > > > > > > >  says the same (based on rgeos). I suggest working with
>>> > > > > > > > > Emmanuel > > > >  Blondel
>>> > > > >  (cleangeo maintainer) to extend cleangeo. GEOS is looking at > >
>>> > > > > > >  allowing
>>> > > > >  users to manipulate precision models, not just scale, but I'm >
>>> > > > > > > >  uncertain
>>> > > > >  about that.
>>> > > > > > > > >  Running spoly into GRASS and back out (GRASS builds
>>> > > > > > > > > topology on > > > >  import)
>>> > > > >  shows a different error, the object seems to be problematic.
>>> > > > > > > > > > >  It can be fixed by changing "1287248.96712942" to >
>>> > > > > > > > > > > > >  "1287248.96712943", so
>>> > > >  really the creator should not have had those values on input. > >
>>> > > > >  There's no
>>> > > >  easy way out without topology.
>>> > > > > > >  This brought out some interesting issues for work I've been
>>> > > > > > > doing > > >  using
>>> > > >  the
>>> > > >  "near-Delaunay triangulation" in RTriangle, and that requires a
>>> > > >  normalized
>>> > > >  set of vertices (no duplicate vertices) which on its own presents
>>> > > >  interesting problems. I have a related issue where a parallel > >
>>> > > > >  (latitude)
>>> > > >  line needs many vertices to look "smooth" on a polar projection,
>>> > > > but > > >  when
>>> > > >  building a mesh with triangles it's really best to allow
>>> > > > relatively
>>> > > >  coarse
>>> > > >  segmented boundaries rather than have many elements at parallels.
>>> > > > > > >  The
>>> > > >  Triangle library does not consider these hexagon coordinates to be
>>> > > >  duplicates, so there are two vertical segments between the two > >
>>> > > > >  bottom
>>> > > >  polys
>>> > > >  at
>>> > > > > > >  points(coordinates(as(as(spoly, "SpatialLines"), > > >
>>> > > > > > > "SpatialPoints"))[c(3,
>>> > > >  4),
>>> > > > ] ) > > > > > >  Thanks for the reminder about cleangeo, I'll have
>>> > > > closer look.
>>> > > > > > >  cheers, Mike.
>>> > > > > > > > > > > >  Roger
>>> > > > > > > > > > > > > > >  Cheers, Mike.
>>> > > > > > > > > > >  On Wed, 4 Nov 2015 at 18:16 Roger Bivand
>>> > > > > > > > > > > <Roger.Bivand at nhh.no> > > > > >  wrote:
>>> > > > > > > > > > > >  On Tue, 3 Nov 2015, Matt Strimas-Mackey wrote:
>>> > > > > > > > > > > > > >  I'm working with a regular hexagonal grid
>>> > > > > > > > > > > > > > stored as SPDF. At > > > > > > >  some
>>> > > > > > > >  point I subset this SPDF, then want to combine all
>>> > > > > > > > adjacent > > > > > > >  hexagons
>>> > > > > > > >  together so that each contiguous set of hexagons is a
>>> > > > > > > > single > > > > > > >  polygon.
>>> > > > > > > >  I'm doing this last step using gUnaryUnion (or > > > > > >
>>> > > > > > > > >  gUnionCascaded, not
>>> > > > > > > >  clear what the different is actually). The problem is that
>>> > > > > > > > > > > > > > >  in some
>>> > > > > > > >  cases boundaries between clearly adjacent polygons are not
>>> > > > > > > > > > > > > > >  dissolved.
>>> > > > > > > > > > > > > > >  Example:
>>> > > > > > > > > > > > > > >  ## Create three adjacent hexagons
>>> > > > > > > >  library(sp)
>>> > > > > > > >  library(rgeos)
>>> > > > > > > >  p1 <- Polygon(cbind(
>>> > > > > > > >       c(1276503.26781119, 1281876.11747031,
>>> > > > > > > > 1287248.96712942,
>>> > > > > > > >         1287248.96712942, 1281876.11747031,
>>> > > > > > > > 1276503.26781119,
>>> > > > > > > > > > > > >  1276503.26781119),
>>> > > > > > > > > > > > > > >       c(204391.40834643, 207493.42454344,
>>> > > > > > > > > > > > > > > 204391.40834643,
>>> > > > > > > > > > > > >  198187.37595242,
>>> > > > > > > > > > > > > > >         195085.35975541, 198187.37595242,
>>> > > > > > > > > > > > > > > 204391.40834643)))
>>> > > > > > > >  p2 <- Polygon(cbind(
>>> > > > > > > >       c(1287248.96712943, 1292621.81678854,
>>> > > > > > > > 1297994.66644766,
>>> > > > > > > >         1297994.66644766, 1292621.81678854,
>>> > > > > > > > 1287248.96712943,
>>> > > > > > > > > > > > >  1287248.96712943),
>>> > > > > > > > > > > > > > >       c(204391.40834643, 207493.42454344,
>>> > > > > > > > > > > > > > > 204391.40834643,
>>> > > > > > > > > > > > >  198187.37595242,
>>> > > > > > > > > > > > > > >         195085.35975541, 198187.37595242,
>>> > > > > > > > > > > > > > > 204391.40834643)))
>>> > > > > > > >  p3 <- Polygon(cbind(
>>> > > > > > > >       c(1281876.11747031, 1287248.96712943,
>>> > > > > > > > 1292621.81678854,
>>> > > > > > > >         1292621.81678854, 1287248.96712943,
>>> > > > > > > > 1281876.11747031,
>>> > > > > > > > > > > > >  1281876.11747031),
>>> > > > > > > > > > > > > > >       c(213697.45693745, 216799.47313446,
>>> > > > > > > > > > > > > > > 213697.45693745,
>>> > > > > > > > > > > > >  207493.42454344,
>>> > > > > > > > > > > > > > >         204391.40834643, 207493.42454344,
>>> > > > > > > > > > > > > > > 213697.45693745)))
>>> > > > > > > >  spoly <- SpatialPolygons(list(Polygons(list(p1, p2, p3), >
>>> > > > > > > > > > > > > >  's1')))
>>> > > > > > > >  plot(gUnaryUnion(spoly))
>>> > > > > > > > > > > > > > > > > > >  No, this is just numerical fuzz:
>>> > > > > > > > > > > > >  plot(spoly)
>>> > > > > > >  plot(gUnaryUnion(spoly), border="green", lty=3, lwd=2, > > >
>>> > > > > > > > > >  add=TRUE)
>>> > > > > > >  oS <- getScale()
>>> > > > > > >  # default 1e+8
>>> > > > > > >  setScale(1e+4)
>>> > > > > > >  plot(gUnaryUnion(spoly), border="orange", lwd=2, add=TRUE)
>>> > > > > > >  setScale(oS)
>>> > > > > > > > > > > > >  JTS, GEOS, and consequently rgeos by default
>>> > > > > > > > > > > > > shift all > > > > > >  coordinates to
>>> > > > > > >  an
>>> > > > > > >  integer grid after multiplying by a scale factor (finding >
>>> > > > > > > > > > > >  integer
>>> > > > > > >  matches
>>> > > > > > >  is much easier than real matches). If the scaling is too > >
>>> > > > > > > > > > >  detailed (in
>>> > > > > > >  some
>>> > > > > > >  cases), the operations do not give the expected outcomes.
>>> > > > > > > > > > > > >  There is work in progress in GEOS and JTS to
>>> > > > > > > > > > > > > provide other > > > > > >  scaling
>>> > > > > > >  options
>>> > > > > > >  and models, and to permit iteration over scaling values
>>> > > > > > > until > > > > > >  a
>>> > > > > > >  "clean"
>>> > > > > > >  result is obtained (for some meanings of clean).
>>> > > > > > > > > > > > >  gUnionCascaded() was the only possible function
>>> > > > > > > > > > > > > for GEOS < > > > > > >  3.3.0, from
>>> > > > > > >  GEOS 3.3.0 gUnaryUnion() is available and the prefered and >
>>> > > > > > > > > > > >  more
>>> > > > > > >  efficient
>>> > > > > > >  route. This is explained on the help page.
>>> > > > > > > > > > > > >  Hope this clarifies,
>>> > > > > > > > > > > > >  Roger
>>> > > > > > > > > > > > > > > > > > > > >  Note that p2 and p3 are
>>> > > > > > > > > > > > > > > > > > > > > dissolved together, but p1 is > > > > > > >  separate. The
>>> > > > > > > >  shared edge of p1 and p2 is:
>>> > > > > > > >  p1:
>>> > > > > > > >  [2,] 1281876 207493.4
>>> > > > > > > >  [3,] 1287249 204391.4
>>> > > > > > > >  p2:
>>> > > > > > > >  [5,] 1287249 204391.4
>>> > > > > > > >  [6,] 1281876 207493.4
>>> > > > > > > > > > > > > > >  So, exactly the same apart from the order. I
>>> > > > > > > > > > > > > > > originally > > > > > > >  thought this
>>> > > > > > > >  difference in order might be the problem, but this doesn't
>>> > > > > > > > > > > > > > >  seem to be
>>> > > > > > > >  an issue with in this example, where order is also
>>> > > > > > > > flipped:
>>> > > > > > > >  sss <- rasterToPolygons(raster(nrow=2, ncol=2, xmn=0,
>>> > > > > > > > xmx=2, > > > > > > >  ymn=0,
>>> > > > > > > >  ymx=2, vals=1:4))
>>> > > > > > > >  lapply(sss at polygons, function(x) slot(x, > > > > > > >
>>> > > > > > > > 'Polygons')[[1]]@coords)
>>> > > > > > > >  plot(sss)
>>> > > > > > > >  plot(gUnaryUnion(sss))
>>> > > > > > > > > > > > > > >  Session Info:
>>> > > > > > > >  R version 3.2.2 (2015-08-14)
>>> > > > > > > >  Platform: x86_64-apple-darwin13.4.0 (64-bit)
>>> > > > > > > >  Running under: OS X 10.10.5 (Yosemite)
>>> > > > > > > > > > > > > > >  Message when rgeos is loaded:
>>> > > > > > > > > > > > > > >  rgeos version: 0.3-14, (SVN revision 511)
>>> > > > > > > >  GEOS runtime version: 3.5.0-CAPI-1.9.0 r0
>>> > > > > > > >  Linking to sp version: 1.2-0
>>> > > > > > > >  Polygon checking: TRUE
>>> > > > > > > > > > > > > > >  Any help on how to get these polygons to
>>> > > > > > > > > > > > > > > dissolve is > > > > > > >  appreciated.
>>> > > > > > > > > > > > > > >  M
>>> > > > > > > > > > > > > > >
>>> > > > > > > > > > > > > > > _______________________________________________
>>> > > > > > > >  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
>>> > > > > > > > > > > > > > > > > > > >  --
>>> > > > >  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
>>> > > > > > > > > > > >  --
>>> >  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
>>> >
>>
>>
>>
>
> --
> 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
>



More information about the R-sig-Geo mailing list