Comprender el error al cambiar la proyección de SpatialPolygon (R)

Aug 26 2020

Estoy encontrando un error que no entiendo. Quiero cambiar la proyección de un SpatialPolygonsDataFrame de +longlat a Mollweide o Robinson. Para esto estoy tratando de usar spTransform(), pero devuelve el error: "Error en .spTransform_Polygon(input[[i]], to_args = to_args, from_args = from_args, : falla en Polygons 125 Polygon 1 puntos 1:4: 5"

Mi pregunta: ¿Por qué me sale este error?

Aquí hay un MWE:

library(inlmisc)
library(sp)
projection <- "+proj=robin +datum=WGS84 +lat_0=0 +lon_0="

numlons <- 30
numlats <- 50

lat.df <- rep(seq(from=-90, to=90, length.out = numlats), each=numlons)
lon.df <- rep(seq(from=-180, to=180, length.out = numlons), times=numlats)

spobj <- as.vector(array(data=rnorm(n=50*30, mean=0, sd=1)))
spobj <- data.frame("dat"=spobj)
spobj <- SpatialPointsDataFrame(coords=data.frame("longs"=c(lon.df), "lats"=lat.df), 
                                data=spobj, 
                                proj4string=CRS("+proj=longlat"))
sp::gridded(spobj) <- TRUE
spobj <- as(spobj, "SpatialGridDataFrame")


### Change projection
spobj <- Grid2Polygons(grd=spobj, zcol="dat", cuts=100) # convert to SpatialPolygon
spobj <- spTransform(spobj, CRS(projection)) # change projection

Respuestas

Spacedman Aug 26 2020 at 21:50

Las celdas de la cuadrícula están fuera del rango válido para los datos de latitud y longitud. Cuando spobjes puntos (antes sp::gridded(spobj) <- TRUE) es esto:

> spobj.pts
class       : SpatialPointsDataFrame 
features    : 1500 
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
crs         : +proj=longlat +ellps=WGS84 
variables   : 1
names       :               dat 
min values  : -3.85401447598915 
max values  :  3.65817120357171 

pero despues Grid2Polygonses esto:

> spobj
class       : SpatialPolygonsDataFrame 
features    : 1470 
extent      : -186.2069, 186.2069, -88.16327, 91.83673  (xmin, xmax, ymin, ymax)
crs         : +proj=longlat +ellps=WGS84 

que tiene latitud más allá del polo norte (+90) y longitudes más allá del antimeridiano (180 o -180). Esto se debe a que las celdas de la cuadrícula Grid2Polygonsestán centradas en los puntos. También hay menos de ellos. Parece que no le molesta hacer cuadrículas desde la fila inferior:

Entonces parece que eso es lo que Grid2Polygonshace, y no estoy seguro de si eso es lo que se supone que debe hacer o no (los documentos son vagos) o qué es exactamente lo que quiere hacer para hacer celdas poligonales a partir de sus puntos. Pero el problema básico es que no puedes proyectar coordenadas que no son válidas.