[R-sig-Geo] gIntersection fails

Roger Bivand Roger.Bivand at nhh.no
Tue Dec 16 19:36:00 CET 2014


Please never post HTML, only plain text.

Always include a link to data, but not this data, as this requires 
acceptance of conditions to download, so is not automatic.

Note that the SO posting you quote was from April 2013 - it is always 
important to give your sessionInfo() output, as how things work changes 
over time, leaving legacy advice stale. Your results might match the SO 
ones if your platform is the same as that was then. In particular, the:

http://cran.r-project.org/web/packages/rgeos/ChangeLog

entry for 2014-02-08 indicates that non-polygon output from polygon 
intersections is now handled more gracefully.

The underlying problem may be that these coordinates are geographical, not 
projected, and the integer discretisation used by GEOS is failing for some 
input - have you tried projecting to planar coordinates in a different 
metric and doing the same operation? Or using setScale()?

For my 20M 2006:

library(rgdal)
s <- readOGR('.', layer="NUTS_RG_20M_2006")
s1 <- s[s$STAT_LEVL_==2 & substring(s$NUTS_ID,1,2) %in% 
c("FR","BE","ES","IT","PT","DE","CH","UK","IE","DK","AT"),]
library(raster)
clip.extent <- as(extent(-10, 19, 36, 51), "SpatialPolygons")
proj4string(clip.extent) <- CRS(proj4string(s))
EuropeW <- gIntersection(s1, clip.extent, byid=c(TRUE, FALSE))
plot(EuropeW)

just works.

Hope this clarifies,

Roger

PS:

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
  [1] LC_CTYPE=en_US.utf8       LC_NUMERIC=C
  [3] LC_TIME=en_US.utf8        LC_COLLATE=en_US.utf8
  [5] LC_MONETARY=en_US.utf8    LC_MESSAGES=en_US.utf8
  [7] LC_PAPER=en_US.utf8       LC_NAME=C
  [9] LC_ADDRESS=C              LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] rgeos_0.3-8   raster_2.3-12 rgdal_0.9-1   sp_1.0-16

loaded via a namespace (and not attached):
[1] grid_3.1.2      lattice_0.20-29
> version_GEOS()
[1] "3.4.2-CAPI-1.8.2 r3921"


On Tue, 16 Dec 2014, Philippe Liege wrote:

> Hello,
>
>
>
> I'm looking to clip the Europe map after reading this post:
>
> http://stackoverflow.com/questions/15881455/how-to-clip-worldmap-with-polygo
> n-in-r
>
>
>
> The procedure in running fine when using the shape file NUTS_RG_60M_2010.shp
>
>
>
> library(rgdal)
>
> s <- readOGR('NUTS_2010_60M_SH/data', layer="NUTS_RG_60M_2010")
>
> s1 <- s[s$STAT_LEVL_==2 & substring(s$NUTS_ID,1,2) %in%
> c("FR","BE","ES","IT","PT","DE","CH","UK","IE","DK","AT"),]
>
> # plot(s1)
>
> clip.extent <- as(extent(-10, 19, 36, 51), "SpatialPolygons")
>
> # clip.extent <- as(extent(-10, 40, 60, 72), "SpatialPolygons")
>
> proj4string(clip.extent) <- CRS(proj4string(s))
>
> gI <- gIntersects( s1 , clip.extent , byid = TRUE )
>
> out <- lapply( which(gI) , function(x){ gIntersection( s1[x,] , clip.extent)
> } )
>
>
>
> # But let's look at what is returned
>
> table( sapply( out , class ) )
>
>
>
> # We want to keep only objects of class SpatialPolygons
>
> keep <- sapply(out, class)
>
> out <- out[keep == "SpatialPolygons"]
>
>
>
> # Coerce list back to SpatialPolygons object
>
> EuropeW <- SpatialPolygons( lapply( 1:length( out ) , function(i) { Pol <-
> slot(out[[i]], "polygons")[[1]];   slot(Pol, "ID") <- as.character(i)
>
>   Pol
>
> }))
>
> plot( EuropeW )
>
>
>
>
>
>
>
> However I'm getting an error when using the shape files NUTS_RG_10M_2010.shp
> or NUTS_RG_03M_2010.shp
>
>
>
> Error in RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, drop_lower_td,
> "rgeos_intersection"): TopologyException: Input geom 0 is invalid:
> Self-intersection at or near point 0.68803650000000005 51.7317125 at
> 0.68803650000000005 51.7317125
>
>
>
>
>
> The conflicts originate from the UK map, somewhere above lat 50. Steps to
> reproduce:
>
>
>
> library(rgdal)
>
>  s <- readOGR('EUmaps/NUTS_2010_10M_SH/data',layer="NUTS_RG_10M_2010")
>
> s1 <- s[s$STAT_LEVL_==2 & substring(s$NUTS_ID,1,2) %in% c("UK"),]
>
> # plot(s1)
>
> clip.extent <- as(extent(-10, 19, 36, 53), "SpatialPolygons")
>
> proj4string(clip.extent) <- CRS(proj4string(s))
>
> gI <- gIntersects( s1 , clip.extent , byid = TRUE )
>
> out <- lapply( which(gI) , function(x){ gIntersection( s1[x,] , clip.extent)
> } )
>
>
>
> # But let's look at what is returned
>
> table( sapply( out , class ) )
>
>
>
> # We want to keep only objects of class SpatialPolygons
>
> keep <- sapply(out, class)
>
> out <- out[keep == "SpatialPolygons"]
>
>
>
> # Coerce list back to SpatialPolygons object
>
> UK <- SpatialPolygons( lapply( 1:length( out ) , function(i) { Pol <-
> slot(out[[i]], "polygons")[[1]];   slot(Pol, "ID") <- as.character(i)
>
>   Pol
>
> }))
>
> plot( UK )
>
>
>
>
>
> What does this self-intersection means?
>
>
>
>
>
>
>
> Regards,
>
>
>
>
>
> Philippe
>
>
>
>
> 	[[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