[R-sig-Geo] Holes in polygons disappear after performing checkPolygonsHoles from maptools
Roger Bivand
Roger.Bivand at nhh.no
Thu Apr 2 17:01:02 CEST 2015
On Thu, 2 Apr 2015, Edzer Pebesma wrote:
>
>
> On 04/01/2015 08:03 PM, Grigory Alexandrovich wrote:
>> Hello all,
>>
>> I encountered the following unexpected result using checkPolygonsHoles:
>>
>> # attach the worldmap as SpatialPolygonsDataFrame from the package maptools
>> library(sp)
>> library(maptools)
>> data(wrld_simpl)
>>
>> # get a polygon with a hole
>> shape_with_hole <- wrld_simpl[5,]
>>
>> # plot it (hole is left white, surrounded by blue color)
>> plot(shape_with_hole, col = "blue")
>>
>> # perform checkPolygonsHoles
>> shape_with_hole at polygons <- lapply(shape_with_hole at polygons,
>> checkPolygonsHoles)
>>
>> # plot again, now holes aren't recognized as such
>> plot(shape_with_hole, col = "blue")
>>
>> # and even the original SpatialPolygonsDataFrame object is changed !?
>> plot(wrld_simpl[5,], col = "blue")
>>
>> One irritating side effect here is that the original object wrld_simpl
>> is also changed. This result looks to me like a bug, or have I missed
>> something?
>>
>
> It looks as if it is related to rgeos, as
>
> avoidGEOS = FALSE
> library(sp)
> library(maptools)
> data(wrld_simpl)
> x = wrld_simpl
>
> shape_with_hole <- wrld_simpl[5,]
>
> if (avoidGEOS)
> gpclibPermit()
> shape_with_hole at polygons <- lapply(shape_with_hole at polygons,
> checkPolygonsHoles,
> avoidGEOS = avoidGEOS)
>
> data(wrld_simpl)
> all.equal(x, wrld_simpl)
No, but:
library(sp)
library(maptools)
data(wrld_simpl)
x = wrld_simpl
shape_with_hole <- wrld_simpl[5,]
pls <- slot(shape_with_hole, "polygons")
pls1 <- lapply(pls, checkPolygonsHoles, avoidGEOS = FALSE)
isTRUE(all.equal(pls, pls1))
# TRUE
gpclibPermit()
pls1 <- lapply(pls, checkPolygonsHoles, avoidGEOS = TRUE)
isTRUE(all.equal(pls, pls1))
# FALSE
where the Polygon objects are re-ordered and plotted out of order, so the
deprecated gpclib code may be broken here. However, this isn't the
problem, but rather (perhaps) graphics::polypath. If it is used (by
default it is), and with the default path fill mode:
plot(x[5,], col="blue", usePolypath=TRUE, rule="winding")
does not whiten the holes. However:
plot(x[5,], col="blue", usePolypath=TRUE, rule="evenodd")
does. Using:
plot(x[5,], col="blue", pbg="white", usePolypath=FALSE)
also works by overpainting the island with the holes in white.
Please summarise the your SO thread.
By the way, in R it is unusual for changes in one object to propagate in
an unintended way to another object, and this is not happening here. The
visual impression is being driven by polypath doing different things
depending on its rule setting. Look at ?polypath for details.
Well, this doesn't clarify, but it explains what is happeing, I hope ...
Roger
>
> returns a difference, but TRUE if avoidGEOS = TRUE.
>
--
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