Levelplot与太平洋中心地图

时间:2015-10-02 10:59:31

标签: r levelplot

我正在尝试使用以太平洋为中心的地图levelplot

这是我正在使用的代码

levelplot(x, col.regions=colorscale,              
          panel = function(x, y, ...) {
            panel.levelplot(x, y,  ...)
            mp <- map("world2", plot = FALSE, fill=TRUE,interior = FALSE,bg="white")
            lpolygon(mp$x, mp$y, fill="black", col="black")}
)

这就是我得到的。多边形似乎都搞砸了。

enter image description here

1 个答案:

答案 0 :(得分:0)

我花了很长时间才找到迈克尔·萨姆纳(Michael Sumner)在here上解决该问题的答案。我只添加了spTransform,以确保这两部分与spRbind一起返回

library(maptools)
library(raster)


## first, do the jiggery pokery of wrld_simpl to
## convert from Atlantic to Pacific view
xrange <- c(0, 360)
yrange <- c(-90, 90)

require(maptools)
require(raster)
require(rgeos)

ext <- extent(xrange[1], xrange[2], yrange[1], yrange[2])
data(wrld_simpl, package = "maptools")

## this is a bit more general than needed for this example, since I
## wanted arbitrary crops originally

eastrange <- c(xrange[1], 180.0)
westrange <- c(-180.0, xrange[2] - 360)

ew <- extent(westrange[1], westrange[2], yrange[1], yrange[2])
ee <- extent(eastrange[1], eastrange[2], yrange[1], yrange[2])

geome <- as(ee, "SpatialPolygons")
geomw <- as(ew, "SpatialPolygons")

## why does this get dropped?
proj4string(geome) <- CRS(proj4string(wrld_simpl))
proj4string(geomw) <- CRS(proj4string(wrld_simpl))

worlde <- gIntersection(wrld_simpl, geome)
worldw <- gIntersection(wrld_simpl, geomw)
worldw <- elide(worldw, shift = c(360.0, 0.0))

proj4string(worldw) <- CRS(proj4string(wrld_simpl))

dfe <- data.frame(x = seq_len(length(worlde@polygons)))
dfw <- data.frame(x = seq_len(length(worldw@polygons)))
rownames(dfw) <- as.character(as.numeric(rownames(dfe)) + nrow(dfe))

worlde <- SpatialPolygonsDataFrame(worlde, dfe, match.ID = FALSE)
worldw <- SpatialPolygonsDataFrame(worldw, dfw, match.ID = FALSE)
worldw <- spChFIDs(worldw, rownames(dfw))

## I had to add this spTransform() call to stop the spRbind proj error
worldw_proj <- spTransform(worldw, CRSobj = worlde@proj4string)
world <- spRbind(worlde, worldw_proj)

## so, "world" is longitudes [0, 360], which is pretty much essential
## given the input data shown

r <- raster(nrows = 180, ncols = 360, xmn = 0, xmx = 360, ymn = -90,
            ymx = 90, crs = "+proj=longlat +ellps=WGS84 +over")

## fake a raster so we have something equivalent to your data (but simple/r)
rast <- rasterize(world, r)

## fill the ocean parts with something . . .
rast[is.na(rast)] <- 1:sum(is.na(getValues(rast)))

library(rasterVis)
levelplot(rast, margin = FALSE) + layer(sp.polygons(world, lwd=0.8,
                                                    col='darkgray'))

Pac centric map that doesn't have lines across it