在 "maps" 包的 R 中使用带有 xlim/ylim 的投影会产生更大的地图

Using a projection with xlim/ylim in R with the "maps" package results in a bigger map

我将 R 与 maps/mapproject/maptools 包一起使用来绘制一些地图,并注意到一种行为对我来说似乎违反直觉,实际上限制了我的能力。

绘制欧洲地图(使用 ETRS89 / ETRS-LCC 的限制,因此不包括冰岛并且也在东部剪裁)但不指定任何投影:

library(maps)
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T)

结果符合预期,正在使用限制,生成的地图也遵循这些限制。

根据帮助,地图默认使用的投影是:

The default is to use a rectangular projection with the aspect ratio
chosen so that longitude and latitude scales are equivalent at the 
center of the picture.

这不是满足我需求的好投影,我将使用 LCC 投影和上面所示的平行线 spatialreference.org link:

library(maps)
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65))
box()

结果出乎意料,因为它包含了更大的区域(向北很远,包括俄罗斯),基本上使地图无法使用。

奇怪的是,使用网格时会清楚地考虑原始限制:

library(maps)
library(mapproj)
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65))
map.grid(cex=0.1 , col="grey30")
box()

我想要的(我假设是上述代码的结果)是一个矩形裁剪,其中包括我指定的限制(由于使用的投影进行了调整,因此比矩形的面积更大以上将是预期的)。此外,地图和边界周围有一个白色 space,每当使用 map() 进行投影时,它就会出现。

问题是:有没有办法在使用map/mapproj/maptools时得到这个结果?我试图人为地改变 xlim/ylim 但没有很好的结果,因为它似乎在很大的间隔内起作用(即改变它们不会产生效果,直到欧洲的一半突然随着下一次减少而消失)。

spatialreference.org 上给出的边界为 "bottom left, top right coordinate",巧合的是,它与您写的非常接近。正确地,这些坐标将是:

xlim=c(-10.6700,31.5500), ylim=c(34.5000,71.0500)

但这似乎不是这里的问题。

研究第二个 xlim 参数,似乎 map() 试图包括相邻的线,只要其中一些线的坐标在限制范围内。俄罗斯国家(这导致第二个 xlim 参数在 29-31 左右大幅跃升)以及一些非洲和东欧国家。打开和关闭 boundary 在某种程度上证实了这一点,但这隐藏了很多国家的边界​​。

我发现的一个解决方法是首先明确排除邻国。然后使用 add=T 再次绘制地图。在第一张图上使用col="white",不要在同一个地方画两次,这样会使线条变粗。

library(maps)
library(mapproj)
map("world",regions="(?!Russia|Morocco|Algeria|Tunisia|Turkey|Ukraine)",col="white",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775))
map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775),add=T)
map.grid(cex=0.1, col="grey30")
box()

由于 xlimylim,似乎仍然缺少一些行,删除这些行将再次包括冰岛和其他国家和岛屿。或者也许有更好的方法。

"map()" 的基本行为是提取 xlim 和 ylim 中的所有行,但也会从数据库中提取部分在域中的行。当没有投影时,xlim和ylim也被用作绘图的限制,但是当数据被投影时,这显然不起作用。 (您不能简单地投影 xlim 和 ylim,因为这不是矩形域)。地图代码不够复杂,无法找到一个好的解决方案,只是将绘图限制设置为数据范围(包括任何不需要的线条)。作为 'maps' 的(最近)维护者,这实际上是我可能会尝试修复的问题。不幸的是,mapproj 不包括逆向投影,而逆向投影需要像您期望的那样正确地进行。将地图限制在底部(而不是在顶部扩展)要容易得多。

作为解决方法,您还可以尝试以下操作(使用地图的输出值):

mymap <- map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500),  projection="lambert", parameters=c(10.44,52.775), plot=FALSE)

现在可以查看mymap$x和mymap$y的范围了:

range(mymap$x, na.rm=TRUE)

plot(mymap) 查看范围并决定您需要的间隔。

然后,最后,您可以绘制一张具有您想要的限制的地图,例如

plot(mymap, type="l", asp=1,xaxt="n",yaxt="n",xlab="",ylab="", xlim=c(-0.2,0.15), ylim=c(-0.75,-0.35))

不理想,但希望足够好。 "asp=1" 是为了保持地图上的纵横比正确,即使您调整图的大小 window。