[R-sig-Geo] sample.Polygons fails for shapes with more than four Polygons
Roger Bivand
Roger.Bivand at nhh.no
Tue Mar 8 14:45:57 CET 2011
On Mon, 7 Mar 2011, Roger Bivand wrote:
> On Mon, 7 Mar 2011, Aman Verma wrote:
>
>> Hi everybody,
>>
>> I have discovered some strange behaviour in the function sample.Polygons in
>> the sp package. Consider this code:
>>
>> library(maptools)
>> library(sp)
>> # Download and unpack this shape file to your working directory:
>> #
>> http://surveillance.mcgill.ca/countries_subdiv_Project_PP_project_region.zip
>> shapefile<-readShapePoly("countries_subdiv_Project_PP_project_region.shp")
>>
>> # Try and sample some points from different shapes (with multiple
>> polygons):
>> sample.Polygons(shapefile at polygons[[1930]],n=1,type='regular') # Has 2
>> polygons
>> # Works just fine.
>> sample.Polygons(shapefile at polygons[[1933]],n=1,type='regular') # Has 10
>> polygons
>> # Fails:
>> # Error: subscript out of bounds
>>
>> I have done some debugging, and located the source of the error. In
>> sample.Polygons, if there is more than one Polygon in the 'shape', this for
>> loop is run:
>>
>> for (i in seq(along = pls)) {
>> bbi <- .bbox2SPts(bbox(pls[[i]]), proj4string = proj4string) #
>> Convert bbox to set of 4 points
>> # Check which other shapes overlap the bbox of this shape.
>> # For a two dimensional object, bb_in is a list of vectors with
>> length 4:
>> # one for each point in the bbox.
>> bb_in <- lapply(pls[-i], function(x, pts) pointsInPolygon(pts, x),
>> pts = bbi)
>> # For a two dimensional object, zzz must be a matrix with exactly
>> four columns.
>> zzz <- do.call("rbind", bb_in)
>> # For a 2D object, zzz only has four columns, but i can exceed four!
>> # But 'i' represents the index of the polygon in the shape, which can
>> exceed four.
>> # zzz[, i] will fail when i exceeds four.
>> if (holes[i] || (any(unlist(bb_in) == 1) && !(sum(zzz[, i])%%2) ==
>> 0)) smple[i] <- FALSE
>> }
>>
>> The comments are my own. Basically, for two-dimensional shapes, the last
>> line will fail when the number of Polygons in the shape exceeds four, and
>> at least one of those shapes doesn't have a "hole". (If they do have holes,
>> then zzz[,i] won't be evaluated.)
>
> Hi Aman,
>
> Thanks for a clear analysis and sample data! Bug fix committed to R-Forge
> SVN, will be in tomorrow's R-Forge builds (revision 1039). If you need it
> earlier, please make an anonymous checkout.
In revision 1040, the whole heuristic is removed - it is the user's
responsibility to set the Polygon objects "hole" slots correctly - if in
doubt, use checkPolygonsHoles() in the maptools package.
Roger
>
> pts <- spsample(shapefile, n=5000, type="random")
>
> now works.
>
>>
>> I'm not sure exactly what this last line is supposed to be doing... which
>> is why I can't make a suggestion for a correction. I suspect that zzz[,i]
>> should be zzz[i,], but that is just a guess, really.
>>
>
> The change adding this code on 16 July 2010 was made to try to improve hole
> logic. Quite often, imported multipolygon objects (Polygons objects in sp)
> have wrong hole status assigned to the geometries. If checkPolygonsHoles() in
> the maptools package has not been run to clean them up, this may lead to
> grief. The code is a guess at finding conditions that would identify a hole
> even though it is declared as not a hole. It isn't bullet-proof, and did
> contain a bug, which you identified.
>
> Best wishes,
>
> Roger
>
>> I have tested this on R version 2.12.2 with sp package 0.9-78 on both the
>> Windows and UNIX (Ubuntu) platforms.
>>
>> Thanks for any help.
>>
>> aman
>>
>> _______________________________________________
>> R-sig-Geo mailing list
>> R-sig-Geo at r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>
>
>
--
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no
More information about the R-sig-Geo
mailing list