4

我正在使用 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 链接所示:

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()

带有 LCC 投影和网格的欧洲地图

我想要的(以及我认为是上述代码的结果)是一个矩形裁剪,其中包括我指定的限制(由于使用的投影进行了调整,因此预期的面积比上面的矩形更大) . 此外,每当使用 map() 进行投影时,地图和边界都会出现空白区域。

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

4

2 回答 2

3

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

作为一种解决方法,您还可以尝试以下方法(使用 map 的输出值):

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”是为了保持地图上的纵横比正确,即使您调整绘图窗口的大小。

于 2016-12-01T14:04:43.270 回答
2

spatialreference.org 上给出的界限是“左下,右上坐标”,巧合的是,它与你写的非常接近。这些坐标正确地是:

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()

xlim由于和,似乎还有一些行丢失ylim,删除它将再次包括冰岛和其他国家和岛屿。或者也许有更好的方法。

结果图

于 2016-11-28T22:11:29.900 回答