0

我有一个网格,我想从这个网格中生成一个带有一些地图元素(比例、指北针等)的地图。我可以毫无问题地绘制网格和所需的颜色,但额外的地图元素不会显示在地图上。我尝试first=TRUE根据sp 手册提出 sp.layout 参数,但仍然没有成功。

我使用集成的 meuse 数据集重现了该问题,因此您可以复制并粘贴该代码。我使用那些包版本:lattice_0.20-33sp_1.2-0

library(sp)
library(lattice) # required for trellis.par.set():
trellis.par.set(sp.theme()) # sets color ramp to bpy.colors()

alphaChannelSupported = function() { 
  !is.na(match(names(dev.cur()), c("pdf")))
}

data(meuse)
coordinates(meuse)=~x+y
data(meuse.riv)


library(gstat, pos = match(paste("package", "sp", sep=":"), search()) + 1)
data(meuse.grid)
coordinates(meuse.grid) = ~x+y
gridded(meuse.grid) = TRUE
v.uk = variogram(log(zinc)~sqrt(dist), meuse)
uk.model = fit.variogram(v.uk, vgm(1, "Exp", 300, 1))
meuse[["ff"]] = factor(meuse[["ffreq"]])
meuse.grid[["ff"]] = factor(meuse.grid[["ffreq"]])
zn.uk = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = uk.model)
zn.uk[["se"]] = sqrt(zn.uk[["var1.var"]])

meuse.sr = SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv")))
rv = list("sp.polygons", meuse.sr, fill = "lightblue")
sampling = list("sp.points", meuse.riv, color = "black")
scale = list("SpatialPolygonsRescale", layout.scale.bar(), 
             offset = c(180500,329800), scale = 500, fill=c("transparent","black"), which = 4)
text1 = list("sp.text", c(180500,329900), "0", cex = .5, which = 4)
text2 = list("sp.text", c(181000,329900), "500 m", cex = .5, which = 4)
arrow = list("SpatialPolygonsRescale", layout.north.arrow(), 
             offset = c(181300,329800), 
             scale = 400, which = 4)

library(RColorBrewer)
library(lattice)
trellis.par.set(sp.theme())
precip.pal <- colorRampPalette(brewer.pal(7, name="Blues"))

spplot(zn.uk, "var1.pred",
       sp.layout = list(rv, sampling, scale, text1, text2),
       main = "log(zinc); universal kriging standard errors",
       col.regions=precip.pal,
       contour=TRUE, 
       col='black',
       pretty=TRUE,
       scales=list(draw = TRUE),
       labels=TRUE)

这就是它看起来的样子......全裸: 在此处输入图像描述 所以我的问题:

  1. 比例尺、指北针等隐藏在哪里?我错过了什么?我在互联网上找到的每个示例都与此类似。在我自己的数据集上,我首先可以看到比例尺和指北针被绘制,但是一旦网格被渲染,它就会叠加额外的地图元素(除了比例文本,显示在地图上 - 而不是栏和北箭头出于某种原因我似乎不理解)。
  2. 地图上出现的错误消息仅在我尝试添加采样位置时显示sampling = list("sp.points", meuse.riv, color = "black")。如果没有此条目,则地图显示不会出错,但也没有其他地图元素。如何在地图上显示采样点(例如,在大小取决于该采样点的绝对值的圆圈中)?

到目前为止,这困扰了我很多很多小时,我找不到任何解决方案。在 Bivand 等人的教科书 (2013) “Applied Spatial Data Analysis with R”中,我可以阅读以下条目:

sp.layout 参数中的项目顺序很重要;原则上,对象是按照它们出现的顺序绘制的。默认情况下,当 spplot 的对象有点或线时,sp.layout 项目会在点之前绘制,以允许绘制网格和多边形作为背景。对于网格和多边形,sp.layout 项目随后被绘制(因此项目不会被网格和/或多边形过度绘制)。对于网格,首先添加列表元素 = TRUE 可确保在绘制网格之前绘制项目(例如,添加填充多边形时)。合并图层时,透明度可能会有所帮助;它适用于 PDF 设备和其他几种设备。函数 sp.theme 返回一个格子主题,可用于 spplot 绘制的绘图;在打开或更改设备后使用 trellis.par.set(sp.theme()) 以使其生效。

但是,同样有了这些附加信息,我也无法解决这个问题。很高兴任何提示!

4

1 回答 1

2

您错过的元素正在面板四中绘制,该面板不存在,因此没有被绘制。尝试删除which = 4.

meuse.riv在您的示例中是一个矩阵,它会导致错误消息,但应该是一个SpatialPoints对象,因此sampling通过以下方式创建:

sampling = list("sp.points", SpatialPoints(meuse.riv), color = "black")

从示例开始工作时,我的建议是选择尽可能接近您需要的示例,并且一次只更改一件事。

于 2015-09-15T17:56:33.943 回答