[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