[R-sig-Geo] maptools/SpatialPolygons2PolySet produces ascending instead of descending POS numbers for polygons with holes
Daniel Rodolphe Schlaepfer
dschlaep at uwyo.edu
Wed Aug 6 15:44:44 CEST 2014
Unfortunately, your suggestion to consider plotting order doesn’t work in general and not in my case; for instance, if I need my underlaying map to show filled polygons:
plot(polySP, density=10, angle=45, pbg="white", axes=TRUE)
map(add=TRUE, fill=TRUE, col=rainbow(n=5))
-the hatched polygon is overplotted by the map with this plotting order; if I reverse the plotting order, then the underlaying map is overplotted:
map(fill=TRUE, col=rainbow(n=5))
plot(polySP, density=10, angle=45, pbg="white", add=TRUE)
Thus, I still think this issue is not resolved. I can understand that fixing maptools/SpatialPolygons2PolySet may have a low priority. However, I already suggested a patch in my original email. Here, again, as the complete function (only one line needs to be changed, see second instance of POS <- ):
SpatialPolygons2PolySet <- function (SpP)
{
require(PBSmapping)
pls <- slot(SpP, "polygons")
n <- length(pls)
PID <- NULL
SID <- NULL
POS <- NULL
X <- NULL
Y <- NULL
for (i in 1:n) {
srs <- slot(pls[[i]], "Polygons")
m <- length(srs)
for (j in 1:m) {
crds <- slot(srs[[j]], "coords")
k <- nrow(crds)
PID <- c(PID, rep(i, k))
SID <- c(SID, rep(j, k))
#POS <- c(POS, 1:k)
POS <- if(slot(srs[[j]], "hole")) c(POS, k:1) else c(POS, 1:k) #Suggested fix
X <- c(X, crds[, 1])
Y <- c(Y, crds[, 2])
}
}
PID <- as.integer(PID)
SID <- as.integer(SID)
POS <- as.integer(POS)
storage.mode(X) <- "double"
storage.mode(Y) <- "double"
pj <- .pbsproj(SpP)
zn <- NULL
if (pj == "UTM") {
zn <- attr(pj, "zone")
attr(pj, "zone") <- NULL
}
res <- as.PolySet(data.frame(PID = PID, SID = SID, POS = POS,
X = X, Y = Y), projection = pj, zone = zn)
res
}
Thanks,
Daniel
On Aug 6, 2014, at 3:02 PM, Roger Bivand <Roger.Bivand at nhh.no> wrote:
> On Wed, 6 Aug 2014, Daniel Rodolphe Schlaepfer wrote:
>
>> Thank you for the suggestion. Unfortunately, this does not work for my application: I plot the polygon on top of other another plot where I need the holes of the polygon to be transparent. For instance, I don’t want the African countries in the following examples to be covered by white:
>>
>> library(maps)
>> map()
>> plot(polySP, density=10, angle=45, pbg=“white")
>
> Obviously not, these are base graphics, and you have to consider the plotting order:
>
> plot(polySP, density=10, angle=45, pbg="white", axes=TRUE)
> map(add=TRUE)
>
>>
>> However, this was not the point that I try to ask about. My point is that maptools/SpatialPolygons2PolySet does not translate into correct PolySet objects as illustrated in my previous example.
>
> Since you no longer need PolySet objects, why? Maybe the coercion method can be fixed, but it is not a priority - patch welcomed.
>
> Roger
>
>>
>> Thanks,
>> Daniel
>>
>> On Aug 6, 2014, at 12:52 PM, Roger Bivand <Roger.Bivand at nhh.no> wrote:
>>
>>> On Wed, 6 Aug 2014, Daniel Rodolphe Schlaepfer wrote:
>>>
>>>> Hello all,
>>>>
>>>> I try to convert a sp SpatialPolygons object with a hole to a PBS PolySet object - my ultimate goal is to plot the polygon with hatching considering the hole.
>>>
>>> The problem is not that you need a PolySet representation, but that you need to set the polygon background explicitly to a value other than "transparent" using the pbg= argument:
>>>
>>> plot(polySP, density=10, angle=45, pbg="white")
>>>
>>> or adjust par("bg") to suit. When hatching is used, polypath is not used, so automatic handling of holes in the plot method is not available.
>>>
>>> Roger
>>>
>>>>
>>>> My problem is that maptools/SpatialPolygons2PolySet only produces PolySet objects with increasing POS even for polygons with holes; however, the documentation of PolySet indicates that “We adopt the convention that POS goes from 1 to n along an outer boundary, but from n to 1 along an inner boundary, regardless of rotational direction.”
>>>>
>>>>
>>>> #Create simple doughnut-shaped polygon
>>>> library(sp)
>>>> library(maptools)
>>>>
>>>> coords1 <- matrix(c(108, -54, -108, -54, -108, 54, 108, 54, 108, -54), ncol=2, byrow=TRUE)
>>>> coords2 <- matrix(c(36, -18, -36, -18, -36, 18, 36, 18, 36, -18), ncol=2, byrow=TRUE)
>>>>
>>>> polySP <- SpatialPolygons(list(Polygons(list(Polygon(coords1, hole=FALSE), Polygon(coords2, hole=TRUE)), ID=1)), proj4string=CRS("+proj=longlat +datum=WGS84"))
>>>>
>>>> #Convert sp-SpatialPolygons to PBS-PolySet with maptools function
>>>> polyPBS <- SpatialPolygons2PolySet(polySP)
>>>>
>>>> #-> POS for SID == 2 are increasing and thus do not reflect PBS standards for a polygon with a hole
>>>> PID SID POS X Y
>>>> 1 1 1 1 108 -54
>>>> 2 1 1 2 -108 -54
>>>> 3 1 1 3 -108 54
>>>> 4 1 1 4 108 54
>>>> 5 1 1 5 108 -54
>>>> 6 1 2 1 36 -18
>>>> 7 1 2 2 36 18
>>>> 8 1 2 3 -36 18
>>>> 9 1 2 4 -36 -18
>>>> 10 1 2 5 36 -18
>>>>
>>>> I believe that it would require only a small change to maptools/SpatialPolygons2PolySet to produce PolySet objects that meet the PBS standards also for polygons with holes, i.e., replace the line
>>>> POS <- c(POS, 1:k)
>>>> with
>>>> POS <- if(slot(srs[[j]], "hole")) c(POS, k:1) else c(POS, 1:k)
>>>> inside the loops: for (i in 1:n) … for (j in 1:m) …
>>>>
>>>>
>>>>
>>>> Sincerely,
>>>> Daniel Schlaepfer
>>>>
>>>>
>>>> My session infos:
>>>> sessionInfo()
>>>> R version 3.1.1 (2014-07-10)
>>>> Platform: x86_64-apple-darwin13.3.0 (64-bit)
>>>>
>>>> locale:
>>>> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
>>>>
>>>> attached base packages:
>>>> [1] stats graphics grDevices
>>>> [4] utils datasets methods
>>>> [7] base
>>>>
>>>> other attached packages:
>>>> [1] PBSmapping_2.67.60 maptools_0.8-30
>>>> [3] sp_1.0-15
>>>>
>>>> loaded via a namespace (and not attached):
>>>> [1] foreign_0.8-61 grid_3.1.1
>>>> [3] lattice_0.20-29
>>>>
>>>>
>>>> -------------------------------------------------------
>>>> Daniel Schlaepfer, PhD
>>>> University of Wyoming
>>>> Laramie, WY 82071
>>>>
>>>> _______________________________________________
>>>> 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
More information about the R-sig-Geo
mailing list