防止海岸线的部分映射

时间:2012-07-15 08:22:40

标签: r map-projections

如何防止国家多边形在不同的预测下被切断?

在下面的例子中,我想做一个南极洲的立体投影地图,包括纬度< -45°S。通过将y限制设置为此范围,绘图区域是正确的,但是国家多边形也会在这些限制下裁剪。有没有办法将海岸线绘制到绘图区域的边缘?

感谢您的任何建议。

library(maps)
library(mapproj)

ylim=c(-90,-45)
orientation=c(-90, 0, 0)

x11()
par(mar=c(1,1,1,1))
m <- map("world", plot=FALSE)
map("world",project="stereographic", orientation=orientation, ylim=ylim)
map.grid(m, nx=18,ny=18, col=8)
box()

enter image description here

3 个答案:

答案 0 :(得分:7)

问题是因为您指定了-45的最大ylim,并且正在该纬度准确地切割数据。显然,绘图的实际边界是以单独的方式计算的,这可能与基于所得到的预测限制的某种保守假设有关(但我不知道如何在不探索源代码的情况下)。

您可以通过设置不绘制海岸线的虚拟绘图来避免此问题,然后使用增加的ylim添加数据:

library(maps)
library(mapproj)

ylim = c(-90,-45)
orientation=c(-90, 0, 0)

x11()
par(mar=c(1,1,1,1))
m <- map("world", plot=FALSE)
map("world",project="stereographic", orientation=orientation, ylim=ylim, col = "transparent")
map("world",project="stereographic", orientation=orientation, ylim=ylim + c(-5, 5), add = TRUE)
map.grid(m, nx=18,ny=18, col=8)
box()
顺便说一下,这种策略不适用于所有预测,因为有些数据限制意味着重叠,但Polar Stereographic只是从中心延伸出来,所以这里没有这样的问题。

此外,还有一个更新的方法来使用maptools,rgdal和rgeos,这将允许你使用数据共享一个适当的PROJ.4立体投影(但我还没有完全找出裁剪步骤)。 mapproj中的预测是“仅限形状”,将其他数据输入到afaik中会有一些工作。

答案 1 :(得分:3)

我意识到另一个选择是定义绘图区域的限制而不是地图本身。这可以在定义精确的绘图区域时提供一些灵活性(即xaxs =“i”和yaxs =“i”)。您还可以保证绘制所有多边形 - 在@mdsumner的示例中,缺少澳大利亚并且需要扩展y限制才能正确绘制多边形。

orientation=c(-90, 0, 0)

ylim <- c(mapproject(x=-180,y=-45, project="stereographic", orientation=orientation)$y, mapproject(x=0,y=-45, project="stereographic", orientation=orientation)$y)
xlim <- c(mapproject(x=-90,y=-45, project="stereographic", orientation=orientation)$x, mapproject(x=90,y=-45, project="stereographic", orientation=orientation)$x)

x11(width=6,height=6)
par(mar=c(1,1,1,1))
plot(0,0, t="n", ylim=ylim, xlim=xlim, xaxs="i", yaxs="i", xlab="", ylab="", xaxt="n", yaxt="n")
map("world",project="stereographic", orientation=orientation, add=TRUE)
map.grid(nx=18,ny=18, col=8)
box()

答案 2 :(得分:3)

另一种方法是使用实​​际的PROJ.4投影并使用maptools包中的数据集。这是代码,在南极大陆仍有一个问题,海洋海岸线在-90处遇到极点(这有点烦人,需要找到坐标并将其从转换后的结果中移除,或者通过拓扑工具查找条子)。

library(maptools)
data(wrld_simpl)
xrange <- c(-180, 180, 0, 0)
yrange <- c(-90, -45, -90, -45)

stere <- "+proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs"

library(rgdal)

w <- spTransform(wrld_simpl, CRS(stere))

xy <- project(cbind(xrange, yrange), stere)
plot(w, xlim = range(xy[,1]), ylim = range(xy[,2]))
box()