Más

Líneas sobre objetos sp reproyectados con proyección de Mollweide

Líneas sobre objetos sp reproyectados con proyección de Mollweide


Tengo un problema extraño tal que cuando reproyecto mapas a una proyección de Mollweide en R usando sp, obtengo líneas adicionales que se extienden por todo el mundo. ¿Qué está pasando aquí? ¿Tiene alguna sugerencia para solucionarlo? Aquí hay un ejemplo reproducible:

biblioteca (sp) biblioteca (mapas) biblioteca (herramientas de mapa) mapa del mundo <- mapa ("mundo", plot = F) trazado (mapa del mundo, tipo = "l)

Hasta ahora tan bueno. yo obtengo

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

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 + unidades = m + no_defs ")) plot (worldM)


Sus datos superan el límite de 180 ° E en el este de Rusia y algunas islas del Pacífico. Si desea un mapa con buen aspecto en grados, debe cortar los datos de origen a 179,9 ° E / W.

Vea mi respuesta aquí (aunque se trata de una vista centrada en el Pacífico)

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


Entonces, según la respuesta de AndreJ anterior, preparé esto.

cleanSpLinesForProjection <- function (w) {# Tendremos que revisar este, línea por línea ... slot (w, "líneas") <- lapply (slot (worldmapLines, "lines"), function (x) {coords <- slot (x, "Lines") [[1]] @ coords #obtener las filas con valores de longitud demasiado grandes rIDX <- which (coords> = 180, arr.ind = T) [, 1] # si hay algunos, reemplácelos si (longitud (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 + unidades = m + no_defs")) plot (worldM)

Solo desearí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 estoy casi seguro de usar en el futuro. Y ahora tengo que aplicarlo a un objeto SpatialPolygons ... ¿Qué podría salir mal?


Tus datos no son válidos:

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

y la trama es correcta, dado que la proporcionó con datos incorrectos.

Con la ayuda de Roger Bivand: una versión corregida de este conjunto de datos está disponible enherramientas de mapa, intentar:

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

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


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

Que tienes

biblioteca (sp) biblioteca (mapas) biblioteca (herramientas de mapa) mapamundi <- map ("mundo", plot = F) worldmapLines <- map2SpatialLines (mapamundi, proj4string = CRS ("+ proj = longlat + datum = WGS84"))

Ahora puedes hacer:

biblioteca (raster) w1 <- recortar (worldmapLines, extensión (-180, 180, -90,90)) w2 <- recortar (worldmapLines, extensión (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 + unidades = m + no_defs") ) trama (x)

Ver el vídeo: Representaciones de la tierra y proyecciones cartográficas