2016-11-26 51 views
3

我正在使用R與maps/mapproject/maptools包來繪製一些地圖,並注意到一種行爲似乎違反直覺我實際上限制了我能做的事情。在R中使用帶xlim/ylim的投影與「maps」包產生更大的地圖

繪製地圖歐洲的(與來自ETRS89/ETRS-LCC取出,所以沒有冰島並且還限幅在東方的限制)不指定任何投影:

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

Europe map without projection specified

如預期結果,正在使用這些限制,並由此產生地圖。

通過地圖默認使用的投影,按照幫助:

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

Europe map with projection specified

的結果是,它包括一個更大的區域意外(去很遠的北部和includi ng Russia),實質上使地圖無法使用。

有什麼奇怪的是,使用網格時,原來的限制明確認爲:

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

Europe map with LCC projection and grid

我想吃些什麼(什麼我以爲會是上面的代碼的結果)是一個矩形作物,其中包括我指定的限制(由於使用了投影因此比預期的矩形區域更多)。此外,地圖周圍還有一個空白區域,以及每當使用map()投影時都會出現的邊框。

問題是:在使用map/mapproj/maptools時有沒有這種方法?我試圖人爲地改變xlim/ylim而沒有好的結果,因爲它似乎在很大的時間間隔內工作(即改變它們不會產生效果,直到突然一半的歐洲隨着下一次遞減而消失)。

回答

1

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

似乎有一些失蹤行仍因xlimylim,除去將再次包括冰島等國家和島嶼。或者也許有更好的方法。

resulting plot

+0

乾杯,我已經接受,但忘了發表評論。這對我很有用,即使它確實有點冗長(但需要克服它的工作方式)。 @ alex-deckmyn的解釋更詳細地說明了爲什麼它以這種方式工作,但基本上與您的分析保持一致。 – fsmunoz

2

的基本行爲「地圖()」是提取XLIM和ylim內所有的線,而且還部分地在域中從數據庫中提取線。當沒有投影時,xlim和ylim也被用作圖的限制,但是當數據被投影時顯然不起作用。 (你不能簡單地投影xlim和ylim,因爲這不會是一個矩形域)。地圖代碼不夠複雜,無法找到一個很好的解決方案,只是將繪圖限制設置爲數據範圍(包括任何不需要的線)。作爲(近期)「地圖」的維護者,這實際上是我可能試圖解決的問題。不幸的是,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」也會使地圖上的寬高比保持正確。

+0

非常感謝您的回答,我理解現在更好的原因,這很有幫助。其實這是正確的,但爲了我的工作目的,我已經接受了@chkri。我從有人將它用於考古文章的角度對此進行研究,如果有更直接的方法可用,那將是非常好的。 – fsmunoz

+0

從地圖v3.2(2017年6月)開始,map()爲投影地圖上的限制強制實施了一個新選項lforce。默認值是「n」(無)「如果lforce =」e「,地圖數據在投影之前會嚴格限制在給定的限制範圍內,這會影響地圖的輸出值,而不僅僅是繪圖窗口。 「,由xlim和ylim定義的四個角被投影,並且繪圖窗被限制在該區域內的最大矩形,」l「將產生包含四個角的較大矩形,但是,限制可能不完整。 –