4 votos

Líneas en objetos sp reproyectados con proyección Mollweide

Estoy teniendo un problema de impar de tal manera que cuando reproyecto mapas a una proyección Mollweide en R usando sp, obtengo líneas adicionales que se extienden a través del globo. ¿Qué está pasando aquí, y tiene alguna sugerencia para solucionarlo? Aquí hay un ejemplo reproducible:

library(sp)
library(maps)
library(maptools)

worldmap <- map("world", plot=F)
plot(worldmap, type="l)

Hasta ahora, todo va bien. Tengo worldmap

Así que ahora reproyecto. Este es un CRS que estoy usando para ser compatible con algunos otros proyectos. Nótese cómo las líneas que abarcan todo el mundo aparecen entonces.

worldmapLines <- map2SpatialLines(worldmap,
                                  proj4string=CRS("+proj=longlat +datum=WGS84"))

worldM <- spTransform(worldmapLines,  
                      CRS("+proj=moll +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs"))

plot(worldM)

enter image description here

5voto

SpliFF Puntos 214

Tus datos superan el límite de 180°E en el este de Rusia y en alguna isla del Pacífico. Si quieres que el mapa se vea bien en grados, tienes que cortar tus datos de origen a 179,9°E/W.

Ver mi respuesta aquí (aunque se trata de una visión centrada en el Pacífico)

QGIS muestra los archivos de forma de los países del mundo centrados en el océano Pacífico utilizando Robinson, Miller Cylindrical u otra proyección

4voto

ttsiodras Puntos 198

Así que, basándome en la respuesta de AndreJ más arriba, preparé esto.

cleanSpLinesForProjection <- function(w){
  #We'll have to go through this one, line by line...
  slot(w, "lines") <- lapply(slot(worldmapLines, "lines"), function(x) {
    coords <- slot(x, "Lines")[[1]]@coords

    #get the rows with too large longitude values
    rIDX <- which(coords >= 180, arr.ind=T)[,1]

    #if there are some, replace them
    if(length(rIDX>0)) coords <- coords[-rIDX,]

    #replace the slot
    slot(x, "Lines")[[1]]@coords <- coords
    x
  })

  w
}

Esto funciona.

worldM <- spTransform(cleanSpLinesForProjection(worldmapLines),  
                      CRS("+proj=moll +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs"))

plot(worldM)

clean map

Me gustaría que hubiera un argumento para spTransform o una función genérica para todos los objetos sp. Ah, bueno. He aprendido algo sobre sp aquí y he creado un código que seguramente utilizaré en el futuro. Y ahora tengo que aplicarlo a un objeto SpatialPolygons... ¿Qué podría salir mal?

0 votos

¿He leído bien este código ? eliminando ¿Vértices de las formas? Si es así, se pierde información y se corre el riesgo de distorsionar las propias formas. Tal vez el algoritmo descrito en gis.stackexchange.com/posts/18986/edit sería más satisfactorio como solución de uso general.

1voto

Josh Peterson Puntos 108

Sus datos no son válidos:

> bbox(worldmapLines)
         min       max
x -179.95721 190.29080
y  -85.44308  83.57391

y el gráfico es correcto, dado que lo proporcionaste con datos erróneos.

Con la ayuda de Roger Bivand: una versión corregida de este conjunto de datos está disponible en maptools inténtalo:

library(maptools)
data(wrld_simpl)
plot(spTransform(wrld_simpl, CRS=("+proj=moll +lon_0=0 +x_0=0 +y_0=0")))

Roger mencionó además: No hay ninguna manera fácil de romper las geometrías en los límites del "otro lado del mundo". wrld_simpl se basaba en parte en recenter() pero necesitaba intervenciones manuales (esto era con GPCLib, antes de rgeos).

0 votos

Genial. Aunque no es un problema único. Por ejemplo, he estado trabajando con este shapefile - github.com/jebyrnes/meowR/blob/master/data/ - y tienen el mismo problema de líneas extra. Estos son los datos de marineregions.org/downloads.php . Sin embargo, mi función parece arreglar estéticamente el problema.

0 votos

Ah, y github.com/jebyrnes/meowR es sólo un pequeño paquete ya que sigo usando Ecoregiones Marinas para múltiples proyectos, y quería dejar de reescribir el mismo código para cada nuevo proyecto para cargar los mismos shapefiles....

1voto

SteveBurkett Puntos 960

Puede cortar el área más allá de los 180 grados y cambiar a su representación habitual (no hay nada realmente malo en tener grados más allá de 180, pero no es lo esperado por la mayoría del software).

Lo que tienes

library(sp)
library(maps)
library(maptools)
worldmap <- map("world", plot=F)
worldmapLines <- map2SpatialLines(worldmap, proj4string=CRS("+proj=longlat +datum=WGS84"))

Ahora puedes hacerlo:

library(raster)
w1 <- crop( worldmapLines, extent(-180, 180,-90,90))
w2 <- crop( worldmapLines, extent(180, 200,-90,90))
w2 <- shift(w2, -360)
w <- bind(w1, w2)
x <- spTransform(w, CRS("+proj=moll +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs"))
plot(x)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X