[R-sig-Geo] Holes in polygons disappear after performing checkPolygonsHoles from maptools

Roger Bivand Roger.Bivand at nhh.no
Fri Apr 3 13:16:02 CEST 2015


On Fri, 3 Apr 2015, Grigory Alexandrovich wrote:

> Am 02.04.2015 um 22:24 schrieb Roger Bivand:
>> On Thu, 2 Apr 2015, Roger Bivand wrote:
>>
>>> 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,
>>
>> The gpclib code is OK, it re-orders the Polygon objects, but the plot
>> order is correct. The problem is as described below.
>>
>> Roger
>>
>>> 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.
>>>>
>>>
>
> |Thank you for your answers guys. But I am still not fully convinced
> that it is an issue of the plot function,
> because the object shape_with_hole edited with checkPolygonsHoles
> before, continues to behave in a strange way:
>
> # we check which polygons are flagged as holes.
> # The flags are still set properly,
> # although the plot() function didn't recognize them:
> sapply(shape_with_hole at polygons[[1]]@Polygons, slot, "hole")
>
> [1] FALSE  TRUE  TRUE  TRUE
>
> # load library rgdal for reprojection
> library(rgdal)
>
> # reproject with spTransform, just for testing
> shape_with_hole <- spTransform(shape_with_hole, CRS("+proj=longlat
> +ellps=WGS84 +datum=WGS84"))
>
> # after reprojection all flags are set to FALSE
> sapply(shape_with_hole at polygons[[1]]@Polygons, slot, "hole")
>
> [1] FALSE FALSE FALSE FALSE
>
>
> So it is still something wrong with shape_with_hole, or?

Please provide the output of sessionInfo(), rgeos::version_GEOS(), and 
rgdal::getGDALVersionInfo() with rgdal::getPROJ4VersionInfo(). I cannot 
reproduce the degradation of hole status following a no-op use of 
spTransform() with:

> sessionInfo()
R version 3.1.3 (2015-03-09)
Platform: x86_64-unknown-linux-gnu (64-bit)
Running under: Fedora 21 (Twenty One)
...
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] rgdal_0.9-3     maptools_0.8-34 sp_1.0-17

loaded via a namespace (and not attached):
[1] foreign_0.8-63  grid_3.1.3      lattice_0.20-31 rgeos_0.3-8
[5] tools_3.1.3
> rgeos::version_GEOS()
[1] "3.4.2-CAPI-1.8.2 r3921"
> rgdal::getGDALVersionInfo()
[1] "GDAL 1.11.2, released 2015/02/10"
> rgdal::getPROJ4VersionInfo()
[1] "Rel. 4.9.1, 04 March 2015, [PJ_VERSION: 491]"

Roger


>
> Best
>
> Grigory|
>
>
> 	[[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



More information about the R-sig-Geo mailing list